Gradle配置splits生成APK异常:多出2个仅ABI维度的APK
为什么Gradle生成了额外的纯ABI APK?
这个问题我之前也碰到过,原因其实是Gradle的Splits机制默认会生成所有可能的拆分变体组合——不仅是你预期的density+ABI交叉组合,还会包含单一维度的拆分(比如只按ABI拆分、包含所有密度的APK,或者只按密度拆分、包含所有ABI的APK)。
你的配置里只指定了要包含的density和ABI值,但没有限制拆分的维度组合,所以Gradle会自动生成所有可能的组合:
- 交叉维度:mdpi-x86、mdpi-arm64-v8a、hdpi-x86、hdpi-arm64-v8a(4个,符合预期)
- 单一ABI维度:x86(包含mdpi+hdpi)、arm64-v8a(包含mdpi+hdpi)(这就是你看到的额外2个)
- (如果没被过滤的话,还可能有单一density维度的mdpi、hdpi APK)
如何只保留交叉维度的APK?
要解决这个问题,你需要在build.gradle中添加过滤规则,移除那些只满足单一拆分维度的变体。这里提供两种常用的配置方式:
方式一:使用variantFilter过滤
android { // 你的原有splits配置保持不变 splits { density { enable true reset() include "mdpi", "hdpi" } abi { enable true reset() include "x86", "arm64-v8a" } } // 添加变体过滤逻辑 variantFilter { variant -> def hasDensitySplit = variant.flavorName.contains("mdpi") || variant.flavorName.contains("hdpi") def hasAbiSplit = variant.flavorName.contains("x86") || variant.flavorName.contains("arm64-v8a") // 只保留同时包含density和ABI拆分的变体 if ((hasDensitySplit && !hasAbiSplit) || (hasAbiSplit && !hasDensitySplit)) { setIgnore(true) } } }
方式二:通过applicationVariants控制输出
android { splits { // 你的原有splits配置保持不变 } applicationVariants.all { variant -> variant.outputs.each { output -> def density = output.getFilter(com.android.build.OutputFile.DENSITY) def abi = output.getFilter(com.android.build.OutputFile.ABI) // 如果只有density或只有ABI被拆分,就禁用这个输出 if ((density != null && abi == null) || (density == null && abi != null)) { output.enabled = false } } } }
额外补充:禁用通用APK
如果还想移除包含所有ABI和密度的universal APK,可以在splits配置中添加:
splits { // 原有density和abi配置... universalApk false // 禁用通用APK }
配置完成后重新构建,Gradle就只会生成你预期的4个交叉维度APK了。
内容的提问来源于stack exchange,提问作者Kamal
相关产品推荐
相关产品推荐

