##自定義一個自動注入Log 的 外掛

無痕不想說話發表於2018-12-27
  1. 寫一個Plugin
  2. 建立一個配置類
  3. 通過Transfrom Api 注入配置
  4. 掃描包名通過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專案執行

相關文章