🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 总体方案 ## 目标 独立发布(一周一个版本) ## 插件化方案选型 目前的插件化框架,大部分都是使用 hook 系统的方式来做的。使用代理的基本上没有成体系的框架,Shadow 框架的开源,在系统 api 控制越来越严格的趋势下,算是一个新的方向。 Shadow 最大的两个亮点是: 1\. 零反射 2\. 框架自身动态化 3\. 开发无感知 4\. 插件与宿主完全隔离,通过白名单桥街 ## 独立编译 ### 背景: 1. 单向依赖: 2. 插件对宿主依赖严重,直接依赖几百个,依赖的类接着依赖 ### 方案1:AS的Analyze工具 1. 只能分析一层依赖 2. 纯手工 ### 方案2: 编译前自建依赖分析插件 s1:分析插件文件对宿主的import//todo import如何转文件 s2: 工具分析插件加载宿主的依赖类,获取AST语法树(java javaparser,kotlin分析用kastree) s3: 对依赖类进行裁剪 删除 私有变量、私有方法、方法内部实现 保留对外饮用 s4:递归的对依赖类的依赖类继续处理(处理过了不在处理) s5:将裁剪过的类打包成jar,插件依赖改jar包编译。 ### 成果: 全量1m,增量30s ## 插件过程中遇到的问题 ### 插件对宿主赖需要加混淆白名单 现状:开发人员容易漏加白名单 方案:transform自动完成 ### 重复打包导致方法内联问题 现状:插件化第一次灰度,收到上报错误java.lang.IncompatibleClassChangeError,只在Android N上 分析: debug包无问题,线上包有问题,区别在于去掉重复打包 导出dex,无异常 怀疑dex2oat阶段,内联出现异常 root过的手机,将优化后的oat产物pull到电脑,然后使用oatdump反编译 方案:编译时,加上检查 ### ClassNotDef/NotSuchMethod 现状:宿主的方法改变了,插件无法感知 方案 :空test方法校验: 宿主的被调的方法生产test\\\_\\\*方法 插件动态生产一个 pluginCheck类,里面包含了对宿主方法的test方法,发送异常就推出 结果 ### 成果: 外网crash率0.01% # 参考资料 [Shadow源码解析](https://github.com/ChenSiLiang/android-toy/blob/master/Shadow%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%AC%94%E8%AE%B0/Shadow%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md) [Android 插件化的今生前世大揭秘](https://mp.weixin.qq.com/s/EuCqudpPnBRidtmZBocNYg) [Java Parser应用介绍](https://cloud.tencent.com/developer/news/740798) [QFix探索之路——手Q热补丁轻量级方案](https://mp.weixin.qq.com/s/ce22vVN5zyqY0vAkNt1DDw)