由于 abis 重叠,Play 开发者控制台上的 APK 完全被遮蔽
Fully shadowed APK on Play developer console because of overlapping abis
我正在尝试使用以下代码在我的 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 文件,没有。
将这些多个 apk 上传到开发控制台时,每个拆分 apk 都列在
下
区分 apk 详细信息:
原生平台
none(+ 3 个普通)
通用 apk 有
原生平台
arm64-v8a,x86_64(+ 3 个常见)
arm 和 universal apk 的控制台报错是
“完全阴影化的 APK
问题
此 APK 将不会提供给任何用户,因为它完全被一个或多个具有更高版本代码的 APK 覆盖。
解析度
从您的版本中删除此 APK,或查看您在此版本中包含的 APK 的定位和版本代码。
“
当我添加下打包选项时
packagingOptions {
exclude '**/x86/**'
}
那么生成的 apks,split 和 universal,将不支持 x86。但是,我没有看到为每个应用程序变体指定 packagingOptions 的方法,因此这不是一个可行的解决方案,而且即使它是,也显然不是正确的做事方式。问题似乎是 apk 被认为支持 x86 只是因为它有一个 x86 目录,即使它大部分是空的,这导致两个拆分的 apk 宣传它们支持完全相同的架构,而实际上它们不支持。
奇怪的是,通用 apk 说它支持 arm64-v8a, armeabi, armeabi-v7a, x86, x86_64 ,这不是我在调用 reset() 并包含 'x86', 'armeabi-v7a' 在abi块中。为了防止包含 64 位拱门,我必须添加 defaultConfig
ndk {
abiFilters "armeabi-v7a", "x86"
}
但它仍然包含一个空的 armeabi 文件夹。
拆分 abi 以便开发控制台仅看到 apk 实际支持的内容的正确方法是什么?删除空目录是正确的方法吗?创建空目录是否有我可以追踪的原因?
其他一些未使用的库正在生成空文件夹。通过在我复制依赖项和拆分 gradle 代码的空白项目中反复试验,我将范围缩小到 cwac 的 markdown 生成器。将它从 .2 升级到 .4 解决了这个问题。
我正在尝试使用以下代码在我的 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 文件,没有。
将这些多个 apk 上传到开发控制台时,每个拆分 apk 都列在
下区分 apk 详细信息: 原生平台 none(+ 3 个普通)
通用 apk 有
原生平台 arm64-v8a,x86_64(+ 3 个常见) arm 和 universal apk 的控制台报错是
“完全阴影化的 APK 问题 此 APK 将不会提供给任何用户,因为它完全被一个或多个具有更高版本代码的 APK 覆盖。 解析度 从您的版本中删除此 APK,或查看您在此版本中包含的 APK 的定位和版本代码。 “
当我添加下打包选项时
packagingOptions {
exclude '**/x86/**'
}
那么生成的 apks,split 和 universal,将不支持 x86。但是,我没有看到为每个应用程序变体指定 packagingOptions 的方法,因此这不是一个可行的解决方案,而且即使它是,也显然不是正确的做事方式。问题似乎是 apk 被认为支持 x86 只是因为它有一个 x86 目录,即使它大部分是空的,这导致两个拆分的 apk 宣传它们支持完全相同的架构,而实际上它们不支持。
奇怪的是,通用 apk 说它支持 arm64-v8a, armeabi, armeabi-v7a, x86, x86_64 ,这不是我在调用 reset() 并包含 'x86', 'armeabi-v7a' 在abi块中。为了防止包含 64 位拱门,我必须添加 defaultConfig
ndk {
abiFilters "armeabi-v7a", "x86"
}
但它仍然包含一个空的 armeabi 文件夹。
拆分 abi 以便开发控制台仅看到 apk 实际支持的内容的正确方法是什么?删除空目录是正确的方法吗?创建空目录是否有我可以追踪的原因?
其他一些未使用的库正在生成空文件夹。通过在我复制依赖项和拆分 gradle 代码的空白项目中反复试验,我将范围缩小到 cwac 的 markdown 生成器。将它从 .2 升级到 .4 解决了这个问题。