You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AGP 8.4+与Hilt:多模块架构Android库模块R8混淆疑问

AGP 8.4 多模块混淆相关问题解答

AGP 8.4 核心变更说明

从Android Gradle Plugin 8.4开始,如果Android库项目开启混淆,缩减后的程序类会被发布用于项目间依赖。这意味着如果应用依赖已缩减的Android库子项目,APK将包含已缩减的Android库类。若APK中出现类缺失,你可能需要调整库的Keep规则。
若你构建并发布AAR,库依赖的本地jar将以未缩减的形式包含在AAR中,这意味着代码缩减器不会对其运行。
如需恢复之前的行为,请在gradle.properties中设置android.disableMinifyLocalDependenciesForLibraries并提交bug报告。未来版本的AGP将移除该标志。

项目模块与依赖关系

  • app模块(应用模块)
  • presentation模块(Android库模块)
  • domain模块(纯Kotlin模块)
  • data模块(Android库模块)

依赖关系:presentation → domain ← data,app模块依赖所有模块,且会使用presentation模块中的类。


问题解答

  1. 如果库模块设置isMinifyEnabled = true,是否会在app模块混淆之前先完成混淆,且app模块会直接包含这些已混淆的类?
    是的。AGP 8.4的这个变更就是让开启混淆的库模块在构建阶段先完成自身的代码缩减与混淆,生成处理后的类文件提供给依赖它的模块(比如你的app模块)。app模块最终打包时会直接使用这些已混淆的库类,不会再对它们重复执行混淆流程。

  2. 如果库模块设置isMinifyEnabled = false,但app模块保持isMinifyEnabled = true,库模块是否仍会被混淆和模糊处理?是否需要为app模块用到的库模块中的几乎所有类添加Keep规则和@Keep注解?
    库模块会被app模块的混淆流程处理。此时库模块自身未开启混淆,类会以完整状态被引入app模块的构建流程,最终由app模块的混淆规则决定哪些类被保留、混淆或移除。
    不需要给所有用到的类加@Keep。Android自带的默认混淆规则(如proguard-android-optimize.txt)会自动保留被代码直接引用的类和成员;只有当存在反射调用、动态类加载这类隐式引用时,才需要手动添加Keep规则或@Keep注解。

  3. 如果给所有相关类都标记@Keep,是否会让混淆失去意义?
    是的。混淆的核心作用是移除未被使用的代码以减小包体积,同时重命名类/方法/字段提升代码安全性。如果给所有相关类都标记@Keep,代码缩减器会保留这些类的全部内容,既不会移除未使用部分,也不会进行重命名操作,完全失去了混淆的价值。因此只需要给无法被混淆规则自动识别的类/成员添加@Keep即可,不要滥用。


内容的提问来源于stack exchange,提问作者No_Name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:12:41