DroidAssist輕量級的 Android 字節(jié)碼編輯插件
DroidAssist 是一個輕量級的 Android 字節(jié)碼編輯插件,基于 Javassist 對字節(jié)碼操作,根據(jù) xml 配置處理 class 文件,以達到對 class 文件進行動態(tài)修改的效果。和其他 AOP 方案不同,DroidAssist 提供了一種更加輕量,簡單易用,無侵入,可配置化的字節(jié)碼操作方式,你不需要 Java 字節(jié)碼的相關知識,只需要在 Xml 插件配置中添加簡單的 Java 代碼即可實現(xiàn)類似 AOP 的功能,同時不需要引入其他額外的依賴。
功能
- 替換:把指定位置代碼替換為指定代碼
- 插入:在指定位置的前后插入指定代碼
- 環(huán)繞:在指定位置環(huán)繞插入指定代碼
- 增強:
- TryCatch 對指定代碼添加 try catch 代碼
- Timing 對指定代碼添加耗時統(tǒng)計代碼
特點
- 靈活的配置化方式,使得一個配置就可以處理項目中所有的 class 文件。
- 豐富的字節(jié)碼處理功能,針對 Android 移動端的特點提供了例如代碼替換,添加try catch,方法耗時等功能。
- 簡單易用,只需要依賴一個插件,處理過程以及處理后的代碼中也不需要添加額外的依賴。
- 處理速度較快,只占用較少的編譯時間。
使用指南
DroidAssist 適用于 Android Studio 工程 application model 或者 library model,使用 DroidAssist 需要接入 DroidAssist 插件并編寫專有配置文件。
在 root project 的 build.gradle 里添加:
dependencies {
classpath "com.didichuxing.tools:droidassist:1.0.8"
}
在需要處理的 model project 的 build.gradle 里添加:
apply plugin: 'com.didichuxing.tools.droidassist'
droidAssistOptions {
config file("droidassist.xml"),file("droidassist2.xml") //插件配置文件(必選配置,支持多配置文件)
}
其他配置:
-
enable如果需要停用 DroidAssist 插件功能,可以添加enable false以停用插件 (可選配置) -
logLevel日志輸出等級:0關閉日志輸出,1輸出日志到控制臺2輸出日志到文件3輸出日志到控制臺以及日志 (可選配置) -
logDir日志輸出目錄,當日志輸出到文件時,默認的輸出目錄是當前model的build/outputs/logs目錄 (可選配置)
示例
下面例子將把項目中所有使用系統(tǒng) android.util.Log 類進行 DEBUG 日志輸出的代碼替換為自定義的日志輸出類,以方便對線上日志進行策略化,動態(tài)化管理。
<Replace>
<MethodCall>
<Source>
int android.util.Log.d(java.lang.String,java.lang.String)
</Source>
<Target>
$_=com.didichuxing.tools.test.LogUtils.log($1,$2);
</Target>
</MethodCall>
</Replace>
處理前的class:
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "MainActivity onCreate");
}
}
處理后的 class:
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String var2 = "MainActivity";
String var3 = "MainActivity onCreate";
int var4 = LogUtils.log(var2, var3); // The target method using custom log method.
}
}
完整文檔
完整開發(fā)文檔和配置見 開發(fā)文檔wiki
局限
- 由于 Javassist 的機制,DroidAssist 在處理的過程中將會產生額外的局部變量用以指向參數(shù)變量和保存返回值,但處理后有一些局部變量并沒有實際作用。
- DroidAssist 在處理某些代碼時可能會新增一些額外的代理方法。
- DroidAssist 插件用于
library model只能處理 Java 源碼產生的 class,不能處理本地依賴中的 jar 。
評論
圖片
表情
