AppNest快速开发(3)AspectJX接入

本文探讨了App开发中埋点的重要性和传统实现方式的缺点,如代码侵入性高和维护成本大。文章介绍了AspectJ作为解耦和降低维护成本的新方案,详细阐述了AspectJ的背景、概念以及如何在HybridApp壳子中使用AspectJ进行埋点。还提到了Hujiang的AspectJX插件在Kotlin中的应用,以实现更便捷的AOP编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AppNest—HybridApp壳子埋点方案探讨

埋点功能为App的基础功能之一,在壳子中也做了一个基础实现的demo,是使用AspectJ实现的切面代码织入功能

前言

在实际的App使用开发过程中,一些需求跟业务不直接相关,但是可能是运营需要的一些数据。
比如:
统计按钮的点击行为
统计页面的留存时长
统计web浏览的url地址
性能监控等

之前的实现方案使用同一的工具库jar包,定义常量,上报参数等

缺点是代码侵入量较大,在需要统计的位置都需要添加代码实现,耦合度高,有修改时对整个项目中的代码都有影响,可能都要修改(之前的埋点统计我们都是当做单独的功能点来完成的,基本需要一个开发人员一个小版本的开发测试周期来完成)

为了更好的解耦,降低维护成本,衍生出了一些新方式:
hook
AspectJ
ASM

Hook

运行时,通过动态或者静态代理的方式,给目标对象的目标变量添加埋点逻辑
缺点:使用的反射的方式,对性能有影响
且每创建一个页面都需要hook一次,性能不高

ASM

ASM字节码插桩 原理和AspectJ相同,但是相对功能更加强大,可以完全操作字节码文件,查询其中的任一类,方法,变量。效率更好,自由度更高,上手难度大,对java字节码要有比较充分的了解

AspectJ

操作编译后的class文件,通过识别标志,重新生成新的class文件再打包到dex中,增加了编译时长,增加了包装的代码,运行时会有一些性能开销,但几乎可以忽略

AspectJ相对简单且足够满足集成功能,在快速开发的大前提下,比较容易上手,且能满足需求

AspectJ背景

面向切面的程序设计(aspect-oriented programming (AOP))

AOP 是 OOP(面向对象编程)的一种延续
例如:现有三个类,Horse、Pig、Dog,这三个类中都有 eat 和 run 两个方法。
通过 OOP 思想中的继承,我们可以提取出一个 Animal 的父类,然后将 eat 和 run 方法放入父类中,Horse、Pig、Dog通过继承Animal类即可自动获得 eat() 和 run() 方法。这样将会少些很多重复的代码。
但是,如果要在上面的例子中统计方法的执行时间,我就需要在eat(),run()方法中添加功能几乎完全相同的重复代码,方法开始执行时记录开始时间,方法执行完成后计算执行时间并打印,这些代码在所有方法中都几乎一样,但却不得不写。
如果有多个方法需要统计执行效率,就会出现大量的重复代码
这时AOP的思想就出现了,就是提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离
AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑
面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念
AOP是用来处理一些横向的同质化的工作
AOP中的一些概念

概念理解
Pointcut是一个(组)基于正则表达式的表达式,有点绕,就是说他本身是一个表达式,但是他是基于正则语法的。通常一个pointcut,会选取程序中的某些我们感兴趣的执行点,或者说是程序执行点的集合。
JoinPoint通过PointCut选取出来的集合中的具体的一个执行点,我们就叫JoinPoint.
Advice在选取出来的JoinPoint上要执行的操作、逻辑。
Aspect就是我们关注点的模块化。这个关注点可能会横切多个对象和模块,事务管理是横切关注点的很好的例子。它是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。又pointcut 和advice组成。
Weaving把切面应用到目标对象来创建新的 advised 对象的过程。

AspectJ基础介绍

AspectJ是一个易用的功能强大的AOP框架
AspectJ全称是Eclipse AspectJ, 其官网地址是:http://www.eclipse.org/aspectj/,目前最新版本为:1.9.7

支持的织入方式
编译期织入(Compile-time weaving)
编译后织入(Post-compile weaving)
类加载后织入(Load-time weaving)

AspectJ 的使用非常简单,是按照既定好的规则织入代码,你完全可以不关心java字节码的实现

织入位置:
1)、在方法(包括构造方法)被调用的位置。
2)、在方法体(包括构造方法)的内部。
3)、在读写变量的位置。
4)、在静态代码块内部。
5)、在异常处理的位置的前后。

通过正则标示需要织入的类

编译后遍历编译后的class文件检查编制位,织入需要插入的代码,替换原有的class文件,继续打包到dex中

使用简单,受限于其自身规则之内

hujiangAspectJX插件

沪江开源的AspectJ-android织入插件AspectJX

在Kotlin中使用AspectJX

持续更新中。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值