0

我有一个相对较小且简单的应用程序,它总是生成一个 ~17 MB 的发布 APK 文件。前段时间我注意到 APK 的大小增加到了惊人的(对于这个应用程序)39 MB。我追踪了导致它的更改,结果发现相同的代码库,唯一的变化是minSdkVersion从 16 到 26没有任何其他更改导致 APK 增加。

奇怪的是,当我解压 APK 时,解压后的目录占用了大约 40 MB 的磁盘空间。有一些变化,但都在非常小的文件中,比如 26 版本中缺少一些布局,可以忽略不计。40 MB 中最大的部分是包含 *.so 库的 lib 文件夹,总计 37 MB,但它们在两个 APK 版本中是相同的。(该应用程序是一个使用 . 构建的 Flutter 应用程序flutter build apk --release。)

我实际上不想也不需要minSdkVersion26 岁,并且会恢复这个变化,但我很好奇:

  1. 是什么在 Android 中发生了变化,导致这两个minSdkVersions 之间的大小如此显着增加?
  2. APK 在解压后如何具有几乎相同的大小?似乎为minSdkVersion16 构建时的压缩要好得多?
  3. 如果解压后的目录大小几乎相同,那么大小的增加对最终用户来说真的很重要吗?他们需要下载 17 对 37 MB 吗?为 26 人构建的应用程序会minSdkVersion在他们的设备上占用更多空间吗?
4

1 回答 1

3

根据以下文档,这是按预期工作的android:extractNativeLibs

包安装程序是否将本机库从 APK 提取到文件系统。如果设置为"false",那么您的本机库必须是页面对齐的并且未压缩地存储在 APK 中。尽管您的 APK 可能更大,但您的应用程序应该加载得更快,因为库是在运行时直接从 APK 加载的。另一方面,如果设置为"true",则可以压缩 APK 中的原生库。安装时,安装程​​序解压库,链接器在运行时加载解压的库;在这种情况下,APK 会更小,但安装时间可能会稍长一些。

默认值为"true"ifextractNativeLibs中未配置AndroidManifest.xml。但是,当使用Android Gradle 插件 3.6.0或更高版本构建您的应用程序时,如果未和中配置此属性,则会将其重置为。"false"AndroidManifest.xmlminSdkVersion >= 23

因此,您可以通过不提取本机库来获得运行时性能,从而获得更好的用户体验。由于系统不需要解压缩.so文件,因此您实际上也节省了用户设备上的空间。

减少您的应用程序大小中所述:

在构建应用的发布版本时,通过在应用清单的元素中.so进行设置,将未压缩的文件打包到 APK中。禁用此标志可防止在安装期间将文件从 APK复制到文件系统,并具有使您的应用程序更新更小的额外好处。android:extractNativeLibs="false"<application>PackageManager.so

因此,虽然 APK 的大小起初较大,但随后的更新实际上要小得多。这是因为 Google Play 商店仅在进行应用升级时自动下载 APK 之间的差异 - 通过存储.so未压缩的文件,此差异明显更小,因为额外的压缩通常会完全更改.so文件,而不是仅更改实际更改的部分.

于 2021-06-29T23:42:54.563 回答