概念

AOP概念

面向切面编程,是一种编程思想,也就是说面向某个功能模块编程,在代码层面上将该模块与其它有交叉的模块进行隔离

Hook概念

又叫钩子,通常是指对一些方法进行拦截,具体一点来说就是程序运行中,创建代理对象,然后把原始对象替换为代理对象

AOP是一种面向切面编程思想,Hook是实现AOP编程的一种手段,还可以使用动态插入代码在切面位置

AspectJ

github

简介

AOP编程的一个工具库,gradle编译期把代码插入指定位置

集成

classpath ‘com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0’
apply plugin: ‘android-aspectjx’
implementation ‘org.aspectj:aspectjrt:1.8.+’
**

Join Points

程序运行时的执行点,可以作为切面的地方

  • 函数调用执行
  • 获取设置变量
  • 类初始化

PointCut

带条件的JoinPoints

Advice

一种hook,要插入代码的位置

  • Befor:PointCut之前执行
  • After:PointCut之后执行
  • Around:Point之前,之后分别执行

语法介绍

  • Befor:Advice 具体插入位置
  • execution:处理Join Point具体的类型,call 切面在方法调用位置,execution 切在被掉的方法里面 注意:系统类方法只能使用call,无法将代码写入系统类中,只能写入我们工程方法调用处
  • ( com.optimize.performance.PerformanceApp.*(..)):匹配规则
  • getTime:要插入的代码

@Befor(“execution(* com.optimize.performance.PerformanceApp.(..))”)
public void **getTime(ProceedingJoinPoint joinPoint) {

}

  1. 注解:可选,方法上持有的注解,如@Deprecated;
    2. 修饰符:可选,如public、protected;
    3. 返回值类型:必填,可以是任何类型模式;“”表示所有类型;
    4. 类型声明:可选,可以是任何类型模式;
    5. 方法名:必填,可以使用“
    ”进行模式匹配;
    6. 参数列表:“()”表示方法没有任何参数;“(..)”表示匹配接受任意个参数的方法,“(..,java.lang.String)”表示匹配接受java.lang.String类型的参数结束,且其前边可以接受有任意个参数的方法;“(java.lang.String,..)” 表示匹配接受java.lang.String类型的参数开始,且其后边可以接受任意个参数的方法;“(*,java.lang.String)” 表示匹配接受java.lang.String类型的参数结束,且其前边接受有一个任意类型参数的方法;
    7. 异常列表:可选,以“throws 异常全限定名列表”声明,异常全限定名列表如有多个以“,”分割,如throws java.lang.IllegalArgumentException, java.lang.ArrayIndexOutOfBoundsException。

只能操作代码中有的方法(例子:如父内中有该方法,但子类未重写,将无法切入子类该方法)

Epic

github
Epic是一个虚拟机层面,以java Method 为粒度的运行时Hook框架
支持android 4.0到9.0

使用

compile ‘me.weishu:epic:0.3.6’
继承XC_MethodHook,实现相应逻辑
注入Hook:DexposedBridge.findAndHookMethod

Lancet

github
轻量级android aop框架
编译速度快,支持增量编译
API简单没有任何多余代码插入APK

@proxy 通常用于对系统API调用的hook
@insert 常用于操作app与library的类

Proxy是hook方法被调用的地方,insert是hook方法体,也就是方法声明的地方。
Proxy的存在主要是用在hook android.jar的class