[√]Android内存泄露排查

464 阅读1分钟

leakcanary

最新的2.x只需要在build.gradle里面集成即可,这玩意是检测java层内存泄露的

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

当安装完毕集成了leancanary的app后,会在手机桌面上同时安装一个新的app

image.png

这是为你app的专属leaks,打开leaks,dump heap now

image.png

实际发现这玩意并不能很好的检测到c++的内存泄露问题

其他

  • AddressSanitizer(ASan): 内存地址越界检查(其实包括了内存泄漏检查)
  • LeakSanitizer(LSan): 内存泄漏检查,可以单独使用
  • UndefinedBehaviorSanitizer (UBSsan): 未定义行为检查
  • ThreadSanitizer (TSan): 线程安全检查
  • MemorySanitizer (MSan): 内存分配检查

以上这些工具都是clang/clang++编译器自带的,他们位于llvm项目的一个子项目Sanitizer中。

Address Sanitizer

Address Sanitizer从 API 级别 27 (Android O MR 1) 开始,Android NDK 可支持 Address Sanitizer(也称为 ASan)。

项目使用的NDK R15C,不太行这种办法

 compileSdkVersion 29 # 高于27
    buildToolsVersion '26.0.2'
    useLibrary 'org.apache.http.legacy'
    defaultConfig {
        applicationId "com.caohua.tank5"
        minSdkVersion 14 # 低于27
        targetSdkVersion PROP_TARGET_SDK_VERSION
        versionCode 1
        versionName "1.0"

image.png

LeakTracer

只能用于Android内存泄露检测,不能用于Window