Android-AOP小记

AOP面向切面编程在后端应用非常广泛,有效的进行了解耦,将分散的代码集中起来,对原有业务逻辑侵入较低。本文基于AspectJ实现Android应用场景下的AOP。

什么是AOP

什么是AOP?回答这个问题之前,回顾一下OOP(面向对象),我们在面向对象的编程过程中,功能模块化,每个模块处理自己的业务。但是有一个问题,就是当业务逻辑变得越来越复杂之后,各个模块相互调用,某些模块被多处反复调用,代码分散不易维护。对原有业务逻辑入侵比较大,牵一发而动全身。AOP(面向切面编程)就是为了解决这个问题,把某些功能统一管理起来,作为一个切面,需要使用的地方作为一个切入点,将功能代码在编译时织入或者运行时进行动态代理。

AOP的应用场景

AOP在Android的实际应用其实比较少,因为Android应用功能入口比较统一,后端各个业务模块之间比较分散,一些需要多处调用的模块(如:登录、日志收集等)适合AOP进行统一管理。回归正题,Android的AOP场景有:检测耗时、权限处理、埋点、登录、触摸限制等。

AspectJ简单使用

AOP是方法论,具体的实现需要借助一下框架。常用的Android AOP框架有: APT, AspectJ, Javassist, ASM。AspectJ是按照AOP的思想为java设计的具备强大AOP功能的框架,学习AspectJ有助于我们对AOP的理解。

APT: 注解处理器
Javassist: 字节码处理框架
ASM: 字节码处理框架
AspectJ: AOP框架

结合注解我们可以更加灵活的使用AspectJ,以下是AspectJ提供的部分注解,简化我们使用AspectJ的成本。

@Aspect: 用于注解类,定义一个切面类
@Pointcut: 用于注解方法,定义一个切入点
@Before: 用于注解方法,织入代码的执行点,表示在JPoint执行之前
@After: 用于注解方法,织入代码的执行点,表示JPoint执行完之后
@Around: 用于注解方法,织入代码的执行点,表示替代JPonit执行(执行原方法需调用proceed)

在这里我们主要使用AspectJ注解来实现简单的例子。

大材小用之耗时检查

//定义注解
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class ExecTime(val value: String)
//定义切面
@Aspect
class ExecTimeAspect {
    @Pointcut("execution(@com.cvte.tv.aopdemo.annotation.ExecTime * *(..))")
    fun execTimePointcut() {
    }

    @Around("execTimePointcut()")
    @Throws(Throwable::class)
    fun execTimePointcut(joinPoint: ProceedingJoinPoint) {
        val methodSignature = joinPoint.signature as MethodSignature
        val className = methodSignature.declaringType.simpleName
        val methodName = methodSignature.name
        val behaviorTrace = methodSignature.method.getAnnotation(ExecTime::class.java)!!
        val value = behaviorTrace.value
        val start = System.currentTimeMillis()
        joinPoint.proceed()
        val duration = System.currentTimeMillis() - start
        Log.e(value, "${className}类中${methodName}方法耗时:${duration}ms")
    }
}

使用的时候就只需要在相关方法加上@ExecTime("TAG")

权限处理

同理,我们可以定义权限检测和权限请求的注解和切面,在切面类execTimePointcut处进行权限处理。要注意一个点,切面类不应该持有Context(虽然我们可以通过joinPoint去获取当前的context),与Context相关的操作我们应该委托给一个公共的管理处理。在权限处理这个例子中,切面类不应该有太多权限请求的相关逻辑,它仅仅是一个切入点,具体的实现应该交给统一的权限管理器处理。

埋点项目实践

未完待续......

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,830评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 7,194评论 0 2
  • 今天上午陪老妈看病,下午健身房跑步,晚上想想今天还没有断舍离,马上做,衣架和旁边的的布衣架,一看乱乱,又想想自己是...
    影子3623253阅读 3,019评论 3 8

友情链接更多精彩内容