Android Native內(nèi)存泄露檢測

Android Studio沒有提供直接的Native層的內(nèi)存泄露檢測工具,但我們?nèi)钥梢酝ㄟ^開源工具進行動態(tài)檢測靜態(tài)檢測

動態(tài)檢測

在APP運行時進行檢測,就像LeakCanary

Update: LeakTracer只能在簡單的場景下檢測Native層代碼;復(fù)雜項目,比如依賴多個native module, 或者依賴其他module的native代碼,或者依賴的不是Native代碼而是so庫,就容易出現(xiàn)漏報誤報的情況。所以目前還沒發(fā)魯棒性較強的動態(tài)檢測內(nèi)存泄露的工具,歡迎推薦~

使用方法:
1.調(diào)用leaktracer::MemoryTrace::GetInstance().startMonitoringAllThreads();表示開始檢測;

2.調(diào)用
leaktracer::MemoryTrace::GetInstance().writeLeaks(out);表示結(jié)束檢測。
記得給予APP文件讀寫權(quán)限,不然會write失敗。

3.將文件拿到手:
adb pull /sdcard/leaktracer.log
leaktracer.log文件包含泄露時間(time以秒為單位)、調(diào)用堆棧的地址信息、內(nèi)存泄漏的大小等:

# LeakTracer report diff_utc_mono=1496511718.682943
leak, time=135120.534718, stack=0x36fd6 0x35a90 0x359a4 0x32fea 0xc952d3d0, size=1, data=.....
  1. 使用
    leak-analyze-addr2line腳本批量定位
    或者
    Android JNI Crash定位步驟的步驟定位泄露的具體位置
    其中l(wèi)ibleaktracer部分的泄露提示是可以忽略的,只需要關(guān)注項目自身部分。
    注意: 一定要用未strip的so文件,不然堆棧信息會是問號

demo github地址: AndroidLeakTracerExample

使用tip:
開始檢測前請先殺掉APP進程, 然后重啟APP, 不然連續(xù)檢測時, 后面的檢測結(jié)果會不準(zhǔn).

  • Android原生開發(fā)--用Valgrind排查內(nèi)存問題
    文章里的工具我在兩臺root的小米設(shè)備上都沒有弄成功;
    另一個Valdroid項目我在一臺root的小米設(shè)備上運行成功了,但是卻沒有打印日志。大概是因為這個項目是14年的,目前的手機很多配置和之前不一樣了,所以不再適用。
    感覺即使工具運行成功了,最后能不能有效檢測出問題也不確定,所以先暫時放一邊。畢竟實踐的人少,而且谷歌也已經(jīng)棄用不推薦了,肯定坑也多。

  • CheckJNI
    11年就出品的工具,網(wǎng)上有一些資料,接入也不算麻煩。但一直沒火起來還是有原因的:
    我寫了幾號數(shù)組越界的代碼,要么直接Crash,要么沒檢測出來,接了和沒接一樣,攤手.jpg

靜態(tài)檢測

有人推薦cppcheck
安裝使用倒挺簡單的, 但我故意寫了內(nèi)存泄露的代碼

short*  buffer  =   new short[8];

卻沒有檢測出來。網(wǎng)上搜了一下,有人說
cppcheck is essentially only a style-checker

然后又試了一下valgrind
仍然沒效果。
也可能是cppcheck和valgrind能檢測出部分的代碼錯誤,但不保證所有錯誤都檢測出來,那檢測一下也沒壞處。

其他參考:
Android內(nèi)存泄漏簡介
Android native內(nèi)存檢測(asan/malloc_debug)

Tip:
8.0以后Bitmap對象的內(nèi)存放到Native里了。要及時回收Native 內(nèi)存,需要調(diào)用一下Bitmap.recycle方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容