通过注解的方式对界面的埋点以及事件的埋点进行上报,以减少三方埋点对项目代码的入侵性。插件包含两个模块analytics-utils和analytics-plugin。
analytics-utils:主要包含自定义注解和工具类。
analytics-plugin:ASM的字节码插桩功能实现部分。
https://github.com/LucasDevelop/AnchorPlugin
基于ASM字节码插桩技术,在编译期扫描项目class文件,读取class文件上的注解,当匹配上对应的注解后插入Firebase上报事件的字节码,并重新打包class文件。
- Step1
在项目下的Gradle中加入插件依赖
buildscript{
repositories{
//添加jitpack仓库
maven { url "https://jitpack.io" }
}
dependencies{
//插件地址
classpath "com.github.LucasDevelop.AnchorPlugin:analytics-plugin:1.0.6-release"
}
}
allprojects {
repositories {
//添加jitpack仓库
maven { url "https://jitpack.io" }
}
}- Setp2
在项目的主模块下的Grable中应用插件
plugins {
//应用插件-只需在主模块添加即可
id 'analytics-plugin'
}
dependencies{
//依赖插件帮助模块(包含注解和工具类)
implementation "com.github.LucasDevelop.AnchorPlugin:analytics-utils:1.0.6-release"
}
//插件配置
anchor {
//是否启用插件,默认是启用状态
enable = true
}
- Setp3
自定义的监听回调SampleAnalytics.kt
SampleAnalytics.kt只需实现IAnalytics接口即可
class SampleAnalytics : IAnalytics { /** * 初始化 * */ override fun initConfig(context: Application) { Log.d("lucas", "初始化") } /** * 设置用户信息 * * @param uid 用户ID * @param userProperty 用户其他参数 */ override fun bindUserId(uid: String, userProperty: Map<String, String>?) { Log.d("lucas", "绑定用户信息") Log.d("lucas", "uid:$uid") userProperty?.forEach { Log.d("lucas", "${it.key}:${it.value}") } } /** * 跟踪界面,该方法将会在activity活着fragment的onResume中调用 * * @param params {@link com.lucas.analytics.annotation.TrackPage}中的参数 * @param lifecycle 生命周期 * @param pageClass 界面class */ override fun trackPage(params: ArrayList<String>, lifecycle: Lifecycle, pageClass: Class<*>) { Log.d("lucas", "【界面】params$params,lifecycle:$lifecycle,pageClass:${pageClass.simpleName}") } /** * 跟踪事件 * * @param eventName 事件名称 * @param param 需上报的数据 */ override fun trackEvent(eventName: String, param: HashMap<String, Any>?) { Log.d("lucas", "【事件】eventName:$eventName,param:$param") } }
- Setp4 在Application的onCreate中初始化,并注册自定义回调
//注册监听 Analytics.register(SampleAnalytics()) //插件初始化 Analytics.initConfig(this)
- Setp5
在用户登录后绑定用户信息(方便在回调里获取用户信息)
val userProperty = mapOf("username" to "lucas","age" to 18) Analytics.bindUserId("uuid123456", userProperty)
- Setp6
在Activity/Fragemnt中添加页面埋点
//TrackPage注解只能用在Activity和Fragment的子类的文件名上, //在界面被打开时会自动回调IAnalytics中的trackPage方法 @TrackPage("模块名称", "一级界面名称", "二级界面名称") class PermissionActivity:AppCompatActivity(){ //被TrackMethod注解标记的方法会在该方法被调用的时候自动上报事件并且上报trackParams中指定的参数以及参数的值(参数包括方法参数以及方法内的本地变量),可以作用在任何类的任何方法上。 @TrackMethod(des = "changePage", trackParams=["type","tempParams"]) private fun changePage(type: String) { val tempParams = "temp value" } }
- Setp7 配置混淆
-keep class com.lucas.analytics.** {*;}
- 参考博客
https://juejin.cn/post/6844904013998243847
https://blog.csdn.net/u010976213/article/details/105395590
https://juejin.cn/post/6877925000045658119
- 参考项目