- 寫一個Plugin
- 建立一個配置類
- 通過Transfrom Api 注入配置
- 掃描包名通過ASM注入到class中
- gradle外掛的方法請自行查閱百度;
- 建立一個dsl,傳入要插入的方法的資訊,注入Transform
project.extensions.create(EXT_NAME,AutoRegisterConfig)//寫入自定義配置,建立dsl
def android = project.extensions.getByType(AppExtension);
def transformImpl = new RegeisterTransform();
android.registerTransform(transformImpl);
複製程式碼
- 遍歷directoryInputs,找到要注入的類,插入asm
ClassReader cr = new ClassReader(bytes);
ClassWriter cw = new ClassWriter(cr, 0);
ClassVisitor cv = new MyClassVisitor(Opcodes.ASM5, cw);
cr.accept(cv, ClassReader.EXPAND_FRAMES);
byte[] b = cw.toByteArray();
複製程式碼
- 採用AdpterAdvice注入到方法,這是MethodVistor的子類,封裝的介面可以方便插入程式碼到方法內部,在onMethodEnter中寫入方法,ig:
mv.visitMethodInsn(INVOKESTATIC, "com/xxx/myapplication/TimeLog","printTime", "()V");
引數可以通過第一步建立的dsl獲取到 第一個引數代表Static,第二個引數是全類名,第三方引數是方法名,第四個引數是返回值型別(百度自行查閱位元組碼的型別表示) 插入的方法:
public class TimeLog {
public static void printTime(){
Log.e("time",System.currentTimeMillis() + "");
}
}
複製程式碼
- 將生成的byte[] 重新寫回原始檔
FileOutputStream fos = new FileOutputStream(file.absolutePath);
fos.write(b);
fos.close();
複製程式碼
- 依賴外掛,build專案執行