3. RePlugin 架构深度解析:宿主进程、插件进程、Binder 与 Intent 桥梁、资源与代码加载机制
3.1 系统边界与分层
RePlugin 将宿主与插件严格隔离为两个进程域。宿主进程持有运行时核心和插件管理逻辑,插件进程承载业务代码和资源。两者通过 Binder 与 Intent 两种桥梁通信,杜绝直接内存共享。
- 系统边界:宿主进程与插件进程之间唯一的 IPC 通道是 Binder 接口 + Activity/Service/Receiver 的 Intent 跨进程跳转。插件无法访问宿主的 ClassLoader、AssetManager 或 Application 上下文。
- 分层模型:自底向上依次为 Binder 传输层、Intent 路由层、插件代理层、业务界面层。
**关键分层图** 见下方 SVG,展示了宿主进程、插件进程、Binder/Intent 桥梁及资源/代码加载器的协作关系。
3.2 组件职责
| 组件 | 所在进程 | 核心职责 |
|---|---|---|
| Binder 服务端 | 宿主 | 接收插件 IPC 请求(获取插件信息、启动/停止插件、调用宿主服务) |
| Binder 客户端 | 插件 | 封装宿主提供的 Binder 接口,供插件业务层透明调用 |
| Intent 路由管理器 | 宿主 | 劫持插件 Activity / Service 的 Intent,替换为宿主内的代理组件,通过跨进程启动实现插件页面跳转 |
| 资源加载器 | 宿主 & 插件 | 宿主侧负责合并插件资源路径到 AssetManager;插件侧维护独立资源表,通过资源 ID 映射避免冲突 |
| 代码加载器 | 宿主 & 插件 | 宿主提供 DexClassLoader 创建插件 ClassLoader,遵循双亲委托(先找宿主类,再找插件类) |
3.3 数据流 / 控制流 / 信任链路
- 数据流:插件通过 Binder 客户端向宿主查询信息(如插件版本、宿主配置),宿主返回序列化数据;插件间通信通过宿主中转,禁止直连。
- 控制流:宿主通过 Intent 桥梁启动插件页面→宿主代理 Activity 拦截→Binder 调用插件进程创建真实页面→插件进程返回结果给代理→代理反馈给调用方。
- 信任链路:Binder 连接时宿主验证插件签名(包名 + 证书指纹);Intent 跳转时宿主校验目标插件是否已注册;ClassLoader 委托链确保插件类不能覆盖宿主核心类。
**风险识别**:Binder 接口版本不一致可能导致插件升级后调用宿主旧接口崩溃,需在 IPC 方法中增加版本号校验。
3.4 选型权衡
| 维度 | RePlugin 方案 | 与 Atlas 对比 |
|---|---|---|
| 进程隔离 | 严格(每个插件独立进程) | Atlas 默认同进程,插件崩溃影响宿主 |
| 通信开销 | Binder IPC + Intent 序列化,高 | 同进程直接调用,低 |
| 资源隔离 | 独立 AssetManager,无 ID 冲突 | 共享 AssetManager,需 R 类合并 |
| 代码加载 | 双亲委托防篡改 | 宿主全局 ClassLoader 提前加载 |
| 插件启动延迟 | 约 80-150ms(进程创建+Binder 建立) | 约 10-30ms(仅类加载) |
3.5 风险点
- Binder 线程耗尽:大量插件同时发起 IPC 请求会导致宿主 Binder 线程池饱和,需限制并发数或使用异步回调。
- Intent 劫持歧义:多个插件注册相同 Action 时,宿主路由可能错误分发,需维护确切的插件-Intent 映射表。
- 资源 ID 映射表膨胀:插件数量增多后,宿主需维护所有插件的资源 ID 映射,影响启动速度和内存。
- ClassLoader 委托死锁:插件类加载时若递归依赖宿主类,可能造成死锁,需在 DexClassLoader 父级中避免循环。
3.6 落地步骤
- 协议定义:设计 Binder AIDL 接口,包含插件注册、查询、启动、结果回调方法。
- 宿主改造:在宿主 Application 中初始化 RePlugin 核心,注册 Intent 路由表,启动 Binder 服务端。
- 插件工程:依赖 RePlugin 插件库,声明插件清单(包名、权限、Activity)并配置资源独立打包。
- 资源映射生成:构建时通过 Gradle 插件扫描插件 R.txt,生成宿主侧资源 ID 映射 JSON 文件。
- 信任链路验证:集成签名校验逻辑(宿主侧验证每个插件 APK 的签名证书)。
- 冒烟测试:启动插件 Activity、Service、BroadcastReceiver,验证 IPC 调用和资源显示正确。
3.7 验收标准
- 宿主与插件进程各自独立崩溃不相互影响。
- Binder IPC 调用在 200ms 内返回(正常网络情况)。
- Intent 路由无错误分发(手动测试 10 次跳转 0 错误)。
- 插件资源(图片、字符串、布局)与宿主资源无冲突渲染。
- 插件代码类加载无 ClassNotFoundException,宿主核心类不被插件覆盖。
- 插件启动后宿主内存增加 ≤ 5MB(不含插件自身内存)。