8月8日
Android开源框架 Aoppermission
Aoppermission是基于Aspect实现。实现过程及原理分析。Android的常用Aop有两种方式1.通过JNI Hook,2.静态织入
Acpect基础知识
- 注解@Aspect,申明切面标记类
- @Pointcut, 定义切点,标记方法
- @Befeore 前置通知,切点前执行
- @Around 围绕切点执行
- @after 后置通知,切点后执行
- @AfterReturening,返回返回值,切点返回值
- @AfterThrowing ,异常通知,切点抛出异常
- 首先需要依赖com.hujiang.aspectjx:gradle-android-plugin-aspectjx,配置好了所需的环境
- 通过定义注解,包括NeedPermission,PermissionCanceled,PermissionDenied,三个注解对应这申请权限的三种情况。通过源码看他们的作用域都是Method,保留时间都是一直到运行时期,那就意味着,我们可以通过反射的技术实现想做的,而本项目也恰恰是基于反射和Aspect实现
摘录
纵向关系OOP,横向关系AOP
- OOP是面向对象编程,按照单一职责原则会将会定义一个个类,每个类只负责一个责任。当我们要使用这个时会引用他,使他分散在个个模块,到处都有。如日志,埋点等。从对象组织角度来讲,采用的分类方式是类似生物学的方式,以继承为主线
- AOP是面向切面编程,我们从横向的的角度去观察这些对象,无需到处调用。这些需要打印日志的地方就是一个切点,AOp会在适当的时机打印
OOP是将问题划分到某个单个模块里去,而AOP是将把涉及到众多模块的某一类问题进行统一管理。AOP是将这些功能集中起来放到一个地方进行管理。是与业务逻辑进行隔离解耦
实现特定方法的前后执行
- 硬编码,在执行方法前添加额外的执行方法
- 静态织入,通过AspectJ,通过扫描文件分析代码,找到切点JoinPoint,通过自动生成代码获取方法的各种信息,
- JDK动态代理是对接口的代理,CGLib是对类的代理,把被代理的对象的class加载起来修改字节码,修改其字节码生成一个继承被代理对象的子类.通过子类增强功能