原文地址:http://blog.csdn.net/jinzhuojun/article/details/18080871
有源码的情况当然好办,但没有源码想调bug或者想逆向怎么办。本文列举了Android下binary级的一些分析调试工具和方法。
Logcat: 很多时候logcat中找不到直接答案,但其中往往能得到继续分析的方向。logcat默认啥都输出在一起,合理用loglevel和filter来使输出更加易读。 参考: http://developer./tools/help/logcat.html
Java层静态分析 有两种方法:一种是用unzip解压apk包后用dex2jar(http://code.google.com/p/dex2jar/)和jd-gui(http://jd./)逆向成类似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命令等。
另外一些动态分析工具 Android作为一个Linux为内核的系统,自然在Linux下的那些动态分析工具大多都能用。如strace可以监视系统调用(如open, mmap等)和信号。tcpdump可以截获网络传输数据等。 /proc/pid/目录下提供了该进程丰富的OS级运行时信息,如maps文件显示进程的虚拟地址空间映射信息,status有内存使用等信息,cmdline和exe可以看到该进程对应的执行文件。net, fd, task目录分别可以看网络,文件,线程信息等。 /data/tombstones/:程序由于错误退出后的“墓碑”,里面记录着程序的“死相”。
Settings->Developer Options:里面有一坨调试分析工具。像显示触摸点坐标和显示应用Layout等功能,都是很实用的。 SDK中的tools/monitor,以前叫DDMS,里面可以看内存,线程,网络等信息,还包括了截图等实用功能。参考: http://developer./tools/debugging/ddms.html http://developer./tools/debugging/debugging-memory.html dumpsys 命令不仅可以输出很多系统信息(如硬件参数等),后面加service名(如SurfaceFlinger)还可以看service的运行时状态。 Dev Tools App包含了一些调试分析功能,其实很多都被移到Developer Options里了。参考: http://developer./tools/debugging/debugging-devtools.html Android Emulator:优点是从模拟硬件到API实现都可以改。缺点是arm版本慢且OpenGLES支持稍差,所以不少游戏不能跑。x86版本由于可以虚拟化会快些,另外打开gpu on还可以使用host上的gpu来提高gpu性能。 SDK中的hierarchyviewer可用于分析UI。参考:http://developer./tools/help/hierarchy-viewer.html
性能分析工具 都是profiling工具: systrace,参考:http://developer./tools/help/systrace.html Traceview,参考:http://developer./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./tools/help/gltracer.html Settings->Developer Options里Enable OpenGL traces,可以在logcat里输出。优点是快,缺点是输出不直观。
一些辅助调试的Android App Busybox:默认的adb shell功能弱爆了,这个可以让开发者找回一点用Linux的感觉。 Terminal:不用host直接在guest设备就可以用的Android shell。 |
|