Android 全埋点解决方案之 AspectJ

Android 全埋点解决方案之 AspectJ

AOP

AOP 是 Aspect Oriented Programming 的缩写,即“面向切面编程”。使用 AOP,可以在编译期间对代码进行动态管理, 以达到统一维护的目的。AOP 是 OOP 编程的一种延续,也是 Spring 框架中的一个重要模块。利用 AOP 可以对业务逻辑 的各个模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率。利用 AOP,我们可以在无浸入的在宿主中插入一些代码逻辑,从而可以实现一些特殊的功能,比如日志埋点、性能监控、动态 权限控制、代码调试等。

AOP 术语

Android 全埋点解决方案之 AspectJ Android 全埋点解决方案之 AspectJ Android 全埋点解决方案之 AspectJ

以上概念,如果之前没有接触过,确实挺晦涩的。 我们下面有一段“白话”总结一下:

第一步:

我们通过定义一个表达式(PointCut)来告诉程序,我们需要对哪些地方增加额外的操作。通过这个表达式(PointCut), 我们得到那些需要通知的方法(JoinPoint)。

第二步:

我们还需要告诉程序,这些方法(JoinPoint)需要做怎样的增强(Advice): 1) 什么时候进行额外的操作(执行前 / 执行后 / 返回之前)? 2) 额外操作具体要做什么? 我们把以上两个步骤定义到一个地方(Aspect)。 上面两个步骤涉及到的被修改的对象,我们称之为目前对象(Target)。 完成上面的所有操作的动作,我们总称为织入(Weaving)。

AspectJ

AOP 是一个概念,一个规范,本身并没有设定具体语言的实现。AspectJ 实际上是对 AOP 编程思想的一个实现,它能够和 Java 配合起来使用。

AspectJ 的核心就是它的编译器 (ajc),它就做了一件事,将 AspectJ 的代码在编译期插入到目标程序当中,运行时跟在其 它地方没什么两样。因此想要使用它最关键的就是使用它的编译器去编译代码。ajc 会构建目标程序与 AspectJ 代码的联系, 在编译期将 AspectJ 代码插入被切出的 PointCut 中,达到 AOP 的目的。

关于 AspectJ 更详细的介绍,可以参考其官网: http://www.eclipse.org/aspectj/

原理概述

对于 Android 系统中的 View,它的点击处理逻辑,都是通过设置相应的 OnClickListener,然后重写相应的方法实现的。 比如对于 Button、ImageView 等控件,它设置的 listener 均是 android.view.View.OnClickListener,然后重写 onClick (android.view.View) 方法。我们只要在其 onClick(android.view.View) 方法中插入埋点代码,即可做到自动埋点。 我们可以把 AspectJ 的处理脚本放到自定义的插件里,之后编写相应的切面类,然后我们再定义合适的 PointCut 用来匹 配我们的织入目标方法,比如 android.view.View.OnClickListener.onClick(android.view.View),最后在编译期间插入埋 点代码,从而就可达到自动埋点的效果。

实现步骤

完整的项目源码后续会 release 给大家。

缺点

• 无法织入第三方的库

• 由于定义的切点依赖编程语言,该方案无法兼容 Lambda 语法

• 会有一些兼容性方面的问题,比如:D8、Gradle 4.x 等

知识点

• AOP

• AspectJ

• Gradle

• Gradle Plugin

• 注解

参考资料

[1] https://www.cnblogs.com/yangyquin/p/5462488.html

[2] http://www.360doc.com/content/11/0414/16/3639038_109610987.shtml

[3] https://www.jianshu.com/p/873eaee38cc1

[4] https://www.jianshu.com/p/aa1112dbebc7

[5] https://deemons.cn/2017/10/16/ 自定义 %20Gradle%20 插件 /

[6] https://blog.csdn.net/Deemons/article/details/78473874

[7] https://github.com/uPhyca/gradle-android-aspectj-plugin

[8] https://github.com/JakeWharton/hugo

[9] https://github.com/HujiangTechnology/gradle plugin android_aspectjx [10] https://www.eclipse.org/aspectj/

注:该内容来自神策数据用户行为洞察研究院出品的《Android 全埋点解决方案》白皮书,查看完整白皮书可点击 《Android 全埋点解决方案》

更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~ Android 全埋点解决方案之 AspectJ

原文 

http://www.sensorsdata.cn/blog/20181206-8/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Android 全埋点解决方案之 AspectJ

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址