今天分享一下如何简单方便的实现代码插装~
修复第三方 bug 事情是这样的,大概在上个月,公司的 Android 项目使用了一个阿里云提供的功能(真就独一份)。因为开发测试机一直是 wifi 情况下使用,完全正常,再快上线前在使用流量的情况下会崩溃。 最后发现是阿里的这个 SDK 使用的网络判断方法还是旧版本的方式(使用了getActiveNetworkInfo,该方法已经废弃),在targetSdkVersion30 的时候回直接崩溃。询问了阿里客服,答复是下周修复,我们肯定是等不到了。(事实是现在也没修复)
如何修复是个问题 上线时间已经确定了,不可能等第三方修复了。只能自己想办法: 比如我们有这么段代码
public class Utils { public static void evil() { int a = 1 / 0; } } 我们项目在打包的时候经历了:.java -> .class -> dex -> apk,假设我们在打包的时候这么做 .java -> .class -> 拿到 Utils.class,修正里面的方法 evil 方法 -> dex -> apk。这个时机,其实构建过程中也给我们提供了,也就是传说的 Transform 阶段。(类似的 arouter、butterknife 都是同样的原理实现代码插装的)
如何修改 Utils.class 呢?可以看看鸿阳大神的 ASM 修改字节码,这样学就对了!
轻量级 aop 框架 lancet 出现 饿了么,很早的时候就开源了一个框架,叫lancet。
这个框架可以支持你,在不懂字节码的情况下,也能够完成对对应方法字节码的修改。
代入到我们刚才的思路:
.java -> .