如何仅为单个productFlavor配置androidResources.noCompress
单Product Flavor配置noCompress不生效问题解决
问题复现
目标是仅为outerRing产品风味配置不压缩.so文件,初始配置如下:
flavorDimensions "ring" productFlavors { innerRing { dimension "ring" } outerRing { dimension "ring" androidResources { noCompress 'so' } } }
构建后发现innerRing、outerRing两个风味的.so文件均未被压缩,该现象由Gradle静态配置所有productFlavor的机制导致。
后续尝试在afterEvaluate阶段定向修改目标变体的noCompress配置,代码如下:
afterEvaluate { android.applicationVariants.all { variant -> def ring = variant.getProductFlavors().get(0).name if (ring == "outerRing") { println("Don't compress .so files for outer ring build") android.androidResources.noCompress = ['so'] } } }
构建抛出如下错误:
com.android.build.gradle.internal.dsl.AgpDslLockedException: It is too late to modify internalNoCompressList It has already been read to configure this project. Consider either moving this call to be during evaluation, or using the variant API.
错误原因是internalNoCompressList在afterEvaluate阶段已经被读取用于项目配置,此时修改全局配置时机过晚,需要通过Variant API在变体配置阶段完成定向设置。
正确实现方案(基于Variant API)
AGP 7.0及以上版本可通过androidComponents扩展块提供的Variant API实现单变体配置,无需修改全局参数,代码如下:
androidComponents { // 按风味维度精准筛选outerRing对应的变体 onVariants(selector().withFlavor("ring", "outerRing")) { variant -> // 仅给当前筛选出的变体添加so不压缩规则 variant.androidResources.noCompress.add("so") } }
注意:该配置方案仅适用于Android Gradle Plugin 7.0及以上版本,低版本AGP无对应Variant API支持,需要先升级AGP版本再使用。
配置说明
- 禁止在
productFlavors块内直接配置androidResources.noCompress,该块内的androidResources配置属于全局域,会被所有变体继承,导致非目标风味也生效 - 禁止在
afterEvaluate阶段修改全局android.androidResources配置,该时机配置已被锁定,必然触发修改过晚的错误 selector().withFlavor("维度名", "风味名")可以按风味维度精准筛选目标变体,如果是多维度组合的风味也可以叠加筛选条件,比直接匹配变体名更稳定- 直接操作变体自身的
androidResources属性,配置仅对当前变体生效,不会影响其他风味的打包逻辑
内容的提问来源于stack exchange,提问作者rottweiler
相关产品推荐
相关产品推荐

