Android平台的动态调试一直以来是个困扰我等Coder的头疼问题,特别是对于本地的动态调试支持,可以说是“弱智”级别的,不知道Google的新版NDK和新出的Android Studio对这块支持如何,让我们拭目以待。
言归正传,我这里采用的是cygwin+ndk-gdb的调试模式,灵感来自于XDA的一篇博文(点击打开链接),平台和原文作者不同:
1、Win7 64
2、NDK r9d x86_64
3、Android 4.2.2
4、cygwin 64
5、IDA pro 6.1
话不多话,开始正题,调试步骤如下:
1、环境搭建这类的各位可以自行Google之,这里就不多说了。
2、首先我们随便找个网站,下载游戏的APK包。Android的APK包的正式发布版本是取消了debug属性的,在调试之前,我们还需要做些准备工作。
3、用apktool解包apk文件,然后修改AndroidManifest.xml,在重新打包,再用signapk签名。
4、为ndk-gdb调试做准备工作,这个上面那篇博文已经写得很详细,这里不再赘述。说明一点:我们调试的目标是.\libs\armeabi\libgame.so,这个so是游戏主库文件。
准备好后的目录结构大致如下:
5、好了,准备工作完毕,开始我们的调试之旅!
首先,安装我们重新打包的apk到手机,然后进入cygwin shell,进入本地的游戏解包后的目录。这里要重点说明一点:由于一些兼容性问题,我们不能直接使用google原来的ndk-gdb调试脚本,需要做一些修改:
我这里直接给DATA_DIR赋值为app目录:/data/data/com.umonistudio.tile。这步骤很重要,否则你会遇到run-as之类的错误,导致无法继续调试!
好了,终于准备完毕了,切换到cygwin shell,开始调试,如果没有问题的话,就会顺利进入gdb提示符,我的输出如下:
$ ndk-gdb --verbose --start --nowait
Android NDK installation path: /cygdrive/e/Tools/android-ndk-r9d-windows-x86_64/ android-ndk-r9d
Using default adb command: /cygdrive/e/Tools/adt-bundle-windows-x86_64-20131030/ adt-bundle-windows-x86_64-20131030/sdk/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.31
Using ADB flags:
Using JDB command: /cygdrive/e/Tools/Java/jdk1.7.0_15/bin/jdb
Using auto-detected project path: .
Found package name: com.umonistudio.tile
ABIs targetted by application: armeabi
Device API Level: 17
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi
Using gdb setup init: ./libs/armeabi/gdb.setup
Using toolchain prefix: /cygdrive/e/Tools/android-ndk-r9d-windows-x86_64/android-ndk-r9
Using app out directory: ./obj/local/armeabi
Found debuggable flag: true
Found data directory: '/data/data/com.umonistudio.tile'
Found device gdbserver: /data/data/com.umonistudio.tile/lib/gdbserver
Found first launchable activity: .tile
Launching activity: com.umonistudio.tile/.tile
## COMMAND: adb_cmd shell am start -n com.umonistudio.tile/.tile
Starting: Intent { cmp=com.umonistudio.tile/.tile }
## COMMAND: adb_cmd shell sleep 2
Found running PID: 8706
Launched gdbserver succesfully.
Setup