ComposeDesktopKeepKit:自动添加 Compose Desktop 依赖的混淆规则
一个根据项目依赖自动添加 ProGuard 规则的 Gradle 插件,减少多个 Compose Desktop 项目中的重复配置。

最近写了一个小工具 ComposeDesktopKeepKit,用于根据 Compose Desktop 项目的依赖,自动添加对应的 ProGuard 规则。

重复的混淆配置

Compose Desktop 可以使用 ProGuard 对 Release 产物进行收缩、优化和混淆。依赖库中的反射、SPI 服务发现、JNI 等调用,往往需要配置相应的 keep 规则才能正常工作。

按我的使用经验,Android 项目中的很多库会自带 consumer rules,接入方通常不用额外配置太多。桌面端使用的 JVM 库未必考虑了混淆场景,这部分工作经常落到应用维护者手上。

我自己的几个 Compose Desktop 项目里也维护了不少这样的规则。其中很多来自相同的第三方库,换一个项目还要再配一遍。因此,我把这些规则整理到一个 Gradle 插件中,由插件检测依赖并自动添加,省去重复配置。

按依赖应用规则

KeepKit 读取项目最终解析出的运行时依赖,包括传递依赖和冲突解决后的实际版本,再从内置规则库中选择对应规则,接入原有的 Release ProGuard 配置。应用自己的规则继续保留。

最初我也考虑过扫描 SPI、native method 等特征来生成规则,但这类机械判断很难覆盖所有情况。比如项目验证中遇到的 Okio 问题来自 ProGuard 优化,运行时会出现 VerifyError,最终需要针对部分代码限制优化。扫描动态入口并不能发现这种问题。

所以目前采用内置规则库:把具体库需要的规则整理、验证后复用。当前加入的主要是我自己的项目用到的依赖,例如 Coil、OkHttp、Okio、Coroutines、序列化、JNA、Logback、DataStore 和 OSHI。

很多规则可以跨版本使用,我也没有精力验证每个库的每个版本。因此,没有精确匹配时,插件优先选择不高于实际版本的最高规则版本;如果没有,再选择高于实际版本的最低规则版本。构建日志会显示实际版本、规则版本和匹配方式,非精确命中时需要维护者留意,并验证自己的 Release 功能。

使用方式

插件目前通过 JitPack 接入,需要先在 settings.gradle.kts 中配置插件仓库和坐标映射,具体配置见 README。完成后,在 Compose Desktop application 模块添加:

plugins {
    // 沿用项目原有的 Compose 插件配置
    id("io.github.zerofancy.compose-desktop-keep-kit") version "v0.2.4"
}

之后执行原来的 runRelease 或 Release 打包任务即可,不需要额外的规则配置块。插件生成的规则和报告放在 Gradle 用户缓存中。

KeepKit 只处理规则库已覆盖的依赖。业务代码中的反射、未覆盖的第三方库,仍需要自行配置。仓库中的样例会运行经过优化和混淆的代码,部分场景也会禁用规则验证失败结果,但这些测试不能替代应用自身的 Release 验证。

这个工具主要是为了少维护几份重复配置。如果你也在使用 Compose Desktop,可以看看是否覆盖了项目中的依赖;遇到缺失的规则,也欢迎提 issue 或贡献规则。


最后修改于 2026-10-13