由于ABI重叠,Play开发者控制台上的APK完全被遮盖。

13

我正在尝试使用以下代码在我的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个共同平台) arm和通用apk的控制台错误为

“完全遮盖APK 问题 此APK不会提供给任何用户,因为它被一个或多个具有更高版本代码的APK完全遮盖。 解决方案 从发布中删除此APK或检查您在此发布中包含的APK的定位和版本代码。”

当我在打包选项下添加时

packagingOptions {
    exclude '**/x86/**'
}

那么生成的split apk和universal 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,以便dev控制台只看到apk实际支持的内容?删除空目录是正确的方法吗?是否有原因可以追踪到创建空目录的原因?

1个回答

0

一些未使用的库生成了空文件夹。通过在一个空项目中复制依赖项和分割 Gradle 代码进行试错,我将其缩小到 cwac 的 markdown 生成器。将其从 .2 升级到 .4 解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接