Skip to content

部署自愈机制

增量编译成功后,Jugg 已经得到本轮 class、DEX、资源或 assets 等局部产物。ADB 暂时离线、当前进程无法接收 class、设备 checkpoint 不匹配等部署失败,并不表示这些产物需要重新编译。

部署自愈会保留已经生成的产物,先改变传输条件、生效方式或设备状态。只有这些恢复路径仍不能形成可信结果时,才结束本轮或把 Gradle 回退资格交给 Run 层。

恢复范围按失败边界逐步扩大

text
部署失败
  -> 传输条件可恢复:有限重试
  -> 当前进程无法应用:切换 Hot Fix 或兼容部署
  -> 设备状态不可信:Recover
  -> Recover 无法恢复:重新安装当前 APK
  -> 仍然失败:结束本轮,或由 Run 层决定 Gradle 回退

每一步都需要改变导致失败的条件。相同命令在相同状态下持续失败时不会无限重试。

传输失败只重试已知可恢复错误

ADB 短暂离线、可恢复的 I/O 错误或部署超时可以继续使用原部署数据。Jugg 会等待设备连接恢复、降低单次 overlay 数量,或在有限次数后扩大到重新安装。

Direct Overlay 在修改 overlay 目录之前失败,可以退回普通 Apply Changes。写入已经开始后失败,设备可能处于半提交状态,不能继续使用原 checkpoint;后续恢复会禁用 Direct Overlay,先清理或重新安装。具体边界见Direct Overlay 部署机制

当前进程无法应用时改变生效方式

class redefine 返回 unmodifiable class、在线替换内部错误或要求 App 重启时,Jugg 会把原本准备在线应用的 class 转为 Hot Fix,重启 App 后加载。

agent 无响应、JVMTI 不可用或设备环境不适合普通 Apply Changes 时,会改走兼容部署。兼容部署重新组织现有 class 和资源产物,不重新分析源码,也不重新执行编译。

checkpoint 不匹配时先 Recover

增量数据建立在上一轮成功状态上。本地部署历史、Android Studio deployment cache 和设备 overlay ID 指向不同结果时,继续写入会产生无法确认的混合状态。

Recover 会先验证设备是否仍能承接预期差异。状态能够重新对齐时继续本轮部署;App 不存在、被外部覆盖安装或校验失败时,恢复范围扩大到重新安装当前 APK。三处 checkpoint 的具体语义见部署状态与恢复

重新安装修复设备状态

重新安装使用当前可信 APK,让设备回到已知起点。安装完成后,Jugg 会重建 deployment cache 和 overlay ID,并重新组织本轮已经编译的 class、资源和 assets。

这类 reinstall 修复的是设备状态,通常不执行 Gradle。用户主动选择的 Clean Reinstall 还会清理 App 数据,适用于需要显式测试干净安装环境的场景。

Run 层决定是否回到 Gradle

Retry、Hot Fix、兼容部署、Recover 和 reinstall 都无法完成时,部署结果会携带真实失败原因以及是否允许 Gradle 回退。

自动回退开启且所有失败设备都允许时,Run 层会重新执行完整 Gradle 构建和安装。用户取消、设备丢失、安装受系统限制或其它无法安全恢复的失败会直接结束,不伪造成功,也不强行扩大处理范围。

多设备运行中的 Gradle 回退以整轮 Run 为单位。不能只让失败设备进入新的 APK 基线,而让其它设备继续停在旧的增量结果上。

相关页面