欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Android基于DroidAssist插件实现无埋点

时间:2023-06-06
DroidAssist

DroidAssist (源码) 是一个轻量级的 Android 字节码编辑插件,基于 Javassist 对字节码操作,根据 xml 配置处理 class 文件,以达到对 class 文件进行动态修改的效果。和其他 AOP 方案不同,DroidAssist 提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的依赖。

使用方式

DroidAssist 适用于 Android Studio 工程 application model 或者 library model,使用 DroidAssist 需要接入 DroidAssist 插件并编写专有配置文件。
在 root project 的 build.gradle 里添加:

dependencies { classpath "com.didichuxing.tools:droidassist:1.1.1"}

注意:目前似乎只在 jcenter 有发布,所以需要在 repositories 里添加 jcenter() 。

在需要处理的 model project 的 build.gradle 里添加:

apply plugin: 'com.didichuxing.tools.droidassist'droidAssistOptions { config file("droidassist.xml"),file("droidassist2.xml") //插件配置文件(必选配置,支持多配置文件)}

埋点配置 1、埋点代码 ViewInject.kt

package com.example.droidassisttestimport android.app.Activityimport android.content.DialogInterfaceimport android.os.SystemClockimport android.util.Logimport android.view.Viewimport android.widget.CompoundButtonimport android.widget.RadioGroupimport android.widget.SeekBarimport androidx.fragment.app.Fragmentobject ViewInject { private const val TAG = "ViewInject" @JvmStatic fun injectClick(view: View) { Log.d(TAG, "injectClick on $view") } @JvmStatic fun injectDialogClick(dialog: DialogInterface, which: Int) { Log.d(TAG, "injectDialogClick on $dialog: $which") } @JvmStatic fun injectGroupCheckedChanged(radioGroup: RadioGroup, which: Int) { Log.d(TAG, "injectGroupCheckedChanged on $radioGroup: $which") } @JvmStatic fun injectSeekClick(seekBar: SeekBar) { Log.d(TAG, "injectSeekClick on $seekBar") } @JvmStatic fun injectCheckedChanged(button: CompoundButton, value: Boolean) { Log.d(TAG, "injectCheckedChanged on $button: $value") } @JvmStatic fun injectActivityOnResume(activity: Activity) { Log.d(TAG, "injectActivityonResume $activity") activity.window.decorView.setTag(R.id.activity_resume_tag, SystemClock.uptimeMillis()) } @JvmStatic fun injectActivityOnPause(activity: Activity) { val pauseTime = SystemClock.uptimeMillis() val resumeTime = (activity.window.decorView.getTag(R.id.activity_resume_tag) as? Long) ?: pauseTime Log.d(TAG, "injectActivityonPause $activity time=${pauseTime - resumeTime}") } @JvmStatic fun injectFragmentOnResume(fragment: Fragment) { Log.d(TAG, "injectFragmentonResume $fragment") } @JvmStatic fun injectFragmentOnPause(fragment: Fragment) { Log.d(TAG, "injectFragmentonPause $fragment") } @JvmStatic fun injectFragmentOnResume(fragment: android.app.Fragment) { Log.d(TAG, "injectFragmentonResume $fragment") } @JvmStatic fun injectFragmentOnPause(fragment: android.app.Fragment) { Log.d(TAG, "injectFragmentonPause $fragment") }}

2、埋点 xml 配置表

路径为 DroidAssistTest/app/droidassist.xml
记得在 xml 头部添加 https://github.com/didi/DroidAssist/blob/master/docs/droidassist.dtd 的内容,为了方便编写配置文件,在 IDE 中能自动提示。

]> * androidx.* void android.view.View$OnClickListener.onClick(android.view.View) {com.example.droidassisttest.ViewInject.injectClick($1);} void android.content.DialogInterface$OnClickListener.onClick(android.content.DialogInterface,int) {com.example.droidassisttest.ViewInject.injectDialogClick($1,$2);} void android.widget.RadioGroup$OnCheckedChangeListener.onCheckedChanged(android.widget.RadioGroup,int) {com.example.droidassisttest.ViewInject.injectGroupCheckedChanged($1,$2);} void android.widget.SeekBar$OnSeekBarChangeListener.onStopTrackingTouch(android.widget.SeekBar) {com.example.droidassisttest.ViewInject.injectSeekClick($1);} void android.widget.CompoundButton$OnCheckedChangeListener.onCheckedChanged(android.widget.CompoundButton,boolean) {com.example.droidassisttest.ViewInject.injectCheckedChanged($1,$2);} void androidx.fragment.app.FragmentActivity.onResume() {com.example.droidassisttest.ViewInject.injectActivityonResume(this);} void androidx.fragment.app.FragmentActivity.onPause() {com.example.droidassisttest.ViewInject.injectActivityonPause(this);}

3、使用样例 布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。