android - 切换到 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-name
path 有一个带有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-*
文件夹中。
解决方案
推荐阅读
- reactjs - 更改警报antd中的关闭按钮颜色
- node.js - 如何为 React App 优化 Docker 文件
- node.js - 如何在nodejs中使用nvidia jarvis tts
- node.js - 在 Node.js 中如何检查文件当前是否打开?
- node.js - 在 typeorm 中加载急切的表连接
- reactjs - 本地图像未卸载
- javascript - 出于某种原因,语音识别根本不适合我。是因为我在本地运行吗?我究竟做错了什么?
- python - 如何计算 2 个不同列表之间的共享元素?(Python)
- assembly - 8086 程序集中的寻址在模拟器中无法正常工作
- python - Django - 插入的数据未反映在 Django 管理表中