【问题标题】:Setting android:extractNativeLibs=false to reduce app size设置 android:extractNativeLibs=false 以减小应用程序大小
【发布时间】:2017-03-24 11:14:24
【问题描述】:

我不确定,如果我做对了。它似乎在做相反的事情。如果我将标志 android:extractNativeLibs 设置为 true,则该应用程序将占用大约 70MB 的用户空间(是的......)但如果我将此标志设置为 false,则安装在设备上的应用程序的大小会跳转到大约 95MB。所以我不确定用户是否会喜欢这个。

【问题讨论】:

  • 你的问题是什么?我没听懂。
  • 这实际上是正确的,它会减少应用程序的运行时内存,因为它不会将so文件复制到系统中。 .so 文件将直接从 apk 加载。另外,检查您是否可以禁用此处提到的调试符号。 developer.android.com/topic/performance/…
  • 谢谢,我会试试的。

标签: android apk


【解决方案1】:

这有点棘手。当 extractNativeLibs 设置为 false 时,您的 APK 大小将更大

旧行为

当 extractNativeLibs 设置为 true(默认)或未添加到清单时,您的原生库可以压缩存储在 APK 中。它们在安装过程中由 PackageManager 提取,并复制到 /data/app/。因此,本机库有两个副本 - 一个在 APK 中压缩,一个在 /data/app/ 中未压缩。

这种方法有以下优点:

  • APK 体积更小,因为库已压缩

缺点:

  • 增加了安装大小(设置=>应用中的“存储”或“磁盘上”),因为除了 APK 之外,提取的本机库也占用了磁盘空间
  • 安装时间更长
  • 来自 Google Play 的优化较少,例如在生成更新补丁时

新行为

Google 在 Marshmallow (Android 6) 中引入的新方法是通过将 extractNativeLibs 设置为“false”来启用的。它期望存储在 APK(STORE 方法)中的未压缩库和 zipaligned。在安装过程中无需提取它们。在应用启动时,可以直接从 APK 加载(memmapped)库。

优点:

  • 减小了安装大小(设置=>应用程序中的“存储”或“磁盘上”),因为无需提取库。基本上,占用的空间通常只是比 APK 大小多一点
  • Google Play 的下载大小不会增加,因为它在 APK 之上使用自己的压缩方式
  • 优化了由 Google Play 生成的更新补丁,导致更新大小更小。如果你更新你的原生库,压缩版本会有很大的差异,导致补丁更大,而未压缩库的补丁会相对较小。

缺点:

  • 较大的 APK 大小,因为本机库未压缩

不出所料,我没有发现两个选项的加载性能有明显差异。

结论

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 在开发者预览版中可用,但目前尚未公开)。

【讨论】:

  • 其他行为:安装将失败并显示消息“INSTALL_FAILED_INVALID_APK”,并且偶尔会显示其他干扰原生调试的症状(如原生代码中的断点不起作用)。
  • 我们必须在 proguard 规则中采取任何措施以使其保持虚假
  • Android App Bundles的捆绑工具可以提供apk下载大小估计。见:developer.android.com/studio/command-line/…
  • @Over17 我认为这仅对已签名的应用程序很重要。
  • @DADi590 你不能。这是包管理器(不解压库)和加载器(允许直接从 APK 加载未压缩的库)中的一个功能。如果操作系统不支持它,您将无能为力。您可以模拟直接从 APK 加载,但操作系统仍会解压缩库,因此没有意义。
【解决方案2】:

如果您的 APK 包含多个 ABI,extractNativeLibs="false" 可能会适得其反。假设您正在使用每个 ABI 10 MB 的库,并且可以压缩到 5 MB。如果你有 3 个 ABI,那么结果是:

extractNativeLibs="true"

APK:       15 MB (3 x 5 MB)
Extracted: 10 MB
Total:     25 MB

extractNativeLibs="false"

APK:       30 MB (3 x 10 MB)
Extracted:  0 MB
Total:     30 MB

自 2019 年起,缓解此问题的推荐方法是使用 Android App Bundle 格式。

【讨论】:

  • 如果拆分 apk 或使用新的 .aab 捆绑格式,则不是这样。
【解决方案3】:

但有一些重要的先决条件才能起作用,这就是事情变得更加复杂的地方:

  • APK 中的 .so 文件无法压缩 — 必须存储。
  • .so 文件必须使用 zipalign -p 4 页面对齐

更新:以下部分仅适用于 Android Studio 2.1 及更低版本。 从 Android Studio 2.2 Preview 2 和最新的构建工具开始,构建过程会自动将未压缩的原生库和页面对齐存储在 APK 中。

更多信息:link

更新:如果您在某个时候手动签署您的应用程序,那么何时您调用 zipalign 很重要。

警告:您必须在应用构建过程中的两个特定点之一使用 zipalign,具体取决于您使用的应用签名工具:

  • 如果您使用apksigner,则只能在 APK 文件签名之前执行 zipalign。如果您使用 apksigner 对您的 APK 进行签名并对 APK 进行进一步更改,则其签名将失效。
  • 如果您使用 jarsigner,则只能在 APK 文件已签名之后执行 zipalign。

来源:zipalign | Android Developers

Android 6+ 将阻止您使用未压缩的本机库安装未对齐的 APK。较旧的 Android 不在乎,总是提取原生库。

【讨论】:

  • 我明白了,但问题是,我预计android:extractNativeLibs=”false” 的总大小会更小,但它正好相反 - 它大约大 25MB。在 Android 7.1.1 上测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多