如何在Android项目中排除特定资源限定符(land)的资源打包?
解决方案
由于你需要针对不同产品风味(flavor)控制是否包含values-land资源,全局排除会影响依赖该资源的风味,因此推荐按风味单独配置:
方案1:针对特定风味重新指定资源目录
在模块级build.gradle(或build.gradle.kts)中,为不需要values-land资源的风味单独指定资源路径,仅保留默认values目录:
android { flavorDimensions "version" // 按你的项目定义风味维度 productFlavors { noLandFlavor { // 仅包含主资源目录和默认values,自动排除values-land res.srcDirs = [ "src/main/res", "src/main/res/values" ] } needLandFlavor { // 保留默认资源配置,自动包含所有res子目录 } } }
方案2:为特定风味添加资源过滤
通过风味对应的sourceSet配置,直接排除values-land路径下的所有资源:
android { productFlavors { noLandFlavor { sourceSets.noLandFlavor.res.filter.exclude { file -> file.path.contains("values-land") } } needLandFlavor { // 无需额外配置,保留原资源结构 } } }
为什么之前的配置未生效?
sourceSets.main.res.filter.exclude是全局配置,会作用于所有风味,与你"部分风味保留资源"的需求冲突。packagingOptions主要用于控制APK打包阶段的文件(如JNI库、第三方jar包),而资源是在合并阶段处理的,因此用它排除资源目录不会生效。
验证配置是否生效
执行以下命令查看对应风味的资源合并日志,确认values-land资源是否被排除:
./gradlew :app:processNoLandFlavorDebugResources --info
在日志中搜索values-land,若无对应资源合并记录,说明配置生效。
内容的提问来源于stack exchange,提问作者Vit Khudenko
相关产品推荐
相关产品推荐

