Skip to content

源码编译

Jugg 支持增量编译本轮变化的 Java 和 Kotlin 源码,并可继续处理已支持编译能力产生的源码或 class 输入。编译结果会形成可部署的 DEX 或 release 重混淆产物。资源、AndroidManifest、.so 等文件不属于本页范围;编译器隔离、Java/Kotlin 混编顺序和 DEX 结构对齐见源码增量编译原理

支持范围

用户场景当前支持情况用户可见结果
修改 Java 源码支持本轮修改进入增量编译和后续部署
修改 Kotlin 源码支持本轮修改进入增量编译和后续部署
同轮修改相互引用的 Java 与 Kotlin支持两种语言使用本轮最新声明完成编译
Kotlin Android Extensions支持旧项目兼容旧项目 synthetic 引用仍可参与增量编译
Kotlin Compose 源码支持Compose 相关 class/DEX 随本轮增量产出;详见 Kotlin Compose
已支持能力产生的源码支持作为输入DataBinding/ViewBinding明确支持的注解入口等生成源码可继续编译
已生成或转换的 class 产物支持作为输入继续生成可部署 DEX,release 场景进入重混淆处理

触发与结果

text
Java / Kotlin 或已支持的生成产物变化
  -> 编译本轮直接变化和已生成源码
  -> 必要时追加受影响源码继续编译
  -> 生成 DEX 或 release 重混淆产物
  -> 交给部署阶段

用户最常见的结果是:直接修改的源码先进入编译;如果接口、父类、常量、生成源码或 release inline 又影响了其它文件,Jugg 会在交给部署前继续追加编译。日志中出现多轮编译不代表首轮失败。

使用边界

  • 源码增量编译需要最近一次可信 Gradle 构建提供 APK、classpath、编译参数和生成源码基线;首次运行或基线失效时会先执行 Gradle。
  • 变化范围超过当前增量限制,或构建配置、依赖与 source set 上下文发生变化时,Jugg 会回退 Gradle。
  • 删除或重命名整个 Java/Kotlin 源文件时,Jugg 不会移除设备中已有的 class;旧 class 仍可能通过直接引用、反射或类加载被访问。只有需要让旧 class 真正消失时,才执行完整 Gradle 构建刷新 APK 和引用基线。
  • 生成源码需要先由对应的已支持能力产出;不应默认任意 annotation processor、KSP 或 KAPT 都可以脱离 Gradle 完整运行。
  • release/minified 场景依赖与当前 APK 匹配的 mapping 基线;基线缺失、失配或运行结果异常时,使用 Gradle release 构建重新建立基线。

相关页面