启用Hermes的React Native Android正式包从Play Store下载后启动异常缓慢
同构建包不同安装渠道启动耗时差异原因及解决方案
核心原因梳理
- Hermes字节码文件被Play Store二次压缩
这是RN 0.63.x版本搭配Hermes最常见的触发场景。你本地构建时,默认会将Hermes生成的字节码文件(assets/index.android.hbc)标记为不压缩,启动时Hermes可以直接mmap映射文件执行,耗时极低。但Play Store的默认优化规则会对所有未明确声明免压缩的二进制资源做二次压缩,被压缩后的hbc文件启动时需要先完成全量解压、内存拷贝才能执行,直接导致启动耗时上涨3~10秒。
验证方法:把从Play Store下载的APK解压,对比assets下hbc文件的大小,和本地构建的APK中同文件大小对比,如果明显更小就是被压缩了。
解决方法:在android/app/build.gradle的android配置段添加打包规则,明确排除hbc文件压缩:
android { aaptOptions { noCompress 'hbc' } }
如果上传的是AAB包,还需要在gradle.properties中添加:
android.bundle.enableUncompressedNativeLibs = false
架构分发不匹配
你开启了enableSeparateBuildPerCPUArchitecture=true,如果上传到Play Store的是多架构APK或者AAB包,部分旧设备可能会被Play Store错误分发适配性更低的架构包(比如arm64设备被分发armeabi-v7a包),导致Hermes的字节码执行效率大幅下降。
验证方法:在应用启动时打印当前设备运行的so架构,对比本地安装的APK架构和Play Store下载的APK架构是否一致。
解决方法:可以针对不同架构的APK设置不同的versionCode,确保Play Store可以正确匹配设备架构分发对应安装包。Play Store安装后异步优化未完成
部分安卓系统版本中,通过Play Store安装应用后,系统的dex2oat优化会放到后台异步执行,应用首次启动时还没有完成优化,会导致启动耗时偏高。这种情况一般只会出现在首次启动,后续启动耗时会回落,如果是每次启动都慢可以排除该原因。
版本适配注意事项
你使用的RN 0.63.4属于较早支持Hermes的版本,官方后续修复了大量Hermes和Play Store优化规则的兼容问题,如果上述方案都无效,可以考虑将RN版本升级到0.66及以上的稳定版本,从底层解决兼容问题。
内容的提问来源于stack exchange,提问作者feiyingx
相关产品推荐
相关产品推荐

