技术经验谈 技术经验谈
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hss01248

一号线程序员
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 最佳实践

  • ui

  • 优化

  • aop

    • ASM
    • aop
      • 一个asm实现的方法拦截器
      • 工具
      • 修改前后对比
      • 语法
      • 生成的代码内容:
      • 工具
        • 插件使用指导
        • 专门给aspectj用的log工具
      • 出现编译文件的解决办法
      • 替换第三方库的某个类
      • 对系统/语言 sdk内部进行hook
    • aspecj的一些常用语法
    • 随意修改第三方库代码
  • apm

  • 架构

  • webview

  • rxjava

  • activity-fragment-view的回调和日志
  • Android加密相关
  • Android命令行操作
  • app后台任务
  • kotlin
  • kotlin漫谈
  • kotlin语言导论
  • sentry上传mapping.txt文件
  • so放于远程动态加载方案
  • states
  • Xposed模块开发
  • 一个关于manifest合并的猥琐操作
  • 玩坏android存储
  • 获取本app的安装来源信息
  • Android
  • aop
hss01248
2021-07-12
目录

aop

# AOP

# ASM

# 一个asm实现的方法拦截器

https://github.com/zhuguohui/MehodInterceptor

# java assist

# 工具

https://github.com/didi/DroidAssist/blob/master/docs/wiki.md

在方法调用的地方进行修改,可以修改系统api的调用.但不能修改系统api内部实现.

需要把替换写到xml里

# 修改前后对比

<Replace>
    <MethodCall>
        <Source>
           int android.util.Log.d(java.lang.String,java.lang.String)
        </Source>
        <Target>
            $_=com.didichuxing.tools.test.LogUtils.log($1,$2);
        </Target>
    </MethodCall>
</Replace>
1
2
3
4
5
6
7
8
9
10

处理前的class:

public class MainActivity extends Activity {
    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "MainActivity onCreate");
    }
}
1
2
3
4
5
6
7
8
9

处理后的 class:

public class MainActivity extends Activity {
    public static final String TAG = "MainActivity";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String var2 = "MainActivity";
	    String var3 = "MainActivity onCreate";
        int var4 = LogUtils.log(var2, var3); // The target method using custom log method.
    }
}
1
2
3
4
5
6
7
8
9
10

# aspectJ

针对方法,修改的内容存在方法内部. 因此无法修改系统api, java,Android等系统sdk的api

优势: 直接在java代码里写实现,仅通过注解来连接切面

# 语法

https://www.cnblogs.com/gy19920604/p/6051249.html

# 生成的代码内容:

image-20201127172113969

# 工具

https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx

# 插件使用指导

环境:

Android studio4

com.android.tools.build:gradle:4.1.0"

gradle-6.5

在项目根目录的build.gradle

buildscript {
  ...
    dependencies {
      ...
      classpath "com.android.tools.build:gradle:4.1.0"
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
    }
}
1
2
3
4
5
6
7
8

写一个单独的gradle文件,apply到主项目的build.gradle:

比如文件名为aspectjconfig.gradle

那么使用apply from: "aspectjconfig.gradle"

该脚本内容为:

project.dependencies{
    implementation 'org.aspectj:aspectjrt:1.9.5'
   api 'com.github.hss01248.aop-android:logforaop:1.0.1'
}
def isNoop(){
    for (String s : gradle.startParameter.taskNames) {
        if (s.contains("ultiChannel") | s.contains("elease")) {
            return true
        } else if (s.contains("ebug") | s.contains("ommon")) {
            return false
        }
    }
    return null
}
if(!isNoop()){
    apply plugin: 'com.hujiang.android-aspectjx'
//为加快编译速度,需要自己将扫描的包路径添加到include里.  性能差距: 4min vs 4s
    aspectjx {
//排除所有package路径中包含`android.support`的class文件及库(jar文件):Invalid byte tag in constant pool
        exclude 'com.google','com.taobao','com.alibaba','module-info','com.squareup.haha','versions.9','com.tencent',,'android.support',
                'androidx',
                'com.squareup',
                'com.alipay',
                'org.apache',
                'com.alipay',
                'com.facebook',
                'cn.jiguang',
                'com.github',
                'com.meizu',
                'com.huawei',
                'com.qiyukf',
                'com.sina',
                'io.reactivex',
                'de.greenrobot.event',
                'com.netease.neliveplayer',
                'com.umeng',
                'im.yixin',
                'com.commonsware',
                'io.fabric',
                'rx.android',
                'com.android'
        //必须要加入aspect注解所在的包路径
        include 'xxx'
      
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 专门给aspectj用的log工具

api 'com.github.hss01248.aop-android:logforaop:1.0.1'
1

给切面打印类名,对象hash,方法名,方法参数值,返回值,耗时

# 出现编译文件的解决办法

  • 检查切面表达式是否正确,一般出现zip file is empty, not found,可能是表达式错误
  • exclude掉报错里出现的包路径,类

# 其他骚操作

# 替换第三方库的某个类

https://github.com/skyNet2017/JarFilterPlugin

# 对系统/语言 sdk内部进行hook

epic等

编辑 (opens new window)
上次更新: 2022/08/25, 20:20:31
ASM
aspecj的一些常用语法

← ASM aspecj的一些常用语法→

最近更新
01
截图后的自动压缩工具
12-27
02
图片视频文件根据exif批量重命名
12-27
03
chatgpt图片识别描述功能
02-20
更多文章>
Theme by Vdoing | Copyright © 2020-2025 | 粤ICP备20041795号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式