具有作为 AppBundle 分发的本机库的应用程序不起作用,但作为 APK 它可以工作

Posted

技术标签:

【中文标题】具有作为 AppBundle 分发的本机库的应用程序不起作用,但作为 APK 它可以工作【英文标题】:App with native libs distributed as AppBundle does not work but as an APK it works 【发布时间】:2021-11-19 03:24:43 【问题描述】:

我有这个 android 应用程序,它使用一个名为 Vitamio 的旧视频播放器库。 Vitamio 已经很久没有更新了,但它确实有效,至少直到最近。

库(和应用程序)在编译成普通 APK 时可以正常工作,但如果我创建 App Bundle,在手机上运行应用程序时会因“java.lang.UnSatisfiedLinkError”而崩溃。 Google PlayConsole 没有给我任何错误或警告。 作为测试,我在 app build.gradle 文件中为“abi”设置了“enableSplit = false”,但没有区别。

奇怪的是,当编译成 AppBundle 时,它​​会搞砸事情,所以以前的 APK 编译不再起作用。

无论如何,我可以解决这个问题吗?

【问题讨论】:

已经有很多帖子在讨论这个了。从 App Bundle 生成的 APK 在 APK 中保留未压缩的原生库,因此在设备上安装时不会提取它们,从而节省了设备空间。根据您加载本机库的方式,这可能会导致此异常。确保您使用 Android 标准方式加载本机库。如果出于任何原因您不能,那么您可以使用 gradle.properties 文件中的android.bundle.enableUncompressedNativeLibs=false 禁用此功能。以为您的用户提供更大的应用程序为代价。 谢谢皮埃尔。我没有意识到这一点。我在 enableUncompressedNativeLibs 设置为 false 的情况下对其进行了测试,它工作正常。我将尝试看看是否可以更改 Vitamio 加载本机库的方式。不幸的是,这对我来说并不是一个真正的解决方案,因为我正在使用另一个名为 B4A 的开发项目并且它不使用 Gradle。一切都是使用自定义工具链编译的,但希望 AppBundle 工具也可以选择设置此值。我将需要测试。如果你想把你写的作为答案,我很乐意接受它作为正确答案。 【参考方案1】:

从 App Bundle 生成的 APK 在 APK 中保留未压缩的原生库,因此在设备上安装时不会提取它们,从而节省了设备空间。根据您加载本机库的方式,这可能会导致此异常。

确保您使用 Android 标准方式加载原生库。如果出于任何原因您不能,那么您可以使用 gradle.properties 文件中的android.bundle.enableUncompressedNativeLibs=false 禁用此功能。以为您的用户提供更大的应用为代价。

如果不使用 Gradle 构建 bundle,则原生库的压缩信息存储在 bundle 内的 BundleConfig.pb 中(由构建系统传递给 bundletool)。见https://github.com/google/bundletool/blob/master/src/main/proto/config.proto#L77

【讨论】:

以上是关于具有作为 AppBundle 分发的本机库的应用程序不起作用,但作为 APK 它可以工作的主要内容,如果未能解决你的问题,请参考以下文章

Google PlayApp Bundle 使用详解 ( 按条件分发 | 国家地区 | SDK 版本 | 设备功能 | 按需分发 | 资源分发 )

具有几何返回类型的 Spring 数据存储库和本机查询

Java,在classpath中加载本机库

适用于Windows的PHP驱动的GUI应用程序

Google PlayApp Bundle 使用详解 ( 应用模块化 )

完整的本机应用程序仍需要 root 访问权限?