我正试图用以下代码在我的gradle中进行abi拆分
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a'/*, 'arm64-v8a', 'x86_64'*/
universalApk true
}
}
def abiVersionCodes = ['armeabi-v7a': 1, 'x86': 2, /*'arm64-v8a': 2,'x86_64': 4*/]
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
def filter = output.getFilter(OutputFile.ABI)
if (filter != null) {
output.versionCodeOverride = abiVersionCodes.get(output.getFilter(OutputFile.ABI)) * 1000000 + android.defaultConfig.versionCode
}
}
}
它正在生成正确命名的输出,当我使用apk分析器时,在lib目录下,armeabi-v7a apk将只在lib/armeabi-v7a目录下包含so,x86 apk也是如此。然而,armeabi-v7a还包含一个armeabi和x86文件夹,其中只有一个META-INF文件夹,其中只包含一个MANIFEST.MF文件,没有so。
当将这些多个apk上传到开发控制台时,每个拆分的apk都在下列出
区分apk细节:本机平台无(+3个普通)
通用apk具有
本机平台arm64-v8a,x86_64(+3个通用)臂和通用apk控制台上的错误是
"全阴影APK问题此APK将不会提供给任何用户,因为它被一个或多个版本代码更高的APK完全遮蔽。分辨率从您的版本中删除此APK,或查看您在此版本中包含的APK的目标和版本代码。">
当我添加包装下选项
packagingOptions {
exclude '**/x86/**'
}
那么产生的分离和通用的apk将不支持x86。然而,我看不到为每个应用程序变体指定packagingOptions的方法,所以这不是一个可行的解决方案,而且显然也不是正确的做法,即使是这样。问题似乎是,apk被认为支持x86,只是因为它有一个x86目录,即使它大部分是空的,这导致两个拆分的apk都在宣传他们支持完全相同的架构,而事实并非如此。
奇怪的是,通用apk表示它支持arm64-v8a、armeabi、armeabi-v7a、x86、x86_64,这不是我在调用reset()并在abi块中包含"x86"、"armeabi-v7a"后所期望的。为了防止64位拱门被包括在内,我必须在defaultConfig 中添加
ndk {
abiFilters "armeabi-v7a", "x86"
}
但它仍然包括一个空的armeabi文件夹。
拆分abi的正确方法是什么,以便开发控制台只看到apk实际支持的内容?删除空目录是正确的方法吗?创建空目录的原因是我可以跟踪的吗?
其他一些未使用的库正在生成空文件夹。通过在一个空白项目中反复尝试,我复制了我的依赖项和拆分渐变代码,我将其缩小到cwac的markdown生成器。将它从.2升级到.4解决了问题。