Leak Canary برای شناسایی نشت حافظه در اندروید


کتابخانه Leak Canary برای شناسایی منشا نشت حافظه در اندروید

Leak Canary چیست؟

Canary یک کتابخانه متن باز است که با هدف تشخیص نشت حافظه در اندروید، توسطSquare توسعه یافته است.پیشتر در این مقاله به چگونگی و چرایی نشت حافظه پرداخته ایم. در این مقاله نیز به بررسی شناخت منبع نشت حافظه در برنامه، به کمک کتابخانه Leak Canary می پردازیم.

کتابخانه Leak Canary به سادگی روی پروژه شما ست شده و موجب تشخیص دلیل نشت حافظه در برنامه مورد نظر خواهد شد.

مثالی از چگونگی ایجاد نشت حافظه

کدهای بسیاری منجر به نشت حافظه می گردند. اما یکی از متداول ترین آنها این است که درون thread پس زمینه یک ارجاع به view داشته باشیم. به مثال زیر توجه نمایید :

public class MainActivity extends AppCompatActivity {



private TextView mTextView;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTextView = findViewById(R.id.textview);



MyAsyncTask myAsyncTask = new MyAsyncTask(mTextView);

myAsyncTask.execute();

}



private class MyAsyncTask extends AsyncTask<Void, Void, Void>{



private TextView textViewReference;



public MyAsyncTask(TextView textView) {

this.textViewReference = textView;

}



@Override

protected Void doInBackground(Void... voids) {



try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return null;

}





@Override

protected void onPostExecute(Void aVoid) {

super.onPostExecute(aVoid);

textViewReference.setText("some text");

}

}

}

همان طور که مشاهده می کنید این اکتیویتی شامل یک textView ست. یک کلاس از نوع inner در این اکتیویتی به نام MyAsyncTask وجود دارد که از کلاس AsynkTask ارث بری می کند. توجه کنید که این کلاس درونی ارجاعی به textView اکتیویتی در خود دارد. درون متد onPostExecute عملیات setText روی همان textView صورت گرفته است. این دقیقا همان کاری ست که هرگز نباید انجام داد.

بطور کلی نباید ارجاعی به context را درون اکتیویتی نگه داشت. چرا که به هر دلیلی اگر آن thread پس زمینه کار خود را ادامه دهد، این ارجاع توسط garbage collector ردیابی نخواهد شد.

Leak Canary چگونه عمل می کند؟

کتابخانه Leak Canary به شناسایی objectهایی را شناسایی می کند که دیگر نیازی به آنها نیست اما از بین نرفته اند.  هم چنین زنجیره ای از ارجاع هایی را جستجو می کند که موجب شده اند تا garbage collector نتواند این object ها را شناسایی کند. اگر منشا memory leak پیدا شود leak canary با notification اعلام می کند. کافی ست با کلیک روی این اعلان اطلاعات بیشتری از شناسایی منشا را مشاهده نمایید.

با همین روش می توانید علت را یافته و کد را بازنویسی نمایید.

پیاده سازی کتابخانه Leak Canary

قدم اول : افزودن dependencyها

با توجه به این صفحه در گیت هاب، dependencyهای لازم را به قسمت build.gradle اضافه کنید:

debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'

releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
قدم دوم : ساخت کلاسی که از Application ارث بری کند.
public class MyApplication extends Application {



@Override 

public void onCreate() { 

super.onCreate();

if (LeakCanary.isInAnalyzerProcess(this)) {

return;

}

LeakCanary.install(this);

}

}

سپس خواهید دید که با ارائه notification شما را متوجه منبع نشت حافظه خواهد نمود. توجه داشته باشید این کتابخانه صرفا به یافتن منشا memory leak کمک می کند. اما برطرف کردن این منابع بحث دیگری ست که در این مقاله به برخی از آنها پرداخته ایم.

به این پست امتیاز دهید

روی ستاره های کلیک کنید و امتیاز بدید

میانگین امتیاز 5 / 5. تعداد: 1

از امتیاز شما متشکریم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Enter Captcha Here : *

Reload Image