一段时间以来,我一直在开发与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。
答案 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'
}
}