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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

别具光芒

别具光芒

李烨 / 人民邮电出版社 / 2006-11 / 55.00元

本书面向实用,提供了大量网页设计与制作的细节图解,由浅入深地讲解网页制作的步骤与方法,同时介绍了Web标准以及使用目前流行的“层”布局方式,并结合多个实例讲解了采用层叠样式表与层布局相结合制作网页的方法。   本书给出了几大典型网页制作实例,包括小型企业网站、电子相册网站、网络电台、网上商店、旅游网站等,这些实例基本上覆盖到了常用的网页设计与制作知识。本书在详细讲解各个实例的过程中,不仅介绍......一起来看看 《别具光芒》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试