本文由 简悦 SimpRead转码, 原文地址 www.callstack.com
了解如何通过调整 Proguard rule...... 改善 TTI、降低内存使用率和 Android 应用程序的大小
以下文章是React Native 优化终极指南的一部分,介绍了如何通过 Gradle 设置优化 Android 应用程序的大小。
为什么这很重要?
应用程序的小尺寸有几个原因。首先,并非每个人都能使用最新的设备和稳定快速的网络连接。这部分用户可能无法下载和运行您的大尺寸应用程序,这可能会大大减少您产品的潜在用户数量。
其次,体积越大,应用程序的启动时间就越长。当产品过大时,要花费更多的时间来准备与用户的首次互动。这会严重影响产品的用户体验。
第三,您需要记住,应用程序在安装后通常会占用更多空间。在某些情况下,它们甚至可能无法装入设备的存储空间。在这种情况下,用户可能会决定跳过安装,以避免删除现有的应用程序。
在本文中,我们将告诉你如何避免因构建大尺寸应用程序而造成的这些令人不快的后果。继续阅读,了解如何使用 Gradle 设置优化 Android 应用程序的大小。
在基于《React Native 优化终极指南》的其他博文中,我们将讨论以下与性能相关的主题:
- 使用 Hermes 优化 Android 应用程序的启动时间
- 使用
Autolinking自动化依赖关系管理 - 使用 Flipper 更快更好地进行调试
- 为什么必须始终运行最新版本的 React Native?
- 实验 React Native 的新架构
查看这些内容!现在,让我们进入正题。
为什么应用程序的内存使用率和大小很重要?
在每个 React Native 项目的开始阶段,您通常并不关心应用程序的大小。毕竟,在项目初期很难做出这样的预测。但是,根据代码库的不同,只需增加几个依赖项,应用程序就会从标准的 5 MB 增长到 10、20 甚至 50 MB。
在超快移动互联网和随处可见的 WiFi 访问时代,您真的应该关心应用程序的大小吗?为什么捆绑程序的大小增长如此之快?我们将在下面几段回答这些问题,但首先,让我们来看看一个典型的 React Native 捆绑程序是由什么组成的。
默认情况下,安卓上的 React Native 应用程序由以下部分组成:
- 针对不同 CPU 架构编译的四套二进制文件、
- 包含图片、字体等资源的目录
- 包含业务逻辑和 React 组件的 JavaScript 捆绑程序、
- 其他文件。
React Native 提供了一些优化功能,可以改善捆绑包的结构和整体大小。但它们默认是禁用的。
如果你没有有效地使用它们,尤其是当你的应用程序增长时,你就会不必要地增加应用程序的整体字节大小。这会损害最终用户的体验。
为什么 APK 大小如此重要?
答案很简单。更大的 APK 意味着从应用程序商店下载所需的时间更长,加载到内存中的字节码更多。让我们详细解释一下我们的意思。
您和您的团队使用最新的设备并能快速、稳定地访问互联网,这很好。但您需要记住,并不是每个人都有这样的条件。世界上仍有一些地方的网络可访问性和可靠性远非完美。像 Starlink 这样的项目有望改善这种状况,但这需要时间。
现在,仍有一些市场,每兆流量都有其价格。在这些地区,应用程序的大小会直接影响转化率,安装/取消率会随着应用程序大小的增加而增加。
人们还普遍认为,每个精心设计的应用程序不仅界面美观,而且还针对终端设备进行了优化。但事实并非总是如此。而且,由于 Android 市场竞争激烈,与那些精美但庞大的应用程序相比,小巧的替代品很有可能已经在社区中获得了更多的关注。
另一个重要因素是设备碎片化。在这方面,安卓市场非常多样化。有 20 多家流行制造商,每家制造商每年都会发布一系列设备。中低端设备所占份额相对较大,每年占智能手机总销量的 60% 以上。而这些设备在处理较大的 APK 时可能会遇到问题。
我们已经强调过,应用程序的启动时间至关重要。设备在打开您的代码时需要执行的代码越多,启动应用程序并为首次交互做好准备所需的时间就越长。
现在,让我们来谈谈最后一个值得一提的因素--设备存储。应用程序安装后通常会占用更多空间。有时,它们甚至可能无法装入设备内存。在这种情况下,用户可能会决定跳过安装您的产品,如果这意味着要移除其他资源(如应用程序或图像)的话。
在发布版本中使用 Proguard 优化应用程序大小
如果问题出在您没有在发布版本中启用 Proguard,并且在创建 APK 时使用了适用于所有 CPU 架构的代码,从而导致 APK 较大,我们建议采用以下解决方案:将 enableProguardInReleaseBuilds 布尔标志设为 true,根据您的需要调整 Proguard 规则,并测试发布版本是否会崩溃。此外,将 enableSeparateBuildPerCPUArchitecture 设为 true。
安卓是一个操作系统,可以在大量不同架构的设备上运行,所以你的构建必须支持其中的大部分。React Native 支持四种架构:armeabi-v7a、arm64-v8a、x86 和 x86_64。
在开发应用程序的过程中,Gradle 会生成 APK 文件,该文件可以安装在上述任何 CPU 架构的设备上。换句话说,您的 APK(构建过程中输出的文件)实际上是将四个独立的应用程序打包成一个以 apk 为扩展名的文件。这使得测试变得更容易,因为应用程序可以同时发布到许多不同的测试设备上。
遗憾的是,这种方法也有缺点。由于包含了所有架构所需的文件,应用程序的整体大小比原来要大得多。因此,用户最终会下载到与其手机不兼容的多余代码。
值得庆幸的是,在发布应用程序的生产版本时,您可以利用 App Bundles来优化发布过程。
App Bundle是一种发布格式,可以包含所有已编译的代码和资源。这都是因为 Google Play Store Dynamic Delivery 将根据最终用户的设备构建量身定制的 APK。
要构建 App Bundle,您只需调用一个与平常不同的脚本。不要使用 ./gradlew assembleRelease,而是使用 ./gradlew bundleRelease,就像这里介绍的那样:
$ cd android
$ ./gradlew bundleRelease
以应用捆绑包的形式构建 React Native 应用程序 Building a React Native app as App Bundle
安卓应用捆绑包为每个 CPU 多架构过度构建的主要优点是易于交付。毕竟,您只需交付一个工件,动态交付就会为您完成所有工作。在支持的平台上,它还为您提供了更大的灵活性。您不必担心最终用户设备的 CPU 架构。根据 Android 团队的数据,一个应用程序的平均大小减少了约 35%,但在某些情况下,甚至可以减少一半。
另一种减少构建大小的方法是启用 Proguard。Proguard 的工作原理类似于 JavaScript 中的 "死亡代码清除"--它会清除第三方 SDK 中未使用的代码,并对代码库进行缩减。
不过,Proguard 可能无法在某些项目中 "开箱即用",通常需要额外设置才能达到最佳效果。在本例中,我们可以将上述 28 MB 的构建大小减少 700Kb。这虽然不多,但仍然是一个进步。
def enableProguardInReleaseBuilds = true
在 android/app/build.gradle 中启用 proguard
另一个好方法是关注资源优化。每个应用程序都包含一些 svg 或 png 图形,可以使用免费网络工具进行优化。减少 svg 中的冗余文本和压缩 png 图片可以为项目节省大量字节。
使用 Gradle 优化应用程序,实现更小的 APK 和更快的 TTI
上面提到的所有步骤都比较容易上手,值得您在应用程序规模不断扩大时采用。通过针对不同架构构建应用程序,您可以最大程度地缩小应用程序的大小。但可能的优化措施还不止这些。
通过努力缩小 APK 大小,您可以尽最大努力降低下载取消率。此外,您的客户也将从更短的交互时间中获益,并更愿意经常使用应用程序。
最后,您将证明您关心每一位用户,而不仅仅是那些拥有一流设备和快速网络连接的用户。你的平台越大,支持这些小群体就越重要,因为每一个百分比的用户都会转化为成千上万的用户。
需要性能方面的帮助?请联系我们!
如果您正在为提高应用程序性能而苦恼,请随时 联系我们。我们是 Meta 和 Vercel 的官方合作伙伴,我们一直在为客户提供高质量的解决方案,并为 React Native 生态系统做出了巨大贡献。如果您正在寻找性能优化合作伙伴,我们的 React Native 开发公司 肯定是您的不二之选。