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

Mat*_*ere 16 android gradle

我有一个有几个依赖项的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中吗?

我尝试过packagingOptions/exclude,但没有结果:问题中的文件夹仍然存在.

小智 31

尝试一个干净的构建,我没有,它仍然从上一个版本中获取文件.我最终删除了我的app/build /文件夹以确定.

android { 
    packagingOptions {
        exclude 'lib/armeabi-v7a/libSomeLibYouDontWant.so'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是使用

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "x86"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Gradle排除arm64库

如何在64位Android设备上使用32位本机库

  • 此外,您可以使用以下语法 **忽略整个 ABI 文件夹**,例如,对于 `armeabi-v7a` 文件夹:`exclude "lib/armeabi-v7a/**"` (请参阅 [PackagingOptions](https ://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html)) (2认同)
  • 如果我们需要排除特定的依赖项,这将从项目中完全排除“lib/armeabi-v7a/libSomeLibYouDontWant.so”。 (2认同)