Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件

Posted

技术标签:

【中文标题】Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件【英文标题】:Android apk - How to exclude a .so file from a 3rd party dependency using gradle 【发布时间】:2016-09-19 19:21:39 【问题描述】:

我有一个包含多个依赖项的 android 项目。 其中两个(我们称它们为依赖项 A 和 B)具有本机库(.so 文件)。

依赖 A 具有以下架构:arm64-v8a、armeabi、armeabi-v7a、x86 和 x86_64。 依赖B有以下架构:armeabi、x86

因此,当我的应用程序在 armeabi-v7a 设备上运行(例如)并且依赖项 B 调用本机方法时,它无法找到相关的库来获取它(因为它不存在于 armeabi-v7a 文件夹中并且确实不会自动回退到库所在的 armeabi)。

有没有办法解决这个问题? 例如,我可以在我的 build.gradle 文件中添加一些配置,以使 arm64-v8a、armeabi-v7a 和 x86_64 文件夹不集成到我的最终 apk 中吗?

我已尝试打包选项/排除,但没有结果:有问题的文件夹仍然存在。

【问题讨论】:

【参考方案1】:

尝试一个干净的构建,我没有,它仍然从以前的构建中提取文件。为了确定,我最终删除了我的 app/build/ 文件夹。

android  
    packagingOptions 
        exclude 'lib/armeabi-v7a/libSomeLibYouDontWant.so'
    

在以前崩溃的应用程序上为我工作。

另一种方法是使用

android
    defaultConfig
        ndk
            abiFilters "armeabi", "x86"
        
    

有一些类似的问题可能会有所帮助

Gradle exclude arm64 libs

How to use 32-bit native libraries on 64-bit Android device

【讨论】:

此外,您可以使用以下语法忽略整个 ABI 文件夹,例如,armeabi-v7a 文件夹:exclude "lib/armeabi-v7a/**"(参见 PackagingOptions)跨度> 这将从项目中完全排除 'lib/armeabi-v7a/libSomeLibYouDontWant.so' 如果我们需要排除特定的依赖项怎么办。

以上是关于Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:如何使用 Gradle 生成签名的 APK?

理解使用Gradle编译打包Android apk

Bamboo + Android + Gradle:如何生成签名的apk?

Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件

如何在Android Studio中为Gradle设置apk的应用名称

如何使用 Gradle 6.1.1 为 APK 设置压缩?