[TOC]
已有功能
- 語法高亮/錯(cuò)誤提示
- 字節(jié)碼級別調(diào)試
- 斷點(diǎn)
- 單步調(diào)試
- 寄存器查看
- 本地窗口 java 語法支持,debug 模式下同樣支持
- 支持跳轉(zhuǎn),方便追蹤變量/函數(shù)/類.(Xref也支持)
- 查找用法
- 重命名
- 從 java 代碼引用 smali 類
安裝
- 下載插件smalidea
比如最新的是smalidea-0.05.zip园细,另外鏈接里面其他工具也是無源碼調(diào)試的利器
- 進(jìn)入IntelliJ IDEA/Android Studio開始安裝插件,進(jìn)入Settings->Plugins點(diǎn)擊Install plugin from disk選中下載好的壓縮包
- 點(diǎn)擊apply
注意割以,插件版本較老拼坎,對應(yīng)最新的 Android Studio 可能無法使用
開啟應(yīng)用調(diào)試
要調(diào)試一個(gè)apk里面的dex代碼怎静,必須滿足以下兩個(gè)條件中的任何一個(gè):
- apk中的AndroidManifest.xml文件中的Application標(biāo)簽包含屬性android:debuggable=”true”
- /default.prop中ro.debuggable的值為1
可選方案:
apktool d [apkPackage]
其中當(dāng)apktool 2.1.0以后,不再提供 apktool d -d 功能生成 .java 的 smali 文件了
- apktool 反編譯app 后在AndroidManifest.xml文件中插入android:debuggable=”true”
- 在啟動(dòng)類的
onCreate
中 加入
// 這個(gè)是smali語法的舀瓢,其實(shí)對應(yīng)的Java代碼就是:android.os.Debug.waitForDebugger();
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
- hook system debug (Xinstaller)
- 修改boot.img
這里采用 hook 方式達(dá)到開啟所有應(yīng)用調(diào)試的目的
xposed 插件代碼如下
public class Debug implements IXposedHookLoadPackage {
public boolean debugApps = true ;
public static final int DEBUG_ENABLE_DEBUGGER = 0x1;
public String tag = "IDG";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(lpparam.appInfo == null ||
(lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){
return;
}
tag = tag + lpparam.packageName;
XposedBridge.hookAllMethods(Process.class, "start", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
int id = 5;
int flags = (Integer) param.args[id];
Log.d(tag,"flags is : "+flags);
if (debugApps) {
if ((flags & DEBUG_ENABLE_DEBUGGER) == 0) {
flags |= DEBUG_ENABLE_DEBUGGER;
}
}
param.args[id] = flags;
Log.d(tag,"flags changed : "+flags);
}
});
}
}
如果遇到如下錯(cuò)誤
- Adb rejected connection to client
可以使用重啟 adb server 來解決
adb kill-server
adb start-server
調(diào)試應(yīng)用
調(diào)試前準(zhǔn)備
IDEA 14.1及以上版本才支持單步調(diào)試
- 使用 baksmali 反編譯應(yīng)用
baksmali myapp.apk -o [outPath]
- 轉(zhuǎn)到 IDEA 中,導(dǎo)入新module,選中之前的目錄
導(dǎo)入時(shí)選擇Create project from existing sources
導(dǎo)入工程后右鍵點(diǎn)擊 src 目錄,設(shè)定
Mark Directory As->Sources Root
打開Module setting設(shè)置對應(yīng)的 JDK
安裝debug應(yīng)用
找到debug應(yīng)用進(jìn)程,啟動(dòng)應(yīng)用
這里也可以使用這種方式
adb shell am start -D -W -n [packageName/LauncheActivity]
adb shell ps |grep [packageName]
adb forward tcp:[portNumber] jdwp:[PID]
- IDEA 配置遠(yuǎn)程調(diào)試
Run->Edit Configurations, use localhost Port
in jdwp show [portNumber]
打斷點(diǎn)調(diào)試
這個(gè)時(shí)候?qū)⒛愕臄帱c(diǎn)打在smali中,運(yùn)行斷點(diǎn)耗美,觸發(fā)斷點(diǎn)后就是跟普通調(diào)試差不多了