# DroidAssist
`DroidAssist` 是一个轻量级的 Android 字节码编辑插件,基于 `Javassist` 对字节码操作,根据 xml 配置处理 class 文件,以达到对 class 文件进行动态修改的效果。和其他 AOP 方案不同,DroidAssist 提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的依赖。
> [ Javassist: A Java bytecode engineering toolkit since 1999](http://www.Javassist.org/ "Java bytecode engineering toolkit since 1999")
## 功能
- **替换**:把指定位置代码替换为指定代码
- **插入**:在指定位置的前后插入指定代码
- **环绕**:在指定位置环绕插入指定代码
- **增强**:
- **TryCatch** 对指定代码添加 try catch 代码
- **Timing** 对指定代码添加耗时统计代码
## 特点
* 灵活的配置化方式,使得一个配置就可以处理项目中所有的 class 文件。
* 丰富的字节码处理功能,针对 Android 移动端的特点提供了例如代码替换,添加 try catch,方法耗时等功能。
* 简单易用,只需要依赖一个插件,处理过程以及处理后的代码中也不需要添加额外的依赖。
* 处理速度较快,只占用较少的编译时间。
## 开发文档
### DroidAssist 配置文件
DroidAssist 将扫描工程中的每一个单独的 class 以及 jar 中的 class, 并对 class 与配置文件中的规则进行匹配,如果有规则能够匹配到 class,则根据 DroidAssist 配置对此 class 进行字节码修改。
DroidAssist 配置是一个 xml 文件,根节点是 `DroidAssist` , 根节点下包含 `Global` , `Insert` , `Around` , `Replace` , `Enhance` 代码操作配置,完整的 DroidAssist 配置文件格式如下:
```xml
...
...
...
...
...
```
> 为了方便编写配置文件,在 IDE 中能自动提示,请将根目录下 [DTD文件](droidassist.dtd) 拷贝到配置文件第二行。
### 配置分类:
- **Insert**:代码插入类
- **Replace**:代码替换类
- **Around**:代码环绕类
- **Enhance**:代码增强类
### Source 和 Target
Insert、Replace、Around、Enhance 类型代码操作配置中均需要包含 `Source` 和 `Target` 元素:
例:
```xml
$_= com.didichuxing.tools.test.LogUtils.log($$);
```
Source 的值 `int android.util.Log.d(java.lang.String,java.lang.String)` 表示需要匹配方法调用 `android.util.Log.d( )`
Target 的值 `$_= com.didichuxing.tools.test.LogUtils.log($$); `表示将调用 `android.util.Log.d( )` 方法调用的代码替换为 `com.didichuxing.tools.test.LogUtils.log( )`
#### Source
表示需要进行修改的代码位置,用以精确匹配代码位置,Source 按照代码位置类型可以分为方法、构造方法、字段、静态初始化块:
##### 1. 方法
Source 表示方法时,格式为 `returnType className.methodName(argType1,argType2)` :
```xml
```
##### 2. 构造方法
Source 表示方法时,格式为 `new className(argType1,argType2)` 或者 `className.new(argType1,argType2)`:
```xml
```
或
```xml
```
##### 3. 字段
Source 表示字段时,格式为 `fieldType className.fieldName` :
```xml
```
##### 4. 静态初始化块
Source 表示静态初始化块时,格式为 `className` :
```xml
```
> 注意:
> 1. Source 的范围为本类和在子类有效(构造方法和静态初始化块除外),方法和字段如果在子类中可见,则也会被匹配,如果不需要匹配子类只匹配当前配置类,可在`