第六章 动态分析 Android 程序(三)(使用 JDB 动态调试 APK)

使用 JDB 动态调试 APK

  • JDK 提供的 JDB 调试器是动态调试 Java 程序的标准工具。Android 系统的虚拟机实现了 Java 调试的 JDWP 通信协议
  • 实例:GitHub

步骤

  • 确定 APK 的 AndroidManifest.xml 中的 Application 标签的 android:debuggabletrue。若没有此项或为 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 中的上述属性后重新打包即可
  • 确定可调试后,执行命令以调试模式启动 APK:adb shell am start -D -n com.droider.methodprofiling/.MainActivity

  • 对 Android 设备进行端口转发

    • 可用 adb forward 命令
    • 更简单做法:打开 Device Monitor,让它自动完成端口转发
      第六章 动态分析 Android 程序(三)(使用 JDB 动态调试 APK)
  • 执行命令,连接处于调试状态的程序:jdb -connect com.sun.jdi.SocketAttach:port=8601,hostname=127.0.0.1

  • 上述命令执行成功后,即与调试器建立连接
    第六章 动态分析 Android 程序(三)(使用 JDB 动态调试 APK)

  • 执行调试命令调试程序(输入 help 可查看能使用的调试命令)


总结

  • JDB 调试程序以 Java 代码行为单位,在调试 APK 时只能 Dump 当前中断的变量和堆栈信息,不能很好地显示单步执行状态下的变量信息
  • 推荐使用其他工具