原文地址:http://blog.csdn.net/jinzhuojun/article/details/18080871
有源码的情况当然好办,但没有源码想调bug或者想逆向怎么办。本文列举了Android下binary级的一些分析调试工具和方法。
Logcat:
很多时候logcat中找不到直接答案,但其中往往能得到继续分析的方向。logcat默认啥都输出在一起,合理用loglevel和filter来使输出更加易读。
参考:
http://developer.android.com/tools/help/logcat.html
http://developer.android.com/tools/debugging/debugging-log.html
Java层静态分析
有两种方法:一种是用unzip解压apk包后用dex2jar(http://code.google.com/p/dex2jar/)和jd-gui(http://jd.benow.ca/)逆向成类似Java源码的形式,但毕竟是逆向出来的,经不起细看。有些部分还会出现错误逆向不出来。总体来说适合略读缩小范围。另一种是用Android apktool(http://code.google.com/p/android-apktool/)。这样解压出来的资源和配置文件更可读。如AndroidManifest.xml是可读的,而不像前一种方法解出来是乱码。同时java的代码是smali code形式。smali code比逆向出来的东西更准确,适合精读。
apktool的好处是解压完了还可以压回成apk。有时候应用里其实是有个全局变量(比如叫enable_debug的布尔变量)控制着调试输出的。只要先解压,在smali code中把它设为true,再重新打包回去就能在logcat里看到输出了。注意改了之后打包回去后需要签名http://blog.csdn.net/jinzhuojun/article/details/7654835,否则安装会出错。
参考:Android中apk包的反汇编( http://blog.csdn.net/ariesjzj/article/details/7311340)
Java层动态分析:
jdb可以设断点,改变量,查看类信息等等。
参考: Android下的JDB调试 (http://blog.csdn.net/jinzhuojun/article/details/7399249)
Native层静态分析
自然是Binutils套件了,如objdump,readelf等都是利器。For arm版的在Android源码的prebuilts目录中,嫌大也可以单独下。
Native层动态分析
gdb:不解释,码农界永远的神器。参考: Android下用gdb进行系统级源码调试(http://blog.csdn.net/jinzhuojun/article/details/7375048)
像Mono这样的JIT引擎会动态生成代码,而这些动态生成的代码用静态分析手段是看不到的。但可以用gdb来看,用disassemble或x/ni命令等。
有时候程序一起来就隔儿掉,这时可以用双调试器调试法。先用jdb停住(配合Settings->Developer Options里的Wait for debugger选项),用gdb连上设好断点,再在jdb里继续。参考: Android下双调试器(gdb+jdb)调试应用程序(http://blog.csdn.net/ariesjzj/article/details/7402832)
另外一些动态分析工具
Android作为一个Linux为内核的系统,自然在Linux下的那些动态分析工具大多都能用。如strace可以监视系统调用(如open, mmap等)和信号。tcpdump可以截获网络传输数据等。
/proc/pid/目录下提供了该进程丰富的OS级运行时信息,如maps文件显示进程的虚拟地址空间映射信息,status有内存使用等信息,cmdline和exe可以看到该进程对应的执行文件。net, fd, task目录分别可以看网络,文件,线程信息等。
/data/tombstones/:程序由于错误退出后的“墓碑”,里面记录着程序的“死相”。
Android自带的分析调试工具
Settings->Developer Options:里面有一坨调试分析工具。像显示触摸点坐标和显示应用Layout等功能,都是很实用的。
SDK中的tools/monitor,以前叫DDMS,里面可以看内存,线程,网络等信息,还包括了截图等实用功能。参考:
http://developer.android.com/tools/debugging/ddms.html
http://developer.android.com/tools/debugging/debugging-memory.html
dumpsys 命令不仅可以输出很多系统信息(如硬件参数等),后面加service名(如SurfaceFlinger)还可以看service的运行时状态。
Dev Tools App包含了一些调试分析功能,其实很多都被移到Developer Options里了。参考: http://developer.android.com/tools/debugging/debugging-devtools.html
Android Emulator:优点是从模拟硬件到API实现都可以改。缺点是arm版本慢且OpenGLES支持稍差,所以不少游戏不能跑。x86版本由于可以虚拟化会快些,另外打开gpu on还可以使用host上的gpu来提高gpu性能。
SDK中的hierarchyviewer可用于分析UI。参考:http://developer.android.com/tools/help/hierarchy-viewer.html
性能分析工具
都是profiling工具:
systrace,参考:http://developer.android.com/tools/help/systrace.html
Traceview,参考:http://developer.android.com/tools/debugging/debugging-tracing.html
Oprofile,参考:http://blog.csdn.net/dongjun7357/article/details/6400549
另外应用来不及响应会产生ANR,log位于/data/anr/trace.txt。
OpenGL渲染分析
OpenGL ES tracer:截获所有OpenGL调用。缺点是慢,优点是直观,每一帧,每一条GL命令都有对应的结果图像,因此很容易找出是哪条GL命令出了问题。参考:http://developer.android.com/tools/help/gltracer.html
Settings->Developer Options里Enable OpenGL traces,可以在logcat里输出。优点是快,缺点是输出不直观。
一些辅助调试的Android App
Busybox:默认的adb shell功能弱爆了,这个可以让开发者找回一点用Linux的感觉。
Terminal:不用host直接在guest设备就可以用的Android shell。