当筵意气临九霄,星离雨散不终朝。这篇文章主要讲述Android aspectJ Aop相关的知识,希望能为你提供帮助。
基于aspectJ实现埋点操作
配置环境:
直接使用大神的:https://github.com/JakeWharton/hugo
先配置
项目 build.gradle
dependencies {
classpath ‘com.jakewharton.hugo:hugo-plugin:1.2.1‘
}
app / build.gradle
apply plugin: ‘com.jakewharton.hugo‘
Advice 切点插入方式。表示在匹配的切点处,用什么方式去处理,一共有如下几个类型:
@Around 环绕插入。参数为ProceedingJoinPoint,可以手动包裹代码后,在需要的条件中调用参数的方法 proceed() 表示执行目标方法注意: 只有Around参数是ProceedingJoinPoint,需要调用proceed执行方法,其他的都只是前后插入,不会影响原有代码的执行
@Before 前置插入。在切点前执行
@After 后置插入。在切点后执行
@After returning。在返回值之后执行
@After throwing。在抛出异常后执行
在AspectJ的切入点表达式中最常用的是call和execution表达式说明:
call:调用此方法的地方切点
execution:方法内部切点
eg:call( com.home.dot..MainActivity.testBefore(..))
【Android aspectJ Aop】第一个表示返回值,表示返回值为任意类型,后面这个就是典型的包名路径,其中可以包含 来进行通配,几个 没区别。
- 同时,这里可以通过& & 、||、!来进行条件组合。()代表这个方法的参数,你可以指定类型,
- 例如android.os.Bundle,或者(..)这样来代表任意类型、任意个数的参数
@Aspect
public class AspectEntity {
public static final String TAG = "AspectEntity";
private boolean isInvokeProceed = true;
@Before("execution(* android.app.Activity.on*(..))")
public void onStartBefore(JoinPoint joinPoint) {
String key = joinPoint.getSignature().toString();
Log.e(TAG, "onStartBefore:" + key);
}/**
* 第一个*表示返回值,*表示返回值为任意类型,后面这个就是典型的包名路径,其中可以包含 * 来进行通配,几个 * 没区别。
* 同时,这里可以通过&
&
、||、!来进行条件组合。()代表这个方法的参数,你可以指定类型,
* 例如android.os.Bundle,或者(..)这样来代表任意类型、任意个数的参数
*/
/**
* Around呢,从字面含义上来讲,也就是在方法前后各插入代码,是的,他包含了Before和After的全部功能
*/
@Around("call(* com.home.dot.androidautodot.MainActivity.testBefore(..))")
public void aroundTest(ProceedingJoinPoint joinPoint) throws Throwable {
if (isInvokeProceed) {//isInvokeProceed为false则不执行原始方法(也就是不执行testBefore方法的内部代码)
joinPoint.proceed();
//代表执行原始的方法 在这之前、之后,都可以进行各种逻辑处理
Log.e(TAG, "aroundTest: test");
}
Log.e(TAG, "aroundTest end");
}@Before("execution(* android.view.View.OnClickListener.onClick(..))")
public void beforeAction() {
Log.e(TAG, "beforeAction: ");
}@After("execution(* android.view.View.OnClickListener.onClick(..))")
public void afterAction() {
Log.e(TAG, "afterAction: ");
}/**
* withincode的使用
* eg:aspectJ1(),aspectJ2(),aspectJ3()都调用了aspectJTest方法,
* 但只想在aspectJ2调用aspectJTest时插入代码
*/@Pointcut("(call(* *..aspectJTest()))&
&
withincode(* *..aspectJ2())")
public void invokeAspectJTestInAspectJ2() {
}@Before("invokeAspectJTestInAspectJ2()")
public void beforeInvokeaspectJTestInAspectJ2(JoinPoint joinPoint) throws Throwable {
if (joinPoint != null) {
Log.e(TAG, "method:" + joinPoint.getSignature());
}
}
}
推荐阅读
- react-native-baidu-map 在Android上的集成
- C# 中 DapperRow 数据解析
- Cannot read property 'appendChild' of null
- android studio3.1 添加闪屏页面(启动欢迎界面)(例子简单无BUG)
- pandas的apply操作
- 区块链点对点交易APP如何交易
- 微信中打开 input file 在安卓设备上没有拍照功能
- Windows 10的10款最佳密码管理器下载推荐合集(哪个更好())
- Windows的12款最佳数据粉碎机软件下载推荐合集