aspectjxandroid中快速集成使用一款aop框架并附加数据埋点解决方案实现(代码片段)

邹奇 邹奇     2022-12-12     596

关键词:

文章目录

背景


主要是记录学习 AOP 编程思想。项目中数据埋点统一方案有使用到,也是一次加深学习理解的过程。

什么是 AOP


AOPAspect-Oriented Programming 缩写,即面向切面编程。提倡针对同一类问题的统一处理方法。

AOP 这种编程思想有哪些作用呢?一般来说,主要用于不想侵入原有代码的场景中,例如SDK 需要无侵入的在宿主中插入一些代码,做日志埋点、性能监控、动态权限控制、甚至是代码调试等。

AspectJX


一个基于 AspectJ 并在此基础上扩展出来可应用于 Android 开发平台的 AOP 框架,可作用于java 源码,class 文件及 jar 包,同时支持 kotlin 的应用。

  • 目前 AspectJX 仅支持 annotation 的方式

【 Github AspectJX 】点击了解更多

问:编译时会出现 can’t determine superclass of missing type** 及其他编译错误怎么办?

答:大部分情况下把出现问题相关的 class 文件或者库(jar 文件)过滤掉就可以搞定了

集成使用

具体配置


  • 在项目根目录的 build.gradle 里依赖 AspectJX。如下:
dependencies 

        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    
  • 在项目中 app 模块的 build.gradle 里应用插件。如下:
apply plugin: 'android-aspectjx'
  • AspectJX配置

AspectJX 默认会处理所有的二进制代码文件和库,为了提升编译效率及规避部分第三方库出现的编译兼容性问题,AspectJX 提供 include, exclude 命令来过滤需要处理的文件及排除某些文件(包括 class 文件及 jar 文件)。

配置在对应模块的 gradle 文件下,如下:

android
	aspectjx
		// 配置规则
	

示例配置如下:

aspectjx 
//排除所有package路径中包含`android.support`的class文件及库(jar文件)
	exclude 'android.support'

aspectjx 
//忽略所有的class文件及jar文件,相当于AspectJX不生效
	exclude '*'

更多详细规则使用自行查阅 Github AspectJX 框架相关知识了解。

  • 模块的 gradle 中添加 dependencies 依赖。如下:
dependencies 
	implementation 'org.aspectj:aspectjrt:1.9.5'

  • 配置编译选项支持 java 8
android
	compileOptions 
        targetCompatibility 1.8
        sourceCompatibility 1.8
    

这样可以保证编译时不会报错异常,建议加上。到这里就完成了所有的配置,然后就可以愉快的 coding

Demo 中使用


  • MainActivity.java 中新增一个方法 void doAspectJX(String s),并在 onCreate 中调用,保证程序运行时能执行到这个方法。如下:
@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doAspectJX("");
    

    private void doAspectJX(String s)

    
  • 创建一个 MyAspectJX.java 自定义类,然后在合适的时机切入。如下:
@Aspect
public class MyAspectJX 

    @After("execution(* *..MainActivity.doAspectJX*(..))")
    public void test(JoinPoint point)
        try 
        
            MethodSignature methodSignature = (MethodSignature) point.getSignature();
            String methodName = methodSignature.getName();
            System.out.println(":> methodName: " + methodName);

        catch (Exception e)
            e.printStackTrace();
        
    

几点说明:

  • 切入类需要使用 @Aspect 注解进行标识
  • 根据自定义的切入规则,在程序运行过程中,满足规则时进行切入

示例中规则为:@After("execution(* *..MainActivity.doAspectJX*(..))")

表示:当程序执行完 MainActivity 类中的 doAspectJX() 这个方法之后进行切入。

更多规则同学们自行学习使用。

  • 切入验证

我们切入后,打印切入的方法名称。运行程序后打印结果如下:


上图所示,说明成功切入了,打印方法名称 doAspectJX

到这里就完成了从集成到简单应用的一个整体流程。

拓展实现:数据埋点解决方案

准备工作


上面也谈到了 AOP 编程思想可用于埋点功能的实现,下面我们一起实现一下。

  • 首先新建一个接口,命名为 Behavior.java 。如下:
public interface Behavior 

    Map<String, Object> params();


这个接口,可以供需要埋点的类实现,然后通过实现 param() 方法,把需要埋点的参数和值保存到 map 中返回即可。

  • 自定义 DataPoint.java 注解。如下:
/**
 * 自定义 DataPoint 注解
 * 切入规则使用:仅标记方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataPoint 

使用注解来标记方法,可以很方便的指定切入规则,在合适时机进行切入获取数据,然后就可以愉快的上报数据了。

完整代码实现


  • MainActivity.java 代码如下:
// 实现 Behavior 接口
public class MainActivity extends AppCompatActivity implements Behavior

    Map<String, Object> map = new HashMap<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doAspectJX("");
    

    @DataPoint
    private void doAspectJX(String s)
        System.out.println(":> doAspectJX 执行");
        map.put("name", "imxiaoqi");
    

    @Override
    public Map<String, Object> params() 
        return map;
    

  • 切入类 MyAspectJX.java 代码如下:
@Aspect
public class MyAspectJX 

//    @After("execution(* *..MainActivity+.on*(..))")
//    @After("execution(* *..*.doAspectJX(..))")
    @After("execution(@DataPoint * *..*.*(..))")
    public void test(JoinPoint point)
        try 

            // 获取被切入的类对象
            // 示例中 MainActivity 实现了 Behavior 接口,故可以类型强转为 Behavior
            Behavior behavior = (Behavior) point.getThis();
            // 获取数据,存于 Map 中
            Map<String, Object> map = behavior.params();
            System.out.println(":> 成功切入,获取 name: " + map.get("name"));

        catch (Exception e)
            e.printStackTrace();
        
    



@After("execution(@DataPoint * *..*.*(..))") 表示:任意类型 任意包下的任意类里的任意方法,并且方法添加了 DataPoint 注解,会在方法执行完后立即切入。

这样就会只在添加了注解的方法执行完后进行切入,可以对程序的整体性能影响降到最低。

  • 运行结果

上图所示,切入成功,数据也正常获取。

然后就可以愉快的将该数据埋点解决方案应用于项目中去了。

参考文章


AspectJ在Android 中的使用攻略

Android中使用AspectJ


技术永不眠!我们下期见!

aspectjxandroid中快速集成使用一款aop框架并附加数据埋点解决方案实现(代码片段)

文章目录背景什么是AOPAspectJX集成使用具体配置Demo中使用拓展实现:数据埋点解决方案准备工作完整代码实现参考文章背景主要是记录学习AOP编程思想。项目中数据埋点统一方案有使用到,也是一次加深学习理解的过程... 查看详情

aspectjxandroid中快速集成使用一款aop框架并附加数据埋点解决方案实现(代码片段)

文章目录背景什么是AOPAspectJX集成使用具体配置Demo中使用拓展实现:数据埋点解决方案准备工作完整代码实现参考文章背景主要是记录学习AOP编程思想。项目中数据埋点统一方案有使用到,也是一次加深学习理解的过程... 查看详情

如何快速地开发一款androidapp

...可以多用用,如果是大公司尽量自己写。参考技术A想要快速的方法有:1、WEBAPP开发相较原生的较快。2、增加开发人员,也能加快开发速度3、套用模板比较快,例如一些在线的开发平台,普遍是这种方式,十几分钟完成 参考技... 查看详情

vue与uikit集成

...t是YOOtheme团队开发的一款轻量级、模块化的前端框架,可快速构建强大的前端web界面。UIKit使用的变量基于LESS,具有体积小、模块化、可轻松地自定义主题及响应式设计可在多种环境中使用等特点。UIkit中文网为广大国内开发者... 查看详情

为啥utools有很多后台

...方版界面美观大方,功能强劲实用,可以将uTools变成一个快速启动应用,也支持拼音、拼音首字母、英文、英文驼峰搜索,使用起来简单便捷,大家看看就会了。uTools官方版是一款快速搜索工具,跨平台支持Windows与Mac,以插件... 查看详情

想找一款b/s架构的快速开发平台,请大家帮忙推荐一款。

现在的快速开发平台90%以上都是B/S架构的,基于JAVA开发的平台也很多。大型的有普元的eos,中型的有PBS、AS快速开发平台等。AS快速开发平台是采用Java技术开发,支持跨平台、多种数据库的部署需求,并集成了JBoss应用服务器,... 查看详情

python集成开发环境都有哪些

...arm不论是在Windows、MacOSX系统中,还是在Linux系统中都支持快速安装和使用。PyCharm直接支持Python开发环境,打开一个新的文件然后就可以开始编写代码,也可以在PyCharm中直接运行和调试Python程序,它还支持源码管理和项目,并且... 查看详情

如何使用cocoapods将智能生活appsdkios版快速集成到项目中(代码片段)

...文将为大家介绍如何使用CocoaPods将涂鸦智能生活AppSDKiOS版快速集成到项目中。注意:SDK要求iOS版本不低于11.0。集成SDK使用CocoaPods集成更新CocoaPods至最新版本(CocoaPods的使用可参考 CocoaPods官方文档)。在 Podfile 文件... 查看详情

worldpress快速入门篇

一、WordPress运行环境1、Wordpress运行,需要怎样的环境?2、如何搭建WordPres的本地运行环境?WordPress运行环境,可以分为:本地运行环境和真实运行环境。本地运行环境:在你自己的电脑上搭建出一个可以让WordPress正常运行的环... 查看详情

jenkins使用手册——软件安装(代码片段)

@TOC目的持续集成作为软件开发的一种实践,其快速且频繁集成的特性使得产品与项目可以保持高速迭代的同时还可以保持高质量。而Jenkins作为一款优秀的开源持续集成工具,提供给了开发、测试、运维各个角色强大的自动化构... 查看详情

“使用我的信用卡或借记卡付款”选项未出现在 Paypal 快速结帐集成中

】“使用我的信用卡或借记卡付款”选项未出现在Paypal快速结帐集成中【英文标题】:\'Paywithmycreditordebitcard\'optionisnotcomminginPaypalexpresscheckoutintegration【发布时间】:2013-09-0301:36:06【问题描述】:我在商家帐户test@yahoo.com(其美国... 查看详情

组件分享之后端组件——一款基于golang的认证全套模块casdoor

...SSO)平台,与CasbinRBAC和ABAC权限管理集成。能让我们的系统快速集成一套完整的认证体系,同时它支持第三方应用程序登录,包括国内国外常见的平台,具体可查看官方描述,这里就不具体说明了。以下是官方说明的一些特点:这... 查看详情

快速集成 .Net Web App

】快速集成.NetWebApp【英文标题】:SpreedlyIntegration.NetWebApp【发布时间】:2011-09-0519:11:09【问题描述】:我正在考虑将Spreedly集成到我的网络应用程序中以处理付款和订阅。这是一个.NetMVC应用程序,但如果需要,我可以在.NetWebForms... 查看详情

python集成开发环境有哪些?

...arm不论是在Windows、MacOSX系统中,还是在Linux系统中都支持快速安装和使用。PyCharm直接支持Python开发环境,打开一个新的文件然后就可以开始编写代码,也可以在PyCharm中直接运行和调试Python程序,它还支持源码管理和项目,并且... 查看详情

使用keras快速构建集成卷积网络模型(代码片段)

在统计学和机器学习领域,集成方法(ensemblemethod)使用多种学习算法以获得更好的预测性能(相比单独使用其中任何一种算法)。和统计力学中的统计集成(通常是无穷集合)不同,一个机器学习... 查看详情

集成与持续集成介绍(代码片段)

...)将代码集成到主干。1.3使用持续集成带来的好处(1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。(2)节省人力成本(3)加快软件开发进度(4)实时交付1.4为什么要使用持续... 查看详情

学习springboot

什么是springboot?springboot是一款快速开发的框架,能够快速整合第三方框架,全部采用注解的方式,内置tomcat容器,springboot的web组件默认集成的是springMVC框架。优点:1.省去了各种繁琐的配置,开箱即用。2.可以打jar包直接使用ja... 查看详情

快速集成上拉下拉刷新

在ios7之前,一直在使用开源的EGO库。但是,在使用过程中发现,普遍封装得过于复杂、耦合性强,不利于集成到自己的项目中。另外,在ios7之后,一些原有的下拉刷新,上提加载控件表现的就不是那么出色了。除了... 查看详情