具有 ABI 拆分的特定体系结构的 Gradle 依赖项



我面临着这个问题,这似乎我无法解决。这是场景:

我正在构建使用 gradle 依赖项的 apk,并且此依赖项是特定于体系结构的,因此对于 x86 的 apk,我需要不同的依赖项,并且对于 arm 也需要不同的依赖项。

我用产品口味解决了它:

productFlavors {
   dev { ... }
   develx86 { ... }
   production { ... }
   productionx86 { ... }
}

因此,我像这样定义依赖关系:

develCompile 'dependency_for_arm'
develx86Compile 'dependency_for_x86'

这很好用。但是最近我不得不在我的应用程序中添加渲染脚本的使用。我是这样做的:

renderscriptTargetApi 22
renderscriptSupportModeEnabled true

在此之后,当我在谷歌播放上上传apk时,它说它的apk适用于arm,x86。我不知道这怎么可能。正如您可以认为的那样,它会在具有不同CPU的设备上崩溃(如果我为arm生成apk并且用户将在x86应用程序上执行它将崩溃)。

所以我拒绝使用 ABI 拆分:

splits {
        abi {
            enable true
            reset()
            include 'armeabi', 'x86'
            universalApk false
        }
    }
//Ensures architecture specific APKs have a higher version code
//(otherwise an x86 build would end up using the arm build, which x86 devices can run)
ext.versionCodes = [armeabi:0, x86:1]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
    // assign different version code for each output
    variant.outputs.each { output ->
        int abiVersionCode = project.ext.versionCodes.get(output.getFilter(OutputFile.ABI)) ?: 0
        output.versionCodeOverride = android.defaultConfig.versionCode + abiVersionCode
    }

但是现在当我看到生成的 apk 文件时,特定于口味的依赖项不包含在 apk 中,当我打开使用此依赖项中的 API 的部分时,apk 会崩溃。

有人知道如何解决这个问题吗?或者有人知道为什么 Google Play 在我包含 renderscript 时说 apk 适用于这两种架构?(没有它它可以正常工作,但我需要渲染脚本)。

谢谢你的时间。我将不胜感激任何帮助。

如果您查看 APK 内部的 lib 文件夹,您应该会看到 renderscript 支持模式为您支持的其他架构添加了库,而不是您支持的架构。

您可以使用特定于 ABI 的风格保留早期配置。但为了确保不包含其他架构的库,请尝试将 abiFilters 添加到您的风格中:

productFlavors {
   dev { ... ndk.abiFilters 'armeabi-v7a' }
   develx86 { ... ndk.abiFilters 'x86' }
   production { ... ndk.abiFilters 'armeabi-v7a' }
   productionx86 { ... ndk.abiFilters 'x86' }
}
抱歉,

我还无法内联评论。

apk 中有什么,尤其是在 res/raw/和 lib/中?另外,您是否正在使用 gradle 插件 2.1.0?(因为你使用的是renderscriptTargetApi 22),你试过构建工具 23.0.3 吗?

最新更新