第六章 动态分析 Android 程序(三)(使用 JDB 动态调试 APK)
文章目录
使用 JDB 动态调试 APK
- JDK 提供的 JDB 调试器是动态调试 Java 程序的标准工具。Android 系统的虚拟机实现了 Java 调试的 JDWP 通信协议
- 实例:GitHub
步骤
-
确定 APK 的 AndroidManifest.xml 中的 Application 标签的
android:debuggable
为true
。若没有此项或为false
,则系统的ro.debuggable
属性必须为 1,否则,对此 APK 的动态调试将失败。可通过如下方法开启调试支持:- 使用 Android SDK 模拟器:SDK 中的模拟器默认的
ro.debuggable
属性为 1,即使安装的 APK 属性为android:debuggable="false"
,也可直接动态调试 - Root 并修改 Android 设备:对 Root 过的 Android 设备,可动手修改其
ro.debuggable
属性为 1,开启对所有 APK 的动态调试支持 - Root Android 设备后安装调试支持的插件:网上已有人编写可开启所有 APK 调试的 Xposed 插件
- 重新打包 APK:改 AndroidManifest.xml 中的上述属性后重新打包即可
- 使用 Android SDK 模拟器:SDK 中的模拟器默认的
-
确定可调试后,执行命令以调试模式启动 APK:
adb shell am start -D -n com.droider.methodprofiling/.MainActivity
-
对 Android 设备进行端口转发
- 可用
adb forward
命令 - 更简单做法:打开 Device Monitor,让它自动完成端口转发
- 可用
-
执行命令,连接处于调试状态的程序:
jdb -connect com.sun.jdi.SocketAttach:port=8601,hostname=127.0.0.1
-
上述命令执行成功后,即与调试器建立连接
-
执行调试命令调试程序(输入 help 可查看能使用的调试命令)
总结
- JDB 调试程序以 Java 代码行为单位,在调试 APK 时只能 Dump 当前中断的变量和堆栈信息,不能很好地显示单步执行状态下的变量信息
- 推荐使用其他工具