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相关的操作我们应该委托给一个公共的管理处理。在权限处理这个例子中,切面类不应该有太多权限请求的相关逻辑,它仅仅是一个切入点,具体的实现应该交给统一的权限管理器处理。

埋点项目实践

未完待续......

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

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