Skip to content

回退与限制

Jugg 的增量编译依赖最近一次可信的 Gradle 构建产物。回退 Gradle 不是增量链路失效,而是重新生成 APK、class、注解器生成源码和其他基线产物,让下一轮增量可以继续运行。

增量必须建立在可信起点上

“只编译变化部分”的前提是有一份可信的基线。基线缺失、修改范围超出增量能力、设备或部署现场不可信时,Jugg 无法证明当前上下文与完整 Gradle 构建一致,会回到 Gradle 重建基线。回退保护的是后续运行结果,不是对增量能力的否定。

识别失信信号,回到 Gradle 重建基线

回退由三类失信信号触发:没有可信基线、当前修改超出增量能力、设备或部署现场不可信。命中任意一类,Jugg 都会回到 Gradle 重建可信起点,而不是带着不确定状态继续增量。

场景原因
首次运行没有可复用的 Gradle 基线产物
build.gradle 变化构建配置和依赖需要重新读取
注解处理器或插桩场景依赖 Gradle 上下文,增量参数难以确认
一次性修改文件很多增量收益下降,完整构建更稳妥
Manifest 更新Manifest 需要写回 APK 并安装
设备或部署现场不可信继续部署会基于未经校验的设备状态
用户主动降级用完整构建刷新基线

这些场景的共同点是:Jugg 无法把本轮增量上下文证明为可信。回退是重新建立可信起点,不应被误判为异常。具体触发条件和用户操作建议见 Gradle 回退

仍以 Gradle 为准的范围

Jugg 不是完整的 Gradle pipeline。以下内容仍以 Gradle 构建为准:

  • 完整发布构建和正式 APK / AAB 产物。
  • 复杂构建脚本、Gradle plugin 和 variant 逻辑。
  • 未明确支持的注解处理器、插桩和生成代码。
  • 依赖图的复杂变化。
  • 需要完整刷新资源表、Manifest、mapping 或 APK 结构的场景。

大工程里的自定义插件、非标准生成代码和复杂 variant 逻辑不属于默认增量承诺。遇到这类工程逻辑时,应先用 Gradle 刷新基线,再判断能否纳入 Jugg 增量路径。

资源增量的限制

Jugg 定制 aapt2 的增量链接后,可以基于 APK 中的 resources.arsc 和资源内容做增量 link。代价是删除的资源 ID 不会立即从资源表中移除,要等下一次 Gradle 构建刷新基线。这个能力只适用于 debug 开发,不能用于生产构建。

设备与版本的限制

设备厂商对 JVMTI / Apply Changes 的支持存在差异。Jugg 会通过自有 JVMTI Agent、兼容部署或经典热修复路径降低设备差异影响,但设备能力仍会影响本轮能否在线替换、是否需要重启,或是否需要重新安装。

相关页面