2015-07-10 11 views
25

Ich versuche LeakCanary zu verwenden, um Speicherverluste in meiner App zu erkennen, aber es geht nicht weiter als die Meldung "Speicher ablegen, App wird eingefroren. Brrr." Ich habe ungefähr 20 Minuten oder so gewartet, aber keine Änderungen. Gleiches Verhalten auf diesen Geräten: 1. Asus Fonepad 8 (Android 5.0 Lager) 2. Sony Xperia SP (Android 5.1.1 CM 12.1 custom) 3. HTC Desire C (Android 4.4 CM 11 custom)Stuck bei "Dumping Speicher, App wird einfrieren. Brrr." Nachricht

I tat alles, als im Unterricht empfohlen:

public class ExampleApplication extends Application { 

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

Mit dem gleichen Problem, nicht sicher, wie es zu beheben ... –

+0

Das gleiche hier auf einem Nexus 5 mit Android M ... Hat es jemand geschafft, es seitdem zu beheben? – ChrisCarneiro

+0

nur einmal die Bibliothek arbeitete als angenommen und beendet in etwa 10 Sekunden Dumping. Ich habe dann LeakActivity geöffnet und festgestellt, dass die Hauptleckquelle ... LeakActivity oO –

Antwort

-2

Sie sollten die RefWatcher zu Ihrem Fragmente genausogut wie hinzufügen, was auf der Projektseite beschrieben: https://github.com/square/leakcanary

LeakCanary.install() eine Pre zurück Konfiguration roter RefWatcher. Außerdem wird ein ActivityRefWatcher installiert, der nach dem Aufruf von Activity.onDestroy() automatisch erkennt, ob eine Aktivität ausgelaufen ist.

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); 
    } 
} 

Sie konnten die RefWatcher verwenden für Fragment Lecks zu sehen:

public abstract class BaseFragment extends Fragment { 

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

Übrigens, wenn Sie den Heap Dump erhalten möchten, wenn Speicherverlust passiert ist, öffnen Sie einfach die Android Device Monitor aus Android Studio, und wählen Sie die Registerkarte "Datei-Explorer". Im Verzeichnis/mnt/shell/emulated/0/Download/leccanary/detected_leaks finden Sie alle Heap-Dump-Dateien.

enter image description here

+0

Dies beantwortet die Frage des OP nicht. –

+0

Bitte überprüfen Sie, ob der refWatcher korrekt in Fragmenten verwendet wird. Wenn nicht, kann man nicht sagen, ob ein Speicherleck wirklich passiert ist, weil die Meldung "Speicher ablegen, App wird eingefroren. Brrr." bedeutet nur ein "verdächtiges" Speicherleck mit einem Heap-Dump. – motou

+3

Entschuldigung, wenn ich falsch verstanden habe ... das OP erwähnte nichts speziell über Fragmente. In ihrem Fall (und auch bei mir) setzen wir nur die Zeile "LeakCanary.install (this)" in die Methode "Application # onCreate()' ". –

40

Wenn Sie auf Android M sind müssen Sie die „Schreib externen Speicher“ Erlaubnis erteilen oder Kanarienvogel Leck für eine lange Zeit mit der brrr Nachricht hängen wird. Klicken Sie in Ihrer App-Schublade lange auf den Launcher, um nach undichten Kanarienvogel zu suchen (so wie Sie ihn deinstallieren wollten) und ziehen Sie ihn zu "App-Info" und schalten Sie die Speicherberechtigung ein.

+3

Android M wird langsam zum Fluch meiner Existenz. Ich habe nicht einmal vermutet, dass dies das Problem sein würde, aber es war so. Es gibt ein offenes Problem auf GitHub, hoffentlich wird es in einer zukünftigen Version behoben. – CodyEngel

+4

@bsautner Dies ist in '1.4-beta1' Version von Leakcanary behoben. [Speichererlaubnis auf M behandeln] (https://github.com/square/leakcanary/commit/ea0af1d6be08ba4ac7eda913219456286ab0c4f8): 'Wenn ein potentielles Leck entdeckt wird, wenn die Speicherberechtigung fehlt, löschen wir das Leck und wir zeigen eine Benachrichtigung an. Diese Benachrichtigung zeigt dann den Erlaubnisdialog an.' – blizzard

+0

Was passiert, wenn ich nicht auf M bin und immer noch diesen Fehler bekomme? Ich habe eine App läuft auf L mit sowohl lesen und schreiben externe Speicherberechtigungen und sehen immer noch diese lästige Dialog. Irgendwelche Vorschläge? –