標籤:android http io os 使用 java ar for 檔案
轉載自看雪http://bbs.pediy.com/showthread.php?t=189610,非常感謝原作者分享!
初涉移動端,請各位前輩多多指教!
本文參考http://www.kaifazhe.com/android_school/380973.html
在此,對作者表示感謝!
跟蹤apk一般的做法是在反編譯的smali代碼中插入log輸出,然後重新編譯運行看輸出日誌,這種方法費時費力,如果能夠動態調試就最好了。下面就給大家介紹apk+eclipse來調試smali。
前期準備:
eclipse。
Jdk或jre,並設定好環境變數,我的是7.0版本。
Apktool2.0
簽名檔案
目標apk:light.apk。
1. 將LIGHT.APK複製到APKTOOL目錄下,
利用apktool反編譯light.apk。
命令:
D:\apktool2.0>java -jar apktool.jar d -d light.apk -o out(這裡必須使用-d參數,這樣反編譯出來的代碼尾碼均是java,因為只有java檔案才能被eclipse識別調試),
在目前的目錄產生了反編譯後的out檔案目錄:
2. 設定調試標記和尋找主類
在輸出的out檔案夾中,用文本編輯工具開啟AndroidManifest.xml,在application節點中設定屬性android:debuggable=”true”。
繼續在AndroidManifest.xml中,搜尋以下關鍵字
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
找到含有以上資訊的activity節點,記錄其android:name屬性的值,該值則為其應用的主類。本例主類為com.devuni.flashlight.MainActivity。
3. 在主類的ONCREATE事件中添加調試等待。
用文本編輯工具開啟主類檔案,找到onCreate方法,在第一句前插入invoke-static {}, Landroid/os/Debug;->waitForDebugger()V,記得添加a=0;//的首碼保持上下一致,結果如下:
4. 儲存檔案,用APKTOOL重新編譯打包為DEBUG.APK
命令:
D:\apktool2.0>java -jar apktool.jar b -d out -o debug.apk
產生debug.apk檔案:
5. 對DEBUG.APK簽名(需要下載簽名工具),我把簽名工具放在了SIGNAPK檔案夾下,產生DEBUG.SIGN.APK
命令:
D:\APKTOOL2.0>JAVA -JAR .\SIGN\SIGNAPK.JAR .\SIGN\TESTKEY.X509.PEM .\SIGN\TESTKE
Y.PK8 DEBUG.APK DEBUG.SIG.APK
6. 上傳DEBUG.SIGN.APK至手機或模擬器,然後安裝並運行。這時你會看到程式運行後停留在白屏介面,這時不要動裝置和退出程式,因為程式現在是運行到剛才添加的WAITFORDEBUGGER代碼這裡,這行代碼的意思是一直掛起中,等待調試器。
下面開始設定Just-in-Time 偵錯的環境。
7. 進入第1步產生的OUT檔案夾,把裡面的BUILD和DIST檔案夾刪除,這是APKTOOL編譯APK時產生的。
8. 啟動ECLIPSE,構建JAVA項目
1) File -> New -> Project -> Java Project -> Next
2) Project Name隨便起,Use default location選項去掉,Location選擇out檔案夾,然後Next
3) 把smali檔案夾設為Source Folder,然後Finish
9. 在ECLIPSE中,開啟第2步找到的主類,並找到ONCREATE方法,在WAITFORDEBUGGER後面的第一個方法開始添加斷點。如
10. 開啟DDMS,如果在第6步中運行了修改後的程式,在DDMS的裝置列表中會顯示可以調試的程式。
對應程式最後一欄為8602/8700,其中8602即為調試該程式的連接埠。
11. 現在要做的就是把代碼與偵錯工具關聯即可。 回到ECLIPSE,配置遠端偵錯
1) 菜單Run -> Debug -> Debug Configurations
2) 雙擊Remote Java Application,Host處預設localhost就行,Port填第10步得到的8602,然後Apply -> Debug。
12. 這時ECLIPSE自動切換至DEBUG視圖,並看到程式已經運行並中斷在下一行可執行檔代碼了,相關的變數可以直接查看了。
已經可以用eclipse調試smali了,上面的例子是從程式開頭的地方開始調試,但要調試到自己所關心地方的代碼處確實麻煩。建議先用jd-gui等軟體直接查看反編譯的java代碼,確定要調試的位置後,再進入smali定位斷點並Just-in-Time 偵錯,就可以事半功倍。
android動態調試samli代碼