Android 全埋点解决方案之 AspectJ

栏目: Java · 发布时间: 5年前

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

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


以上所述就是小编给大家介绍的《Android 全埋点解决方案之 AspectJ》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX网络编程 卷1:套接字联网API(第3版)

UNIX网络编程 卷1:套接字联网API(第3版)

W.Richard Stevens、Bill Fenner、Andrew M. Rudoff / 杨继张 / 人民邮电出版社 / 2010-6 / 129.00元

这是一部传世之作!顶级网络编程专家Bill Fenner和Andrew M. Rudoff应邀执笔,对W. Richard Stevens的经典作品进行修订。书中吸纳了近几年网络技术的发展,增添了IPv6、SCTP协议和密钥管理套接字等内容,深入讨论了最新的关键标准、实现和技术。 书中的所有示例都是在UNIX系统上测试通过的真实的、可运行的代码,继承了Stevens一直强调的理念:“学习网络......一起来看看 《UNIX网络编程 卷1:套接字联网API(第3版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码