Gradle+ASM实战——关于隐私政策的那些思考

前言

需求背景

  • 12月底换了新公司,新公司的项目架构需要重构,所以也就有了上篇文章:BasicLibrary——基于kotlin+jetpack+mvvm封装一套框架,提高Android开发效率
  • 同时公司项目在整改隐私政策,其中有个需求就是当弹出隐私政策,点击取消应该进入简版app而不是直接杀死
  • 简版app其实有很多做法,一、直接做个h5,二、限制部分功能,三、进入首页,但是点击任何按钮弹出需要授权的隐私弹框
  • 今天我们主要讲第三种方式

解决思路

  • 每个点击按钮点击事件之前进行判断进行拦截
view.setOnClickListener(new OnClickListener() {
       public void onClick(View var1) {
                //isIntercept()自己设置是否拦截事件
                boolean isIntercept =isIntercept();
                if(!isIntercept){
                      return;
               }
              //原本的事件处理
            }
});
  • 弊端:弊端其实很明显,如果有100个点击事件,需要每个点击之前都拷贝一份
  • 这时候我们就可以考虑用ASM字节码插桩,自动在每个点击事件之前添加拦截,我们只需要需要拦截的时候设置拦截事件就可以
  • 直接看我们已经做好的ASM编译后的代码
    Gradle+ASM实战——关于隐私政策的那些思考

功能介绍

  • 可动态配置是否开启插件,默认是开启
  • 默认解决大部分多次重复点击的问题
  • 可动态设置方法对点击事件处理之前进行拦截
  • 可获取方法的耗时时间

怎样使用

ASM插件依赖

  • Step 1. Add the JitPack repository to your build file
    Add it in your root build.gradle at the end of repositories:
buildscript {
    dependencies {
        classpath "io.github.peakmain:plugin:1.0.0"
    }
}

  • Step 2. Add the Use
    Add it in your app module build.gradle at the end of repositories:
apply plugin: "com.peakmain.plugin"

拦截事件sdk的依赖

  • Step 1. Add the JitPack repository to your build file
    Add it in your root build.gradle at the end of repositories:
	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
  • Step 2. Add the dependency
	dependencies {
	       implementation 'com.github.Peakmain:AsmActualCombat:0.1.1'
	}

使用文档

  • 1、Application中初始化
  SensorsDataAPI.init(this);
  • 2、动态设置是否开启插件
    在gradle.properties中设置以下参数,false代表不关闭插件,true表示关闭插件,默认是false
peakmainPlugin.disableAppClick=false
  • 3、在要拦截的页面设置拦截事件
 SensorsDataAPI.getInstance().setOnUserAgreementListener(new SensorsDataAPI.OnUserAgreementListener() {
           @Override
            public boolean onUserAgreement() {
            
        }
 })

完整的举例代码如下:

    private void setUserAgreementListener(Activity activity) {
        isAcceptUserPrivacy = (Boolean) PreferencesUtils.getInstance(this).getParam(Constants.HAS_ACCEPT_USER_PRIVACY, false);
        SensorsDataAPI.getInstance().setOnUserAgreementListener(new SensorsDataAPI.OnUserAgreementListener() {
            @Override
            public boolean onUserAgreement() {
                if (!isAcceptUserPrivacy) {
                    //没有同意
                    AlertDialog dialog = new AlertDialog.Builder(activity)
                            .setContentView(R.layout.dialog_user_agreement)
                            .setCancelable(false)//点击空白不可取消
                            .show();
                     //设置用户协议的拦截事件为NULL
                    SensorsDataAPI.getInstance().setOnUserAgreementListener(null);
                    dialog.setOnClickListener(R.id.stv_refuse, v -> {
                        //取消按钮的点击事件
                        dialog.dismiss();
                        setUserAgreementListener(activity);
                    });
                    dialog.setOnClickListener(R.id.stv_agreement, v -> {
                    //同意按钮的点击事件
                        com.peakmain.ui.utils.ToastUtils.showLong("同意了");
                        PreferencesUtils.getInstance(activity).saveParams(Constants.HAS_ACCEPT_USER_PRIVACY, true);
                        dialog.dismiss();
                      
                    });
                }
                return isAcceptUserPrivacy;
            }
        });
  • 4、获取方法耗时时间
    在需要获取耗时时间的方法上方添加以下注解
 @LogMessageTime

总结

  • 使用起来还是很方便的,如果大家也有相关需求:希望在点击事件处理事情之前进行相关代码拦截,都可以使用这个库
  • 当然,大家最好自己下下来,在自己的项目中跑跑,然后改成自己的,可以直接让自己的B格上升,让你的领导对你刮目相看
上一篇:人工智能Java SDK:语音处理包Librosa的java实现


下一篇:KFS Oracle RAC 数据解析同步配置方法