# Android-AOP **Repository Path**: ddgameshop/android-aop ## Basic Information - **Project Name**: Android-AOP - **Description**: android面向切面编程的应用,主要功能包括: 1、方法参数非空判断切面 2、埋点事件切面 3、自动插入日志打印切面 4、安卓权限申请切面 5、防快速点击事件切面 6、异常捕获切面 都是基于方法的切面应用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-06-15 - **Last Updated**: 2021-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Andrid AOP应用框架 这是一个轻量级使用aspectj实现的AOP应用框架,简单使用注解的方式即能完成接入,简单易用。 ## 功能列表 * 方法参数非空判断切面 * 埋点事件切面 * 自动插入日志打印切面 * 安卓权限申请切面 * 防快速点击事件切面 * 异常捕获切面 ## 接入方式步骤 ### 1、根目录的build.gradle添加下面依赖 ``` allprojects { repositories { ... maven { url "https://jitpack.io" } } } ``` ### 2、根目录的build.gradle添加依赖dependencies添加 ``` buildscript { ··· dependencies { ··· classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8' } } ``` ### 3、在app模块的build.gradle中添加 ``` apply plugin: 'android-aspectjx' dependencies { ··· implementation 'com.gitee.ddgameshop:android-aop:v1.0.0' } ``` ### 4、项目的Application文件中onCreate添加初始化代码 ``` AndroidAOP.init(this); AndroidAOP.setmDebug(true); AndroidAOP.setmOnEventTrackCallback((int what, String[] value)->{ Toast.makeText(this, "埋点触发what=" + what + ",value=" + ArrayUtils.toString(value), Toast.LENGTH_LONG).show(); }); ``` ## 方法参数非空判断切面 * 方法上添加注解ArgsNullCheck * 参数args指定的是指定判断哪个参数非空 * 方法在被调用的时候,会自动判断参数是否为空,非空的话逻辑正常走;空的话会打断逻辑,日志答应错误信息(过滤日志关键字“ASPECT_LOG”) * 代码实例如下 ``` @ArgsNullCheck(args = { 1 }) public int getPersonalInfo(int age, String name) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return age + 20; } ``` ## 埋点事件切面 * 方法上添加注解EventTrack, * 参数:what=整型类型数值,values=字符串数组,这两个参数都会回调中原样返回,用于处理具体的业务逻辑 * 在Application中初始化AndroidAOP的时候,设置事件埋点回调,这里完成埋点的逻辑,例如:数据上报、数据记录等等 * 方法在被调用的时候,会回调Application设置的回调接口(过滤日志关键字“ASPECT_LOG”) * 代码实例如下 ``` AndroidAOP.setmOnEventTrackCallback((int what, String[] value)->{ Toast.makeText(this, "埋点触发what=" + what + ",value=" + ArrayUtils.toString(value), Toast.LENGTH_LONG).show(); }); ``` ``` @EventTrack(what = 10, value = {"参数1", "参数2"}) public void eventTrack(View view) { Log.i(TAG, "this is a EventTrack click log."); } ``` ## 自动插入日志打印切面 * 方法上添加注解InsertLog * 参数:TAG=设置日志打印时的tag字符串,该值是缺省的,默认值是“ASPECT_LOG” * 方法在被调用的时候,切面会自动构造该方法的日志信息进行打印,打印的信息包括:类名、方法名、参数、返回值、执行时间,(过滤日志关键字“ASPECT_LOG”,或者自定义的tag) * 代码实例如下 ``` @InsertLog public int getPersonalInfo(int age, String name) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return age + 20; } ``` ## 安卓权限申请切面 * 方法上添加注解RequirePermission * 参数:value=传入需要申请的权限数组 * 方法在被调用的时候,切面会完成权限的申请,如果用户禁止,打断代码逻辑;用户再次点击,再次进行权限的申请 * 代码实例如下 ``` @RequirePermission(value = {Manifest.permission.WRITE_EXTERNAL_STORAGE }) public void requirePermission(View view) { Log.i(TAG, "this is a RequirePermission click log."); } ``` ## 防快速点击事件切面 * 方法上添加注解SingleClick * 参数:value=点击时间间隔,ids=传入需要防快速点击的控件ID数组 * 方法在被调用的时候,切面会记录上次点击的时间,如果未达到设置的间隔时间,会业务打断逻辑 * 代码实例如下 ``` @SingleClick(value = 4000, ids = {R.id.singleClick}) public void singleClick(View view) { Log.i(TAG, "this is a single click log."); ++count; msg.setText("count=" + count); } ``` ## 异常捕获切面 * 方法上添加注解TryCatch * 方法在被调用的时候,切面会为该方法在外层添加一个try catch的语句进行异常捕获 * 代码实例如下 ``` @TryCatch public void tryCatch(View view) { Log.i(TAG, "this is a ArgsNullCheck click log."); int value = 1 / 0; } ``` ## 关于我 学习在出不在入