Monday, January 18, 2016

Android Tutorial: Use LeakCanary to detect memory leaks

Android Tutorial: Use LeakCanary to detect memory leaks - Hallo sahabat Google Android Developer Tutorial, Pada Artikel yang anda baca kali ini dengan judul Android Tutorial: Use LeakCanary to detect memory leaks, kami telah mempersiapkan artikel ini dengan baik untuk anda baca dan ambil informasi didalamnya. mudah-mudahan isi postingan Artikel android, Artikel leak, Artikel memory, yang kami tulis ini dapat anda pahami. baiklah, selamat membaca.

Judul : Android Tutorial: Use LeakCanary to detect memory leaks
link : Android Tutorial: Use LeakCanary to detect memory leaks

Baca juga


Android Tutorial: Use LeakCanary to detect memory leaks

Overview

The memory leak can be a headache to detect and to resolve, small memory leaks can be hidden and may be seen after a long usage of the application and hunting memory leaks is not a simple task.
In this tutorial we will create a leaked application and we will use the LeakCanary library to detect the memory leak.

Step 1: add the LeakCanary dependency to the application

Modify the app/build.gradle to add the LeakCanary dependency as follows:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}
view raw build.gradle hosted with ❤ by GitHub

Step 2: Extend and configure the Application class

We need to call LeakCanary.install in onCreate method:
package anaware.leakcanarysample;
import android.app.Application;
import android.content.Context;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
public class MyApplication extends Application {
private RefWatcher refWatcher;
public static RefWatcher getRefWatcher(Context context) {
MyApplication application = (MyApplication) context.getApplicationContext();
return application.refWatcher;
}
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
}

Step 3: Create a leaked activity

For this we will create a singleton class that saves the context:
package anaware.leakcanarysample;
import android.content.Context;
public class SingletonSavesContext {
private Context context;
private static SingletonSavesContext instance;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public static SingletonSavesContext getInstance() {
if (instance == null) {
instance = new SingletonSavesContext();
}
return instance;
}
}

Then, the main activity (leaked one), will use the singleton and then we'll go to a new activity:
package anaware.leakcanarysample;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.squareup.leakcanary.RefWatcher;
public class LeakedActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyAsyncTask().execute(this);
}
@Override
public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = MyApplication.getRefWatcher(this);
refWatcher.watch(this);
}
public class MyAsyncTask extends AsyncTask<Object, String, String> {
private Context context;
@Override
protected String doInBackground(Object... params) {
context = (Context)params[0];
// Invoke the leak!
SingletonSavesContext.getInstance().setContext(context);
// Simulate long running task
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
return "result";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Intent newActivity = new Intent(context, AnotherActivity.class);
startActivity(newActivity);
}
}
}

Then, in the new activity we'll call System.gc to force the garbage collector in order to accelerate the analysis.

Step 4: Retrieve the analysis result

A nice notification can be shown:

The result can be retrieved from logcat:
14211-16753/anaware.leakcanarysample D/LeakCanary: In anaware.leakcanarysample:1.0:1.
14211-16753/anaware.leakcanarysample D/LeakCanary: * anaware.leakcanarysample.LeakedActivity has leaked:
14211-16753/anaware.leakcanarysample D/LeakCanary: * GC ROOT static anaware.leakcanarysample.SingletonSavesContext.instance
14211-16753/anaware.leakcanarysample D/LeakCanary: * references anaware.leakcanarysample.SingletonSavesContext.context
14211-16753/anaware.leakcanarysample D/LeakCanary: * leaks anaware.leakcanarysample.LeakedActivity instance
14211-16753/anaware.leakcanarysample D/LeakCanary: * Reference Key: 226ffd5e-902c-4202-8508-2e268616e2ae
14211-16753/anaware.leakcanarysample D/LeakCanary: * Device: samsung samsung GT-I9305 m3xx
14211-16753/anaware.leakcanarysample D/LeakCanary: * Android Version: 4.4.4 API: 19 LeakCanary: 1.3.1
14211-16753/anaware.leakcanarysample D/LeakCanary: * Durations: watch=5007ms, gc=120ms, heap dump=617ms, analysis=13070ms
14211-16753/anaware.leakcanarysample D/LeakCanary: * Details:
14211-16753/anaware.leakcanarysample D/LeakCanary: * Class anaware.leakcanarysample.SingletonSavesContext
14211-16753/anaware.leakcanarysample D/LeakCanary: | static $staticOverhead = byte[] [id=0x42548e79;length=24;size=40]
14211-16753/anaware.leakcanarysample D/LeakCanary: | static instance = anaware.leakcanarysample.SingletonSavesContext [id=0x42548fb8]
14211-16753/anaware.leakcanarysample D/LeakCanary: * Instance of anaware.leakcanarysample.SingletonSavesContext
14211-16753/anaware.leakcanarysample D/LeakCanary: | static $staticOverhead = byte[] [id=0x42548e79;length=24;size=40]
14211-16753/anaware.leakcanarysample D/LeakCanary: | static instance = anaware.leakcanarysample.SingletonSavesContext [id=0x42548fb8]
14211-16753/anaware.leakcanarysample D/LeakCanary: | context = anaware.leakcanarysample.LeakedActivity [id=0x424ebbe8]

Source code

Complete source code of the sample can be found in Github.
Complete documentation of LeakCanary can be found in the following links:
https://corner.squareup.com/2015/05/leak-canary.html
https://github.com/square/leakcanary




Demikianlah Artikel Android Tutorial: Use LeakCanary to detect memory leaks

Sekianlah artikel Android Tutorial: Use LeakCanary to detect memory leaks kali ini, mudah-mudahan bisa memberi manfaat untuk anda semua. baiklah, sampai jumpa di postingan artikel lainnya.

Anda sekarang membaca artikel Android Tutorial: Use LeakCanary to detect memory leaks dengan alamat link https://googleandroiddevelopertutorial.blogspot.com/2016/01/android-tutorial-use-leakcanary-to.html

Artikel Terkait

Android Tutorial: Use LeakCanary to detect memory leaks
4/ 5
Oleh

Berlangganan

Suka dengan artikel di atas? Silakan berlangganan gratis via email