[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)
- Android
- 四大组件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介绍
- MessageQueue详细
- 启动流程
- 系统启动流程
- 应用启动流程
- Activity启动流程
- View
- view绘制
- view事件传递
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大数据
- Binder小结
- Android组件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 迁移与修复
- Sqlite内核
- Sqlite优化v2
- sqlite索引
- sqlite之wal
- sqlite之锁机制
- 网络
- 基础
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP进化图
- HTTP小结
- 实践
- 网络优化
- Json
- ProtoBuffer
- 断点续传
- 性能
- 卡顿
- 卡顿监控
- ANR
- ANR监控
- 内存
- 内存问题与优化
- 图片内存优化
- 线下内存监控
- 线上内存监控
- 启动优化
- 死锁监控
- 崩溃监控
- 包体积优化
- UI渲染优化
- UI常规优化
- I/O监控
- 电量监控
- 第三方框架
- 网络框架
- Volley
- Okhttp
- 网络框架n问
- OkHttp原理N问
- 设计模式
- EventBus
- Rxjava
- 图片
- ImageWoker
- Gilde的优化
- APT
- 依赖注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 协程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 运行期Java-hook技术
- 编译期hook
- ASM
- Transform增量编译
- 运行期Native-hook技术
- 热修复
- 插件化
- AAB
- Shadow
- 虚拟机
- 其他
- UI自动化
- JavaParser
- Android Line
- 编译
- 疑难杂症
- Android11滑动异常
- 方案
- 工业化
- 模块化
- 隐私合规
- 动态化
- 项目管理
- 业务启动优化
- 业务架构设计
- 性能优化case
- 性能优化-排查思路
- 性能优化-现有方案
- 登录
- 搜索
- C++
- NDK入门
- 跨平台
- H5
- Flutter
- Flutter 性能优化
- 数据跨平台