leak example java android memory-leaks leakcanary

java - example - Cómo utilizar Leak Canary



android memory leak detection (3)

He utilizado aquí en la aplicación

import android.content.Context; import android.support.multidex.MultiDex; import android.support.multidex.MultiDexApplication; import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.RefWatcher; import school.my.com.school.BuildConfig; public class AppController extends MultiDexApplication { private RefWatcher refWatcher; public static RefWatcher getRefWatcher(Context context) { AppController application = (AppController) context.getApplicationContext(); return application.refWatcher; } @Override public void onCreate() { super.onCreate(); if(BuildConfig.DEBUG) refWatcher = LeakCanary.install(this); } }

Puede utilizar aquí la aplicación en lugar de MultiDexApplication

Sé que esta es probablemente una pregunta tonta, pero soy bastante nuevo en el desarrollo de Android, y actualmente estoy experimentando un OutOfMemoryError en mis aplicaciones, que he intentado depurar usando MAT, pero aún es muy difícil encontrar la filtración en algunos Luego encontré LeakCanary, que parece más simple y fácil de usar, sin embargo, no pude encontrar ninguna guía para principiantes paso a paso sobre el uso de Leak Canary, incluso en Google. He instalado LeakCanary a través de las dependencias en mi build.gradle, y esto es lo que obtuve hasta ahora:

EjemploAplicación.java

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); } final class KeyedWeakReference extends WeakReference<Object> { public final String key; public final String name; KeyedWeakReference(Object referent, String key, String name, ReferenceQueue<Object> referenceQueue) { super(checkNotNull(referent, "referent"), checkNotNull(referenceQueue, "referenceQueue")); this.key = checkNotNull(key, "key"); this.name = checkNotNull(name, "name"); } } public void watch(Object watchedReference, String referenceName) { checkNotNull(watchedReference, "watchReference"); checkNotNull(referenceName, "referenceName"); if(debuggerControl.isDebuggerAttached()) { return; } final long watchStartNanoTime = System.nanoTime(); String key = UUID.randomUUID().toString(); retainedKeys.add(key); final KeyedWeakReference reference = new KeyedWeakReference(watchedReference, key, referenceName, queue); watchExecutor.execute() } }

Digamos que tengo una actividad en la que quiero que LeakCanary vea un objeto

SampleActivity.java

public class SampleActivity extends Activity implements View.OnClickListener { ImageView level001, level002; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.choose_level); level001 = (ImageView) findViewById(R.id.level001); level002 = (ImageView) findViewById(R.id.level002); // Do all kinds of function // How do I use LeakCanary to watch these objects ? } }

Ahora, ¿cómo uso LeakCanary para ver qué objeto está causando la pérdida de memoria? Gracias por su ayuda y asistencia.


Lo bueno de la filtración canaria es cómo funciona de forma automatizada. De forma predeterminada, ya "mira" las actividades que no se están realizando correctamente. Por lo tanto, fuera de la caja, si alguna actividad tiene fugas, debería recibir la notificación.

En mi proyecto he agregado un método adicional en la Application como este:

public class ExampleApplication extends Application { public static ExampleApplication instance; private RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); instance = this; refWatcher = LeakCanary.install(this); } public void mustDie(Object object) { if (refWatcher != null) { refWatcher.watch(object); } } }

así que lo importante con la recolección de basura, la pérdida de memoria y el canario es saber cuándo se deben recolectar las cosas y pedir que se mire ese elemento.

Por ejemplo, estamos usando un "fragmento base" con el siguiente código:

@Override public void onDestroy() { super.onDestroy(); ExampleApplication.instance.mustDie(this); }

De esta manera, LeakCanary está intentando verificar si algún fragmento está perdiendo memoria.

Por lo tanto, para que pueda implementar más en su aplicación, podría / debería en tareas o instancias que sabe que deberían recolectarse como basura, pero cree que no lo es, y no está seguro de dónde, también puede llamar a eso: ExampleApplication.instance.mustDie(object);

y luego DEBE ejecutar la aplicación, girar el dispositivo y forzar la fuga para que ocurra, de modo que el canario de fugas pueda agarrar / analizar el seguimiento de la pila y brindarle información valiosa sobre cómo solucionarlo.

Espero que ayude.


Tenía la misma pregunta sobre cómo usar LeakCanary. Solo quería ver un ejemplo básico de cómo lanzarlo y ver mi primer camino hacia un objeto filtrado.

Cómo usar LeakCanary

Aquí hay un ejemplo básico de cómo funciona LeakCanary:

Cómo usar LeakCanary (4 minutos 13 segundos)

Uno de los problemas que tuve que superar fue descubrir que tenía que iniciar la aplicación en el modo de ejecución normal en lugar del modo de depuración. También tuve que desviarme de las instrucciones básicas y configurar mi archivo build.gradle nivel de build.gradle la siguiente manera:

dependencies { debugImplementation ''com.squareup.leakcanary:leakcanary-android:1.5.4'' releaseImplementation ''com.squareup.leakcanary:leakcanary-android:1.5.4'' }

Creo que debugImplementation no me funcionó porque LeakCanary ignora la detección de fugas cuando realiza la depuración . Aunque LeakCanary dice que proporciona la versión "no-op" de su biblioteca para su lanzamiento , ya que la depuración no me funcionó, cambié la releaseImplementation la releaseImplementation anterior de com.squareup.leakcanary:leakcanary-android-no-op:1.5.4 a com.squareup.leakcanary:leakcanary-android:1.5.4 .

Como se puede ver en el video, otro problema con el que tuve que lidiar fue darle acceso de escritura a LeakCanary. Bajé el dedo y vi una notificación de LeakCanary que decía que no había podido obtener acceso de escritura ( más información ). Nunca vi la solicitud de permiso. Entonces, en un caso (que no se muestra en el video), le di a mi aplicación acceso de escritura yendo a la aplicación Configuración, encontrando mi aplicación (a diferencia de la aplicación llamada "LeakCanary" que instala LeakCanary), y activando el acceso de escritura. En el video no tuve que hacer eso porque di permiso al responder a la notificación. Luego, mientras uso mi aplicación, verifico periódicamente las nuevas notificaciones (deslizando hacia abajo). Vi mensajes como "XYZActivity filtró 217 KB". Hice tapping en eso y me llevó a esa aplicación de Leak.

Además, noté que, a veces, el análisis puede tardar unos minutos en completarse y mostrar una notificación de pérdida de memoria en su teléfono .

Cómo verificar una corrección de pérdida de memoria utilizando LeakCanary

Ahora que he arreglado algunas de las fugas de memoria, uso LeakCanary para verificar la solución. Sin embargo, si LeakCanary no informa nada, no necesariamente creo que eso se deba a que mi filtración está arreglada. Podría simplemente ser que LeakCanary está roto.

Cómo verificar una corrección de pérdida de memoria utilizando LeakCanary (16 minutos y 34 segundos)

Proceso para verificar la pérdida de memoria con LeakCanary: 1. Confirmar que existe una fuga de memoria usando LeakCanary 2. Arreglar la pérdida de memoria y confirmar que LeakCanary notifique que no haya fugas 3. Revertir su corrección y confirmar que LeakCanary reporta la pérdida nuevamente

Como LeakCanary muestra muy poca información de estado cuando está funcionando, es difícil saber si está haciendo algo. Esto me ha llevado a pensar que había corregido una pérdida de memoria cuando, de hecho, no lo había hecho. Los tres pasos anteriores son la mejor manera que he encontrado para verificar una solución de pérdida de memoria con LeakCanary.