如何重新编译Android APK并植入LeakCanary以检测内存泄漏?
无源码APK集成LeakCanary进行内存泄漏分析
前置工具准备
- Apktool:用于APK的反编译与回编译
- LeakCanary的aar包:从Maven仓库下载对应版本的
leakcanary-android库 - 签名工具:如
apksigner或jarsigner,用于签名回编译后的APK - Android SDK:提供
adb和dx工具
具体操作步骤
1. 反编译目标APK
执行命令将目标APK反编译到本地目录:
apktool d target.apk -o target-decompiled
2. 引入LeakCanary依赖
- 下载对应版本的LeakCanary aar包,解压后提取其中的
classes.dex,放到反编译目录的lib/文件夹(无则新建)。 - 或者用Android SDK的
dx工具将aar转为dex:
dx --dex --output=leakcanary.dex leakcanary-android-x.x.x.aar
将生成的leakcanary.dex移入target-decompiled/lib/目录。
3. 修改Application类(核心步骤)
- 查看反编译目录下的
AndroidManifest.xml,找到application标签的android:name属性,确定原应用的自定义Application类(如com.example.MyApp)。 - 进入对应smali文件目录(如
target-decompiled/smali/com/example/MyApp.smali),修改代码:- 若原Application已有
onCreate方法,在方法开头添加LeakCanary初始化代码:invoke-static {}, Lcom/squareup/leakcanary/LeakCanary;->install(Landroid/app/Application;)Lcom/squareup/leakcanary/RefWatcher; move-result-object v0 - 若原Application无
onCreate方法,直接添加该方法并插入上述初始化代码。
- 若原Application已有
- 若原应用无自定义Application,直接修改
AndroidManifest.xml的application标签,设置android:name="com.squareup.leakcanary.LeakCanaryApplication"。
4. 回编译APK
将修改后的目录重新编译为APK:
apktool b target-decompiled -o modified-target.apk
5. 签名APK
回编译后的APK未签名,需签名才能安装:
- 用
apksigner(推荐支持V2签名):
apksigner sign --ks your-keystore.jks modified-target.apk
- 或用
jarsigner:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your-keystore.jks modified-target.apk alias-name
6. 安装测试
- 安装签名后的APK:
adb install -r modified-target.apk
- 打开应用后,LeakCanary会自动运行,检测到内存泄漏时会在通知栏弹出提示,点击即可查看泄漏详情。
注意事项
- 确保LeakCanary版本与目标APK的
minSdkVersion兼容。 - 加固过的APK需先脱壳才能进行反编译操作。
- 修改smali代码时需注意语法正确性,可通过Apktool的报错信息排查问题。
内容的提问来源于stack exchange,提问作者RexSolus
相关产品推荐
相关产品推荐

