LeakCanary在Android 10設備上的提示Activity(IRequestFinishCallback$Stub)內存泄露問題

在Android 10的設備上開發應用,使用LeakCanary對應用進行內存泄露檢查,發現在activity中點擊返回鍵回到桌面,會發現LeakCanary觸發了一個內存泄露的提示,大致如下圖所示:

在LeakCanary中也有相關的提示,大致意思就是:在Adnroid Q及之後的Android版本在Activity中添加了一個名爲IRequestFinishCallback的匿名內部類,在當Activity調用了onDestory後,IRequestFinishCallback的引用還在被其他進程所回調,所以這裏會導致Activity無法正常釋放,從而造成的了內存泄露。

其他這裏LeakCanary也大致描述的很清楚,所以接下來我們直接看下Android 10的源代碼,看下是否如LeakCanary所描述。

Activity的源代碼位置:

../frameworks/base/core/java/android/app/Activity.java
1
我們直接看關鍵方法:onBackPressed()

看到此處源碼時,相信大部分人就很明白了——這裏是一個典型的Handler造成Activity泄露的問題。匿名AIDL回調中引用了mHandler這個內部變量,當onDestory()調用後,mHandler則繼續被引用導致Activty無法正常釋放,從而導致了泄露。

在Android的問題反饋論壇也有該問題的相關信息的反饋,Google也確定了這個問題是Android的一個BUG會再將來的版本進行修復。

[Android Q Beta] Memory leak in IRequestFinishCallback$Stub

在筆者寫這篇博客的時候(2020-10),Google已經對該問題進行了修復,可以再看下修改之後的方法。


那麼如果作爲一般應用開發者,無法接觸源碼如何解決這個問題呢?

一般的方法就是直接在Activity重寫onBackPressed()方法,不用super.onBackPressed(),直接調用finishAfterTransition()就行了。
————————————————
版權聲明:本文爲CSDN博主「湯姆貓的薛定諤」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/oLengYueZa/article/details/109207492

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章