原文地址:http://blog.csdn.net/jinzhuojun/article/details/18080871
有源碼的情況當(dāng)然好辦,但沒有源碼想調(diào)bug或者想逆向怎么辦。本文列舉了Android下binary級(jí)的一些分析調(diào)試工具和方法。
Logcat: 很多時(shí)候logcat中找不到直接答案,但其中往往能得到繼續(xù)分析的方向。logcat默認(rèn)啥都輸出在一起,合理用loglevel和filter來使輸出更加易讀。 參考: http://developer./tools/help/logcat.html
Java層靜態(tài)分析 有兩種方法:一種是用unzip解壓apk包后用dex2jar(http://code.google.com/p/dex2jar/)和jd-gui(http://jd./)逆向成類似Java源碼的形式,但畢竟是逆向出來的,經(jīng)不起細(xì)看。有些部分還會(huì)出現(xiàn)錯(cuò)誤逆向不出來??傮w來說適合略讀縮小范圍。另一種是用Android apktool(http://code.google.com/p/android-apktool/)。這樣解壓出來的資源和配置文件更可讀。如AndroidManifest.xml是可讀的,而不像前一種方法解出來是亂碼。同時(shí)java的代碼是smali code形式。smali code比逆向出來的東西更準(zhǔn)確,適合精讀。 apktool的好處是解壓完了還可以壓回成apk。有時(shí)候應(yīng)用里其實(shí)是有個(gè)全局變量(比如叫enable_debug的布爾變量)控制著調(diào)試輸出的。只要先解壓,在smali code中把它設(shè)為true,再重新打包回去就能在logcat里看到輸出了。注意改了之后打包回去后需要簽名http://blog.csdn.net/jinzhuojun/article/details/7654835,否則安裝會(huì)出錯(cuò)。 參考:Android中apk包的反匯編( http://blog.csdn.net/ariesjzj/article/details/7311340)
Java層動(dòng)態(tài)分析: jdb可以設(shè)斷點(diǎn),改變量,查看類信息等等。 參考: Android下的JDB調(diào)試 (http://blog.csdn.net/jinzhuojun/article/details/7399249)
Native層靜態(tài)分析 自然是Binutils套件了,如objdump,readelf等都是利器。For arm版的在Android源碼的prebuilts目錄中,嫌大也可以單獨(dú)下。
Native層動(dòng)態(tài)分析 gdb:不解釋,碼農(nóng)界永遠(yuǎn)的神器。參考: Android下用gdb進(jìn)行系統(tǒng)級(jí)源碼調(diào)試(http://blog.csdn.net/jinzhuojun/article/details/7375048) 像Mono這樣的JIT引擎會(huì)動(dòng)態(tài)生成代碼,而這些動(dòng)態(tài)生成的代碼用靜態(tài)分析手段是看不到的。但可以用gdb來看,用disassemble或x/ni命令等。
另外一些動(dòng)態(tài)分析工具 Android作為一個(gè)Linux為內(nèi)核的系統(tǒng),自然在Linux下的那些動(dòng)態(tài)分析工具大多都能用。如strace可以監(jiān)視系統(tǒng)調(diào)用(如open, mmap等)和信號(hào)。tcpdump可以截獲網(wǎng)絡(luò)傳輸數(shù)據(jù)等。 /proc/pid/目錄下提供了該進(jìn)程豐富的OS級(jí)運(yùn)行時(shí)信息,如maps文件顯示進(jìn)程的虛擬地址空間映射信息,status有內(nèi)存使用等信息,cmdline和exe可以看到該進(jìn)程對(duì)應(yīng)的執(zhí)行文件。net, fd, task目錄分別可以看網(wǎng)絡(luò),文件,線程信息等。 /data/tombstones/:程序由于錯(cuò)誤退出后的“墓碑”,里面記錄著程序的“死相”。
Settings->Developer Options:里面有一坨調(diào)試分析工具。像顯示觸摸點(diǎn)坐標(biāo)和顯示應(yīng)用Layout等功能,都是很實(shí)用的。 SDK中的tools/monitor,以前叫DDMS,里面可以看內(nèi)存,線程,網(wǎng)絡(luò)等信息,還包括了截圖等實(shí)用功能。參考: http://developer./tools/debugging/ddms.html http://developer./tools/debugging/debugging-memory.html dumpsys 命令不僅可以輸出很多系統(tǒng)信息(如硬件參數(shù)等),后面加service名(如SurfaceFlinger)還可以看service的運(yùn)行時(shí)狀態(tài)。 Dev Tools App包含了一些調(diào)試分析功能,其實(shí)很多都被移到Developer Options里了。參考: http://developer./tools/debugging/debugging-devtools.html Android Emulator:優(yōu)點(diǎn)是從模擬硬件到API實(shí)現(xiàn)都可以改。缺點(diǎn)是arm版本慢且OpenGLES支持稍差,所以不少游戲不能跑。x86版本由于可以虛擬化會(huì)快些,另外打開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 另外應(yīng)用來不及響應(yīng)會(huì)產(chǎn)生ANR,log位于/data/anr/trace.txt。
OpenGL渲染分析 OpenGL ES tracer:截獲所有OpenGL調(diào)用。缺點(diǎn)是慢,優(yōu)點(diǎn)是直觀,每一幀,每一條GL命令都有對(duì)應(yīng)的結(jié)果圖像,因此很容易找出是哪條GL命令出了問題。參考:http://developer./tools/help/gltracer.html Settings->Developer Options里Enable OpenGL traces,可以在logcat里輸出。優(yōu)點(diǎn)是快,缺點(diǎn)是輸出不直觀。
一些輔助調(diào)試的Android App Busybox:默認(rèn)的adb shell功能弱爆了,這個(gè)可以讓開發(fā)者找回一點(diǎn)用Linux的感覺。 Terminal:不用host直接在guest設(shè)備就可以用的Android shell。 |
|