2015-07-10 17 views
25

Sto provando ad usare LeakCanary per rilevare perdite di memoria nella mia app, ma non va oltre il messaggio "Dumping memory, app freeze. Brrr." Ho aspettato circa 20 minuti o giù di lì, ma nessuna modifica. Stesso comportamento su questi dispositivi: 1. Asus Fonepad 8 (Android 5.0 magazzino) 2. Sony Xperia SP (Android 5.1.1 CM 12.1 personalizzato) 3. HTC Desire C (Android 4.4 cm 11 personalizzato)Bloccato in "Memorizzazione di memoria, l'app si blocca." messaggio

I ha fatto tutto come consigliato nella istruzioni:

public class ExampleApplication extends Application { 

    @Override public void onCreate() { 
    super.onCreate(); 
    LeakCanary.install(this); 
    } 
} 
+0

Avendo lo stesso problema, non so come risolverlo ... –

+0

Lo stesso qui su un Nexus 5 con Android M ... Qualcuno è riuscito a risolverlo da allora? – ChrisCarneiro

+0

solo una volta che la libreria ha funzionato come supposto e finito di dumping in circa 10 secondi. Ho aperto LeakActivity e ho scoperto che la principale fonte di perdite era ... LeakActivity oO –

risposta

-2

Si dovrebbe aggiungere il RefWatcher al frammento, così come ciò che è descritto nella pagina del progetto: https://github.com/square/leakcanary

LeakCanary.install() restituisce un pre configu Red RefWatcher. Installa anche un ActivityRefWatcher che rileva automaticamente se una attività perde dopo che è stato chiamato Activity.onDestroy().

public class ExampleApplication extends Application { 

    public static RefWatcher getRefWatcher(Context context) { 
    ExampleApplication application = (ExampleApplication) context.getApplicationContext(); 
    return application.refWatcher; 
    } 

    private RefWatcher refWatcher; 

    @Override public void onCreate() { 
    super.onCreate(); 
    refWatcher = LeakCanary.install(this); 
    } 
} 

È possibile utilizzare il RefWatcher a guardare per perdite frammento:

public abstract class BaseFragment extends Fragment { 

    @Override public void onDestroy() { 
    super.onDestroy(); 
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity()); 
    refWatcher.watch(this); 
    } 
} 

Inoltre, se si desidera ottenere il dump di heap quando perdita di memoria è successo, basta aprire il Monitor dispositivo Android da Android Studio e seleziona la scheda "Esplora file". Nella directory/mnt/shell/emulated/0/Download/leakcanary/detected_leaks, troverai tutti i file di heap dump.

enter image description here

+0

Questo non risponde alla domanda dell'OP. –

+0

Si prega di verificare se refWatcher è usato correttamente in Fragments. In caso contrario, non si può sapere se una perdita di memoria è realmente avvenuta, perché il messaggio "Dumping memory, app freeze. Brrr." significa solo una perdita di memoria "sospetta" con un dump dell'heap. – motou

+3

Scusate se sto fraintendendo ... l'OP non ha menzionato nulla in particolare su Fragments. Nel loro caso (e anche il mio), tutto ciò che stiamo facendo è mettere la riga 'LeakCanary.install (this)' nel metodo 'Application # onCreate()'. –

40

Se siete su Android M è necessario concedere l'autorizzazione "scrivere di archiviazione esterna" o perdite canarino appenderà per lungo tempo con il messaggio brrr. Nel cassetto delle tue app, fai un lungo clic sul launcher per individuare il canale di fuga (come se avessi intenzione di disinstallarlo) e trascina fino a "Info app" e attiva l'autorizzazione di archiviazione.

+3

Android M sta lentamente diventando la rovina della mia esistenza. Non sospettavo nemmeno che questo sarebbe stato il problema, ma lo era. C'è un problema aperto per questo su GitHub quindi spero che venga corretto in una versione futura. – CodyEngel

+4

@bsautner Questo è corretto nella versione '1.4-beta1' di Leakcanary. [Gestire l'autorizzazione di archiviazione su M] (https://github.com/square/leakcanary/commit/ea0af1d6be08ba4ac7eda913219456286ab0c4f8): 'Quando viene rilevata una potenziale perdita, se manca l'autorizzazione di archiviazione, eliminiamo la perdita e mostriamo una notifica. Quella notifica mostrerà quindi la finestra di dialogo delle autorizzazioni.' – blizzard

+0

Cosa succede se non sono su M e ottengo ancora questo errore? Ho un'app in esecuzione su L con entrambe le autorizzazioni di archiviazione esterne in lettura e scrittura e vedo ancora questa fastidiosa finestra di dialogo. Eventuali suggerimenti? –