Home

Awesome

Luffy

Android字节码插件,编译期间动态修改代码

1、更新日志

2018.12.07更新

参考神策的全埋点日志SDK,进行功能重构扩展完善,以方便正式应用到线上应用

1、针对日志采集的全埋点对各个常见十多种控件进行埋点监听及处理(AutoTrackHelper类)

2、可以在build.gradle进行多个自定义插桩配置

3、针对埋点控件及自定义配置功能的logapp测试应用

2018.03.28更新

插件扩展,新增自动埋点实战功能 2018.03.28更新 插件扩展,新增自动埋点实战功能

2、使用步骤

要是使用演示的话,因为还没上传到jcenter库,所以只能本地仓库打包插件,记得要先把依赖都注释掉,插件打包完成后再启用,不然会编译不过去的。

本地打包及使用步骤:

dependencies {
    classpath 'oms.mmc:autotrack-gradle-plugin:1.0.0-SNAPSHOT'
}
apply plugin: 'oms.mmc.autotrack'

xiaoqingwa {
    // 是否打印日志
    isDebug = true
    // 是否打开SDK的日志全埋点采集
    isOpenLogTrack = true
    // 支持自定义配置,可选
    matchData = [[
                         //方法的匹配,可以通过类名或者实现的接口名匹配
                         'ClassName'    : 'com.mmc.lamandys.liba_datapick.Counter2',
                         'InterfaceName': '',
                         'MethodName'   : 'test2',
                         'MethodDes'    : '(Landroid/view/View;)V',
                         'isAnnotation' : true,
                         //插入的字节码,方法的执行顺序visitAnnotation->onMethodEnter->onMethodExit
                         'MethodVisitor': {
                             MethodVisitor methodVisitor, int access, String name, String desc ->
                                 MethodVisitor adapter = new AutoMethodVisitor(methodVisitor, access, name, desc) {
                                     boolean isAnnotation = false

                                     @Override
                                     protected void onMethodExit(int opcode) {
                                         super.onMethodExit(opcode)
                                         //使用注解找对应方法的时候得加这个判断
                                         if (!isAnnotation) {
                                             return
                                         }
                                         // INVOKESTATIC
                                         methodVisitor.visitMethodInsn(184, "com/mmc/lamandys/liba_datapick/AutoHelper", "onClick2", "()V", false)
                                     }

                                     /**
                                      * 需要通过注解的方式加字节码才会重写这个方法来进行条件过滤
                                      */
                                     @Override
                                     AnnotationVisitor visitAnnotation(String des, boolean visible) {
                                         if (des == 'Lcom/xishuang/annotation/AutoCount;') {
                                             println "注解匹配:" + des
                                             isAnnotation = true
                                         }
                                         return super.visitAnnotation(des, visible)
                                     }
                                 }
                                 return adapter
                         }
                 ],
                 [
                         //方法的匹配,可以通过类名或者实现的接口名匹配
                         'ClassName'    : 'com.mmc.lamandys.liba_datapick.Counter',
                         'InterfaceName': '',
                         'MethodName'   : 'test',
                         'MethodDes'    : '()V',
                         'isAnnotation' : false,
                         //插入的字节码,方法的执行顺序visitAnnotation->onMethodEnter->onMethodExit
                         'MethodVisitor': {
                             MethodVisitor methodVisitor, int access, String name, String desc ->
                                 MethodVisitor adapter = new AutoMethodVisitor(methodVisitor, access, name, desc) {

                                     @Override
                                     protected void onMethodEnter() {
                                         super.onMethodEnter()
                                     }

                                     @Override
                                     protected void onMethodExit(int opcode) {
                                         super.onMethodExit(opcode)
                                         // INVOKESTATIC
                                         methodVisitor.visitMethodInsn(INVOKESTATIC, "com/mmc/lamandys/liba_datapick/AutoHelper", "onClick3", "()V", false)
                                     }
                                 }
                                 return adapter
                         }
                 ]
    ]
}

在logapp->build->intermediates->transforms->AutoTrack->debug中可查看插桩后的类文件:插桩类文件

具体编译的字节码可查看编译日志:编译日志

具体采集后的日志及处理可看应用日志:应用日志 应用日志规范后效果