android 无埋点数据采集gradle插件(ASM字节码插桩)
掘金原理篇:https://juejin.im/post/5dae95c4f265da5bb7466357
1.去除v4、v7包支持
2.支持androidx
基于tools.build:gradle:4.0.1, gradle:6.6, sdkVersion:29 开发测试
配置变动点:
1.需要在gradle.properties中增加 android.enableD8.desugaring=false ,否则对lambda表达式不起作用
2.事件接收类中activity和fragment导入类改为androidx包名下的,可参考demo app模块代码
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.harvie.plugin:traceplugin:0.0.1' //无埋点采集插件
}
}
apply plugin: 'com.android.application'
apply plugin: 'trace-point' //无埋点插件应用
...省略常规项
//无埋点相关配置
noTracePoint{
pluginName = "tracepoint" //插件名称随意命名
//接收事件处理类(插件会将以下自定义类的相关方法插入目标方法中)
targetClassName = 'com.example.tracepointplugin.InterceptEventHanlder'
//开启会将修改后的文件copy一份到app/build/trace-point目录下,用于查看修改结果
outputModifyFile = true
//目标包名 数组类型(一般场景写业务模块包名即可)
targetPackages = ['com.example']
}
类名和包名可以自定义(在2步中配置),但类方法名及形参必须如下一致,否则可能出异常
class InterceptEventHanlder{
private static String TAG = "tracepoint";
//------------------- activity 事件接收
public static void activityOnCreate(Activity activity){
Log.e(TAG,activity.getClass().getName());
}
public static void activityOnResume(Activity activity) {
Log.e(TAG,activity.getClass().getName());
}
//------------------- fragment 事件接收
public static void setUserVisibleHint(Fragment fragment, boolean visiable){
if (visiable){
Log.e(TAG,"pv:"+fragment.getClass().getName());
}
}
public static void onHiddenChanged(Fragment fragment,boolean hidden){
if (!hidden){
Log.e(TAG,"pv:"+fragment.getClass().getName());
}
}
public static void setUserVisibleHint(android.support.v4.app.Fragment fragment,boolean visiable){
if (visiable){
Log.e(TAG,"pv:"+fragment.getClass().getName());
}
}
public static void onHiddenChanged(android.support.v4.app.Fragment fragment,boolean hidden){
if (!hidden){
Log.e(TAG,"pv:"+fragment.getClass().getName());
}
}
//------------------- click 事件接收
public static void onClick(View view){
try {
//以下ViewPath工具类可从源码app模块中获取
Activity activity = VIewPathUtil.getActivity(view);
String path = VIewPathUtil.getViewPath(activity,view);
Log.e(TAG,"viewPath:"+path);
}catch (Exception e){e.printStackTrace();}
}
}
到此就已经集成好了
build一下就会在app/build/trace-point文件中看到修改后的代码
run一下,浏览页面或是点击按钮时就会看到相关log输出
欢迎star 下期继续优化