Android字节码替换方法 DroidAssist
2022-09-02 本文已影响0人
逃离_102
说明
在如今越来越严格的隐私要求中,很多引入的第3方SDK的隐私问题是很难控制的,这就需要统一的源头插桩解决;还有对应越来越复杂的APP,很多老旧的功能,修改起来很多时候是很困难的事情,对一些通用的功能维护也是件麻烦的事情,这时候也需要统一的源头插桩解决;当然还有其他很多情况,如皮肤处理也可以用这个方法。
滴滴发布的开源项目 DroidAssist ,提供了一种简单易用、无侵入、配置化、轻量级的 Java 字节码操作方式,只需要在 XML 配置中添加简单的 Java 代码即可实现编译期对 Class 文件的动态修改。DroidAssist 和其他 AOP方案不同,它提供了一种简单易用、无侵入、配置化、轻量级的 Java 字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 XML 配置中添加简单的 Java 代码即可实现编译期对 class 文件的动态修改,同时不需要引入其他额外的依赖。这样一来就很好的解决了上面所提的几个问题,用起来也很舒服。
DroidAssist 功能
- 替换:把指定位置代码替换为指定代码
- 插入:在指定位置的前后插入指定代码
- 环绕:在指定位置环绕插入指定代码
- 增强:
TryCatch 对指定代码添加 try catch 代码
Timing 对指定代码添加耗时统计代码
DroidAssist 特点
- 灵活的配置化方式,使得一个配置就可以处理项目中所有的 class 文件。
- 丰富的字节码处理功能,针对 Android 移动端的特点提供了例如代码替换,添加try catch,方法耗时等功能。
- 简单易用,只需要依赖一个插件,处理过程以及处理后的代码中也不需要添加额外的依赖。
- 处理速度较快,只占用较少的编译时间。
DroidAssist 局限
- 由于 Javassist 的机制,DroidAssist 在处理的过程中将会产生额外的局部变量用以指向参数变量和保存返回值,但处理后有一些局部变量并没有实际作用。
- DroidAssist 在处理某些代码时可能会新增一些额外的代理方法。
- DroidAssist 插件用于 library model 只能处理 Java 源码产生的 class,不能处理本地依赖中的 jar 。
源码地址
https://github.com/didi/DroidAssist;使用方法,简介都在这说的很清楚了,照着来就好。