我一直在开发与x86,armeabi-v7a和arm64-v8a abis兼容的库(aar格式)。该库可以按预期工作,但是为了减小最终大小,我们要开发两个不同的库:一个具有arm64-v8a abi,​​一个不具有abi64。该库取决于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 flavor 中添加了以下内容:
packagingOptions {
    exclude 'lib/arm64-v8a/libopencv_java3.so'
}

现在,v7a aar里面没有包含arm64-v8a文件夹,但是当我选择v8a flavor 时,该文件夹存在,但是里面没有libopencv_java3.so!

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

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

最佳答案

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

就像这样,可以在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'
    }
}

07-27 21:25