如何减少 React Native Android 应用程序的启动时间

Posted

技术标签:

【中文标题】如何减少 React Native Android 应用程序的启动时间【英文标题】:How to decrease startup time on React Native Android applications 【发布时间】:2018-05-20 15:47:30 【问题描述】:

我目前正在尝试弄清楚如何减少 android 启动时间。这对 ios 来说不是问题,但对于 Android,我看到 6-10 秒。目标是 3-4 秒左右。

这是我所遇到的研究的摘要

createReactContext:react 桥被初始化并开始加载所有原生模块的地方 getMethodDescriptors:使用反射编译(运行时)使用ReactMethod 的所有公开方法的列表

解决方案存在但并不完美:

    LazyReactPackage(实验性)https://github.com/facebook/react-native/commit/797ca6c219b2a44f88f10c61d91e8cc21e2f306e 移除所有暴露的反射 ReactMethods https://github.com/facebook/react-native/pull/10084

我对这些解决方案的问题在于使用注释处理来生成类(编译时)。我正试图弄清楚如何让这些解决方案在没有运气的情况下运行。

此外,有关缩短 Android 启动时间的其他建议也会有所帮助。

谢谢!

【问题讨论】:

你有解决办法吗? 如果有人感兴趣,这里是为增加 Android 启动时间所做的整体更改:github.com/mattermost/mattermost-mobile/pull/1598 需要大量衡量和了解启动成本 【参考方案1】:

在您的项目目录中使用 expo optimize。 您还应该确保您没有添加任何额外的包,因为 js 包将在第一次启动时下载。

【讨论】:

【参考方案2】:

为此,Facebook 发布了他们的新构建机制Hermes,这将提高您的启动速度。但是你需要react native 0.60> 才能使用这个引擎。 https://facebook.github.io/react-native/blog/2019/07/17/hermes

【讨论】:

【参考方案3】:

根据上述信息,很难回答 Android 设备的瓶颈是什么,因为该问题缺少很多信息,例如您进行测试的设备规格、react-native 版本等。

这个问题是很久以前提出的,我认为当时的主要瓶颈是在旧JSC的使用上。由于 RN 仅从 0.59 版本开始使用自己的 JSC(不是 Android 默认的)。正如其他人指出的那样,从 RN 0.60 开始,他们还添加了使用 Hermes 引擎的功能(iOS 上也可以从 RN 0.64 获得)。所有这些优化都是为了提高 Android 设备的性能。

我认为现在,将 RN 0.60 与新的 JSC 或 Hermes 一起使用不会有问题。并且启动时间将与 iOS 大致相同(甚至可能更快)(假设您将在类似设备上进行测试)。

但是,如果您仍然认为应该优化启动时间,您可以查看 ram bundles。此机制允许您仅加载启动时需要的 JS 包的一部分(在许多应用程序中有很多地方,用户甚至可能看不到,并且此功能允许您加载这些部分,仅当它们是必需的)。因此,您可以简化入口点并仅加载一小部分捆绑包。

您可以查看react-native-bundle-splitter。该库与几乎所有流行的导航库很好地集成,并允许您推迟加载特定路线。例如,如果您有一个登录屏幕,您可以在启动时仅加载此屏幕,而所有其他屏幕在后台加载或开始加载它们,只有当用户可以看到它们时。您的复杂应用程序的启动时间几乎与“Hello world”应用程序相同。

【讨论】:

以上是关于如何减少 React Native Android 应用程序的启动时间的主要内容,如果未能解决你的问题,请参考以下文章

[RN] React Native 打包时 减少 Apk 的大小

在react-native中,我如何在ios和android的图像上添加水印

React Native Android原生模块开发实战|教程|心得|如何创建React Native Android原生模块

React Native项目中启用Hermes 引擎

React Native项目中启用Hermes 引擎

如何禁用 Android 上的设备后退按钮(react-native)?