Gradle构建风格和包装选项问题

时间:2018-09-13 12:59:42

标签: android gradle android-gradle

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

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

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

我创建了两种产品口味,每种口味都带有正常工作所需的abiFilters。

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 flavour时,该文件夹存在,但其中没有libopencv_java3.so放置!

此选项是否仅会影响v7a?我究竟做错了什么?任何帮助将不胜感激。

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

1 个答案:

答案 0 :(得分:2)

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

与此类似,它可以在armeabi-v7a上加载arm64-v8a程序集:

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'
    }
}