【问题标题】:Changing minSdkVersion from 16 to 26 increased release APK size from 17 to 39 MB将 minSdkVersion 从 16 更改为 26 将发布 APK 大小从 17 MB 增加到 39 MB
【发布时间】:2021-06-29 22:21:41
【问题描述】:

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

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

我实际上不希望也不需要 minSdkVersion 为 26 并且会恢复此更改,但我很好奇:

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

【问题讨论】:

    标签: android apk android-min-sdk


    【解决方案1】:

    这按照android:extractNativeLibs 上的文档按预期工作:

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

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

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

    Reduce your app size中所述:

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

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

    【讨论】:

    • 对,所以不同之处在于,对于 minSdk 16,*.so 被压缩,从 23 开始它们是未压缩的。这可以解释为什么 APK 的大小不同,而解压缩的文件夹却没有。我也对此进行了测试,我手机上安装的应用程序只有 15 MB - APK 有多个 ABI,我的手机只需要一个,所以我猜那些不需要的被“扔掉”了?
    • 正确,如果您是从 Android Studio 安装,或者如果您使用 app bundles 发布您的应用程序,那么只会下载和安装适用于您特定设备的正确 ABI。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2020-08-28
    相关资源
    最近更新 更多