Android下开发程序我一直认为是一件非常恶心的事情,特别是JNI开发,(或许是本人水平太差了)反正从以往来看,嵌入式开发中的调试都是一个难点。基本上都是一台主机比如Linux,然后另外的嵌入式平台,通过类似于TCP连接的东西,传输调试信息。
关于Android调试,网上有很多的文章, 但是我个人总觉得不是非常地好理解。
所以这里介绍一个例子,希望能对大家有所帮助。例子来源于Qgis工程,这是一个开源软件。这里面有一个用于debug的脚本,参考https://github.com/qgis/QGIS-Android/blob/master/scripts/debug-apk.sh
但是这个还挺麻烦的,不是太好理解。
OK我把里面的脚本搞出来:
/home/along/necessitas/android-sdk/platform-tools/adb shell am start -n org.qgis.qgis/org.kde.necessitas.origo.QgisActivity
/home/along/necessitas/android-sdk/platform-tools/adb pull /system/bin/app_process /home/along/src/qgis/qgis-android/tmp/app_process
/home/along/necessitas/android-sdk/platform-tools/adb pull /system/bin/linker /home/along/src/qgis/qgis-android/tmp/linker
/home/along/necessitas/android-sdk/platform-tools/adb pull /system/lib/libc.so /home/along/src/qgis/qgis-android/tmp/libc.so
echo `/home/along/necessitas/android-sdk/platform-tools/adb shell top -n 1 | grep org.qgis.qgis`
第一步就是启动Android上的程序 org.qgis.qgis
第二步把上面的一些文件给拉下来,用于调试
第三步找到org.qgis.qgis的进程ID号,在下面有用
/home/along/necessitas/android-sdk/platform-tools/adb forward tcp:5039 localfilesystem:/data/data/org.qgis.qgis/debug-pipe
/home/along/necessitas/android-sdk/platform-tools/adb shell run-as org.qgis.qgis /data/data/org.qgis.qgis/lib/gdbserver +debug-pipe --attach PID &
/home/along/necessitas/android-9-standalonetoolchain/bin/arm-linux-androideabi-gdb -x /home/along/src/qgis/qgis-android/tmp/gdb.setup
再看,
第四步,启动调试桥
第五步,attach PID, 这个地方注意, 执行的时候,把PID换成上面查找出来的进程ID号。后面的 & 不能少指的是运行后转入后台。
第六步,让gdb执行一些命令,命令文件/home/along/src/qgis/qgis-android/tmp/gdb.setup如下所示:
file /home/along/src/qgis/android/tmp/app_process
target remote :5039
set solib-search-path /home/along/src/qgis/android/apk/libs/armeabi-v7a
directory /home/along/android-ndk/android-9-standalonetoolchain/sysroot/usr/include /home/along/src/qgis/master/src /home/along/src/qgis/android/src
break QgisApp::QgisApp
这个其实就是指定让gdb去哪些目录下搜索调试中用到的.so库文件,以及.cpp所在的路径。
然后在QgisApp这个类的构建函数停下来。
如果软件出了bug挂了,然后执行backtrace 回退查看函数调用堆栈。
如果软件刚开始就挂了,还是看LOG吧。
看LOG的方法,可以用eclipse,也可以用以下的脚本:里面定义了一些变量,请把他变成你需要的
set -e
ADB=<span style="font-family: Arial, Helvetica, sans-serif;">/home/along/necessitas/android-sdk/platform-tools/adb</span>
$ADB kill-server
$ADB devices
echo "" > /tmp/logcat.log
gnome-system-log /tmp/logcat.log &
$ADB logcat -c
$ADB shell am force-stop org.qgis.qgis
$ADB shell am start -n org.qgis.qgis/org.kde.necessitas.origo.qgisActivity
$ADB logcat | tee /tmp/logcat.log
参考:
http://blog.chinaunix.net/uid-24439730-id-357096.html
Android系统中调试动态链接库so文件的步骤
http://www.360doc.com/content/12/1114/19/10388890_247863542.shtml
http://blog.csdn.net/eqera/article/details/20230671
Android中用gdb调试一启动就崩溃的程序:
http://blog.csdn.net/jinzhuojun/article/details/7393573