android - Android 应用程序包 -> apk 不包含必需的本机库
问题描述
我正在使用新的应用程序包格式 (aab) 发布应用程序。该应用程序包括一些用于 armeabi-v7a 的本机库。当我通过 Google Play 在 arm64-v8a 架构上安装应用程序时,它不包含没有 arm64-v8a so 文件的本机库。
根据此https://stackoverflow.com/a/39622499/534471, armeabi-v7a 库应在 arm64-v8a 设备上运行(通过 adb 安装时它工作正常,因此确实可以工作)。
Google Play 控制台按架构、屏幕密度等显示了不同的 apk。从 apk 大小我可以清楚地分辨出哪些不包含本机库。我还使用本机库监视器应用程序来分析已安装的 apk,它显然不包括我需要的本机库(如果应用程序具有 arm64-v8a so 文件,则它包括 arm64-v8a 本机库但如果只有 armeabi 则不包括-v7a 版本)。
我的 gradle 构建文件包含一小段用于捆绑配置的代码:
bundle {
language {
enableSplit = false
}
density {
enableSplit = true
}
abi {
enableSplit = true
// include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
现在这是我的问题:有没有办法告诉构建工具在每个 apk 中包含“次佳”本机库,次佳是在特定架构上运行的最接近的版本?
PS:如果我为 abi 设置 enableSplit = false ,那么它将包括本机库(如预期的那样),但不幸的是,对于包括 x86 在内的所有平台,仅 20MB 大......
解决方案
没有必要告诉工具提供次优服务,这应该是自动完成的。如果设备报告也支持 armeabi-v7a,它应该会收到包含它的 APK。
编辑:
鉴于您的屏幕截图,您的应用似乎为arm64-v8a
架构提供了本机库,因此将提供arm64-v8a
库而不是armeabi-v7a
那些库。
另请注意,一台设备无法为同一应用程序从不同架构加载库,即您不能期望某些库以 64 位加载,而另一些库以 32 位加载。即使使用包含所有 ABI 的“胖”APK,Android 平台在安装您的应用程序时只会选择一个 ABI 并丢弃所有其他文件,因此从您提供至少一个库的那一刻起arm64-v8a
,任何armeabi-v7a
库都不会是加载到arm64-v8a
设备上。
编辑:
如果您无法为该架构提供所需的本机库,则应考虑从您的应用程序中排除一些 ABI。这可以使用abiFilters
gradle 配置中的块来实现:
ndk { abiFilters 'armeabi-v7a', 'x86' }
推荐阅读
- python - 反复比较下一行,直到在 Pandas 中满足标准
- javascript - 更改在 HTML5 画布 Adobe Animate 中单击的形状的颜色
- php - 我在通过标头标签重定向时遇到问题
- python - Catkin 工具给出:"{!r}".format(fileobj)) from None 语法错误
- python - 当使用变量引用时间时,冻结时间测试用例失败
- python - 安装“pandas-profiling”时出错
- python - SPOJ for python 中的输入数据是什么类型的?以及如何在 Jupyter 笔记本中实现它?
- azure-data-factory-2 - 在后续活动中使用 Lookup 活动结果
- c# - 在 HttpClient C# 中发送带有文件的嵌套 JSON
- java - Intellij 不显示“已分配但未使用的私有字段”警告