gradle构建flavor和packagingOptions的问题

Mig*_*sla 7 android gradle android-gradle-plugin

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

src
 |_ main
     |_ jniLibs
           |    | arm64-v8a
           |----| armeabi-v7a
                | x86
Run Code Online (Sandbox Code Playgroud)

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

我创建了两种产品口味,每种口味都需要abiFilters才能正常工作.

flavorDimensions "default"
productFlavors {
    v7a {
        externalNativeBuild {
            cmake {
                abiFilters 'x86', 'armeabi-v7a'
            }
        }
    }
    v8a {
        externalNativeBuild {
            cmake {
                abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

packagingOptions {
    exclude 'lib/arm64-v8a/libopencv_java3.so'
}
Run Code Online (Sandbox Code Playgroud)

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

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

注:测试的gradle版本:3.1.2和3.1.4.

Mar*_*ler 2

尝试以不同的方式进行分割,而不是使用产品优惠 -

同样,这个可以加载armeabi-v7a程序集arm64-v8a

splits {
    abi {
        enable true
        reset()
        include "armeabi", "x86"
        universalApk true
    }
}
Run Code Online (Sandbox Code Playgroud)

这将期望(32位版本的)库位于armeabi/libopencv_java3.so.

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

v7a {
    ...
    packagingOptions {
        exclude 'lib/arm64-v8a/libopencv_java3.so'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。当我可以访问代码时,我会尝试拆分。关于打包选项,这就是我所做的(仅将其放在 v7a 中),但在构建 v8a 时它不断删除 OpenCV 库! (2认同)