【问题标题】:Problem with gradle build flavour and packagingOptionsgradle build flavor 和 packagingOptions 的问题
【发布时间】:2019-02-18 05:22:03
【问题描述】:

我一直在开发一个与 x86、armeabi-v7a 和 arm64-v8a abis 兼容的库(aar 格式)。该库按预期工作,但为了减小最终大小,我们想要开发两个不同的库:一个带有 arm64-v8a abi,​​一个没有它。该库依赖于openCV(用于C++语言),我们有以下项目结构:

src
 |_ main
     |_ jniLibs
           |    | arm64-v8a
           |----| armeabi-v7a
                | x86

每个 abi 文件夹都包含 libopencv_java3.so。

我创建了两种产品风格,每种风格都带有正常工作所需的 abiFilter。

flavorDimensions "default"
productFlavors {
    v7a {
        externalNativeBuild {
            cmake {
                abiFilters 'x86', 'armeabi-v7a'
            }
        }
    }
    v8a {
        externalNativeBuild {
            cmake {
                abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
}

现在我有两个构建变体可供选择,并且都可以无错误地编译。但是,v7a aar 仍然包含 arm64-v8a 文件夹和其中的库。为了解决这个问题,我在 v7a 中添加了以下内容:

packagingOptions {
    exclude 'lib/arm64-v8a/libopencv_java3.so'
}

现在,v7a aar 中不包含 arm64-v8a 文件夹,但是当我选择 v8a 风格时,该文件夹存在,但其中没有放置 libopencv_java3.so!

这个选项不应该只影响 v7a 吗?我究竟做错了什么?任何帮助将不胜感激。

注意:已测试的 gradle 版本:3.1.2 和 3.1.4。

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    尝试以不同的方式进行拆分,而不是使用产品偏好 -

    类似这个可以在arm64-v8a上加载armeabi-v7a程序集:

    splits {
        abi {
            enable true
            reset()
            include "armeabi", "x86"
            universalApk true
        }
    }
    

    这应该是armeabi/libopencv_java3.so 的(32 位版本的)库。

    externalNativeBuild 仅考虑正在构建的库(也称为“您的代码”)。如果您坚持使用packagingOptions,则不应在全局范围内定义它们,而应根据产品风味进行定义。

    v7a {
        ...
        packagingOptions {
            exclude 'lib/arm64-v8a/libopencv_java3.so'
        }
    }
    

    【讨论】:

    • 感谢您的回答。当我可以访问代码时,我会尝试拆分。关于packagingOptions,这就是我所做的(仅将它放在v7a中)但是在为v8a构建时它会不断删除OpenCV库!
    • @MiguelIsla 为两种架构加载相同的库至少不会不必要地膨胀包。同时还有developer.android.com/platform/technology/app-bundle,它也支持你正在尝试做的事情。
    • 非常感谢您的链接,我会看看它。我还有一个关于使用 armeabi 的问题。此 abi 已弃用且不再受支持,因此在不久的将来,此解决方案将不起作用。对此可能的解决方法有任何想法吗?
    • 我遇到了完全相同的问题,我尝试从构建风格中排除一个本机库,但是当添加 PackagingOption 以排除每种风格时,该库不适用于任何风格!所以看起来 PackagingOptions 被全局应用于所有口味,这不是我所期望的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多