AOP切面编程在android上的应用

前言

切面编程一直是一个热点的话题,这篇文章讲讲一个第三方aop库在android上的应用。

本篇文章参考以下链接:
AOP第三方库

这章涉及到以下内容:

  1. aop库的配置
  2. aop导入问题解决
  3. aop的使用
  4. aop混淆
一. aop库的配置

在你的porject的build.gradle中做以下配置:

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'

        //AOP切面编程依赖
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.1.1'
        classpath 'org.aspectj:aspectjtools:1.8.13'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在 app module 的buildle.gradle中做如下配置:

 //AOP切面编程依赖
    compile 'com.safframework:saf-aop:1.2.0'
    //rxjava2.x
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'
    //AOP切面编程Cache依赖
    implementation 'com.safframework:saf-cache:1.1.0'
    implementation 'tony-common:tony-common-utils:1.2.4'
    //AOP切面编程Log依赖
    implementation 'com.safframework.log:saf-log:1.5.0'
    //AOP切面编程AppPrefs依赖
    implementation 'com.safframework.injectview:saf-injectview:1.0.0'
    annotationProcessor 'com.safframework.injectview:saf-injectview-compiler:1.0.0'

需要注意的是,AOP库使用的时候,也要添加RxJava2.X的引用。

二. aop导入问题解决

在导入切面编程库依赖的时候,可能会出现如下问题:

Error:Execution failed for task ':app:transformClassesWithExtractJarsForDebug'.
> Unexpected scopes found in folder 'C:\my_demo_test\TestDemo\app\build\intermediates\transforms\AspectTransform\debug'. 
Required: SUB_PROJECTS. Found: 
EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS

解决方案如下:

造成上述问题是由于as版本,需将Android studio的instant run关闭。具体如下: 
Settings → Build, Execution, Deployment → Instant Run and uncheck Enable Instant Run.

配图如下:

image.png

解决此方法,大家也可以参考链接
android aspectJ报错“transformClassesWithExtractJarsForDebug“

三. aop的使用

AOP涉及的注解有以下几个:


image.png

下面对各注解依次讲解:

3.1 Async异步注解

使用类似如下:

  @Async
    private void AsyncTest(){
        LogUtil.e("====当前线程===="+Thread.currentThread().getId());
        LogUtil.e("====主线程===="+ Looper.getMainLooper().getThread().getId());
    }

在主线程中调用 AsyncTest 方法,会发现其运行在一个不同于主线程的子线程中。

3.2 Cacheable缓存注解

存储数据如下:

    @Cacheable(key = "name")
    private String putCache(){
        return "我是谁";
    }

获取缓存数据:

  private String getCache(){
        Cache cache=Cache.get(CacheActivity.this);
        //Cache的存取方式就是Acache,只不过存储地址改成了缓存而已
        String name=cache.getString("name");
        return name;
    }
3.3 Log注解

你可以类似这样使用:

    @LogMethod
    private void log1(){
        LogUtil.e("=====log1======");
    }

    @LogMethod
    private String log2(String s){
        LogUtil.e("=====log2======"+s);
        return s;
    }

然后在需要用到的地方直接调用 log1 和 log2 方法就可以打印log了,它最大的好处是不会在代码中穿插各种 Log代码。

3.4 Hook注解

使用范例:

   @HookMethod(beforeMethod = "before",afterMethod = "after")
   private void getMachine(){
       LogUtil.e("======getMachine=====");
   }

   private void before(){
       LogUtil.e("====开始时间=======");
   }

    private void after(){
        LogUtil.e("====结束时间=======");
    }

然后在调用getMachine方法的时候,你会收到这样的log


image.png

这个可以用来监测一个方法执行的用时,当然,你在声明Hook注解的时候必须包含 beforeMethod,afterMethod中的一个或同时具有,若不声明,则Hook使用无效

3.5 Prefs注解

类似手机上的文件存储,存值你可以这样操作:

  @Prefs(key = "key")
    private String putPrefs(){
        return "大家好";
    }

取值是这样的:

  private String getPrefs(){
        AppPrefs appPrefs=AppPrefs.get(PrefsActivity.this);
        String key=appPrefs.getString("key",null);
        return key;
    }
3.6 safe注解

保证代码执行安全的,若不想代码抛出异常,你可以这样处理:

   @Safe
    private void testStringLength(){
        String msg=null;
        int length=msg.length();
    }

这样,你在调用 testStringLength 方法的时候就不会报错了。

3.6 Trace注解

可以用来监测方法执行时长,使用时类似这样:

  @Trace
    private void testTrace(){

        Observable.create(new ObservableOnSubscribe<String>() {
            @Trace
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {

                e.onNext("111");


            }
        }).subscribe(new Consumer<String>() {

            @Trace
            @Override
            public void accept(@NonNull String str) throws Exception {

            }
        });
    }

调用 testTrace 方法之后,在log 的 i 级别中,你可以看到这样的log


image.png

这里,我们就可以很清楚的看到每个方法的执行时间了。

四. 混淆

混淆的话,可以这样处理

-keep class com.safframework.aop.** { *; }

ok,今天就讲到这里,谢谢诶。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • title: Android AOP之字节码插桩author: 陶超description: 实现数据收集SDK时...
    陶菜菜阅读 38,095评论 40 182
  • 算法一直是我们重视的话题的主人,什么样的网站HITS算法,我们都知道,期望站长们是准确的,它没有再加鼓励,它逐一清...
    苏小魂阅读 242评论 0 0
  • 今天早上孩子不到6点就醒了,醒了后来到了我们的房间,看到她这么早醒了,我也跟着起来了,跟她一起复习了以前学...
    李梓旭妈妈阅读 95评论 0 1