首页 > 解决方案 > 切换到 Android App Bundle 后无法找到原生库

问题描述

切换到 Android App Bundle 后,我安装的应用程序无法找到本机库,即使.aab文件包含它们。我发现我遇到了与此问题中描述的相同的问题:Android App Bundle (only) - native library failed to load

而且,该问题的答案建议使用以下 Gradle 属性。这解决了我的问题。

android.bundle.enableUncompressedNativeLibs = false

但是,Gradle 7.0+ 以优化的名义引入了这种变化。避免这种情况有什么影响?我该如何支持它?


以下是我在应用程序中添加和查找.so库的方法。我暂时无法使用System.loadLibrary(...)

我已将libcore.so文件添加到:core模块中,如下所示:

core / libs / arm64-v8a    / libcore.so
core / libs / armeabi-v7a  / libcore.so
core / libs / x86          / libcore.so
core / libs / x86_64       / libcore.so

而且,在 中AndroidManifest.xml,我添加了以下行:

android:extractNativeLibs="true"

而且,在build.gradle模块:core中,我添加了sourceSets这样的内容:

android {
    sourceSets.main {
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }
}

我确保本机库可以像这样使用:

private fun ensureNativeLibAvailable(context: Context, fileName: String) {
    val nativeDir = File(context.applicationInfo.nativeLibraryDir)
    findFile(fileName, nativeDir) 
        ?: throw RuntimeException("$fileName not found.") 
}

在这里,findFile(...)函数libcore.so~~~/lib/arm64/文件夹中搜索arm64-v8a设备文件。

构建.apk格式后,我可以libcore.so使用上面的代码找到。/data/data/package-namepath 有一个带有lib-main名称的文件夹。它包含以下文件:

dso_deps
dso_lock
dso_manifest
dso_state

如果我构建.aab文件而不使用链接答案中的修复程序,则此代码将失败。/data/data/package-name包含四个新文件夹。lib-0包含libcore.so. lib-1, lib-2,lib-main也存在。dso文件存在于所有lib-*文件夹中。

标签: androidjava-native-interface

解决方案


推荐阅读