这有点棘手。当 extractNativeLibs 设置为 false 时,您的 APK 大小将更大。
旧行为
当 extractNativeLibs 设置为 true(默认)或未添加到清单时,您的原生库可以压缩存储在 APK 中。它们在安装过程中由 PackageManager 提取,并复制到 /data/app/。因此,本机库有两个副本 - 一个在 APK 中压缩,一个在 /data/app/ 中未压缩。
这种方法有以下优点:
缺点:
- 增加了安装大小(设置=>应用中的“存储”或“磁盘上”),因为除了 APK 之外,提取的本机库也占用了磁盘空间
- 安装时间更长
- 来自 Google Play 的优化较少,例如在生成更新补丁时
新行为
Google 在 Marshmallow (Android 6) 中引入的新方法是通过将 extractNativeLibs 设置为“false”来启用的。它期望存储在 APK(STORE 方法)中的未压缩库和 zipaligned。在安装过程中无需提取它们。在应用启动时,可以直接从 APK 加载(memmapped)库。
优点:
- 减小了安装大小(设置=>应用程序中的“存储”或“磁盘上”),因为无需提取库。基本上,占用的空间通常只是比 APK 大小多一点
- Google Play 的下载大小不会增加,因为它在 APK 之上使用自己的压缩方式
- 优化了由 Google Play 生成的更新补丁,导致更新大小更小。如果你更新你的原生库,压缩版本会有很大的差异,导致补丁更大,而未压缩库的补丁会相对较小。
缺点:
不出所料,我没有发现两个选项的加载性能有明显差异。
结论
extractNativeLibs="false" 选项可能对您的 if 有用:
- 您不关心 APK 大小 - 要么它远低于 100 Mb 限制,要么您已经在使用扩展文件 (OBB) 并且可以处理 APK 大小增加
- 您关心您的应用在 Google Play 中的更新大小
- 您的本机库不是很大。
例如,对于使用 Unity 制作的游戏,此选项几乎不适用,因为本机库很大。
更新:Android App Bundles
Android App Bundles 是 Google Play 宣布的一种新的分发机制,更多详情请访问官网https://developer.android.com/platform/technology/app-bundle/ 和https://developer.android.com/guide/app-bundle/
与传统 APK 相比,它具有显着优势,其中最重要的优势之一是 150 Mb 的最大大小限制。 重要提示:这是下载大小,而不是 app bundle 本身或生成的 APK 的大小。 (APK 由 Play 生成并即时传送到设备,有关其工作原理的更多详细信息应在 Android 官方资源中提供)。
在构建 AAB 时,它的 extractNativeLibs 标志默认设置为“false”。但是,由于 Google Play 在交付给终端设备的 APK 之上应用压缩,这不会影响下载大小。这意味着这个标志只在 Android App Bundles 的情况下带来好处 - 更快的安装,更少的磁盘大小,几乎没有额外的成本,因为没有对最大大小限制的压力。
然而,一个令人困惑的事情是当您接近 150 Mb 限制时如何计算下载大小,因为 AAB 大小并不表示下载大小。在 bundletool https://developer.android.com/studio/command-line/bundletool#measure_size 中有一个特殊的命令,或者你可以尝试直接上传到 Play。如果您的 AAB 远低于 150 Mb,则无需担心。
(更新:对于 app bundle 使用 150 Mb 大小限制,而不是 500 Mb;显然 500 MB 在开发者预览版中可用,但目前尚未公开)。