Skip to content

KMP 与 Compose Multiplatform

Jugg 支持 Android 目标中的 KMP expect / actual 源码增量编译,也支持新增或修改 Compose Multiplatform 资源。两类能力都依赖 Gradle 同步提供的项目模型:Jugg 复用已有编译关系和资源生成配置,不根据目录名称猜测项目结构。

普通 Android 模块中的 Compose UI 源码属于 Kotlin Compose,不需要启用 KMP 或 Compose Multiplatform 资源能力。

支持范围

KMP 源码

场景支持情况说明
修改 common 与 Android source set 中的 expect / actual 源码支持按 Gradle 提供的 Android 目标编译模型,将必要的公共源码与平台源码放入同一轮编译
使用 sharedMain 等中间 source set支持需要 Gradle 模型暴露对应 fragment 及其依赖关系
Kotlin 1.9 与 K2 项目支持按项目实际编译模型处理缓存和 fragment 差异
互补源码信息缺失或关系不明确Best-effort保留当前已确认的源码输入,不根据文件名或目录名补猜 expect / actual 关系
普通 Android 模块中恰好存在 commonMain 目录不自动按 KMP 处理是否属于 KMP 由 Gradle 编译模型决定
删除 KMP 源文件需要 Gradle增量链路不处理删除后的完整输出清理

Compose Multiplatform 资源

场景支持情况说明
新增或修改 stringdrawablefont 资源支持生成并编译类型安全 accessor,同时准备运行时资源
新增或修改 string-arrayplurals现代资源链路支持旧版资源链路不支持这两类 accessor
新增或修改 files/ 资源支持部署不生成类型安全 accessor
使用自定义 Compose 资源目录支持目录必须出现在 Gradle 同步得到的资源任务元数据中
将生成的 accessor 同步到 IDEBest-effort同步失败只影响 IDE 浏览和索引,不会把已完成的编译结果判定为失败
删除 Compose Multiplatform 资源需要 Gradle删除可能改变 accessor 集合和资源清单,需要完整任务重新计算
当前 Compose 插件任务或 generator API 无法识别明确失败不会静默改按 Android res/ 资源处理

触发与结果

KMP 源码变更沿用源码编译链路:

text
识别 Android 目标的 Kotlin 编译模型
  → 补齐本轮必需的公共、平台和中间 source set 源码
  → 编译 Kotlin 输出
  → 转换并部署增量 DEX

Compose Multiplatform 资源由独立资源链路处理:

text
读取 Gradle 资源任务元数据
  → 使用项目 Compose 插件提供的 generator 生成 accessor
  → 编译 accessor,并准备发生变化的运行时资源
  → 部署资源;存在有效资源变更时重启 App

Compose Multiplatform 资源不经过 Android aapt2。Jugg 会为 accessor 生成读取完整的已知资源目录,但部署范围仍限制在本轮新增或修改的资源。

使用边界

  • 新增或调整 source set、Android target、Compose 插件版本、资源目录或 Kotlin 编译参数后,先执行 Gradle 同步和至少一次完整 Gradle 编译。
  • KMP 互补关系缺失时,Jugg 只使用能够从当前模型确认的输入;若仍出现 expect / actual 或符号解析错误,使用 Gradle 编译刷新基线。
  • Compose Multiplatform accessor 的 IDE 同步属于辅助结果。编译和部署成功但编辑器暂时无法跳转时,可重新同步 Gradle,不必把它视为本轮部署失败。
  • 删除 KMP 源码或 Compose Multiplatform 资源时,直接使用 Gradle 编译,避免残留输出或 accessor。

相关页面