- 放弃 JIT
为了加快执行效率,现在主流的 JavaScript 引擎都会使用一个 JIT 编译器在运行时通过转换成机器码的方式优化 JS 代码。Faceback 团队认为 JIT 编译器有主要俩个问题:
(1) 要在启动时候预热,对启动时间有影响;
(2) 会增加引擎 size 大小和运行时内存消耗。
基于这俩点对性能指标的影响,Faceback 团队决定不实现JIT编译器。这里所谓放弃 JIT,有两点需要再解释一下:
(1) 纯文本 JS 代码执行效率降低。放弃JIT,是指放弃运行时 Hermes 引擎对纯文本 JS 代码的编译优化。
(2) 对 RN 代码的动态性无影响。由于 Hermes 仍然可以执行纯文本的 JS 代码,并且可以支持动态读取bytecode,因此对 RN 的动态性并无影响。
Hermes 缺点:
- bytecode 文件占用size过大问题:Hermes 编译的字节码文件比纯文本js文件增大 100%
- 执行纯文本 js 耗时长:在客户端将纯文本 js 转换成 bytecode 之前,我们让 Hermes 加载纯文本
- 缓存问题:使用缓存的 Hermes 引擎加载业务代码表现非常一般,甚至某些情况下比第一次加载还要慢
官方教程:
https://reactnative.dev/docs/hermes
官方教程非常简单,但是是纯 React Native 工程的改造流程,而没有混合工程的改造流程 (且纯 React Native 工程也一堆坑)
由于 WubaRNSDK 是混合工程,所以以下改造流程为自行摸索:
react-native init projectName --version 0.64.0-rc.2
npm install
在 node_modules 中获取 hermes 引擎的 aar:
aar 后缀改为 .zip,解压出 so 库,在 WubaRNSDK 中替换掉旧有的 libjsc.so、libc++_shared.so:
修改 ReactInstanceManager 的 JavaScriptExecutorFactory 为 HermesExecutorFactory:
ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()
.setApplication((Application) context.getApplicationContext())
.addPackage(new MainReactPackage())
.setRedBoxHandler(mExceptionHandler)
.setUseDeveloperSupport(RNDebugSwitcher.getInstance().isDebug())
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
.setJavaScriptExecutorFactory(new HermesExecutorFactory());
如果运行时出现,则是转换 Bundle 时字节码版本不对:
HermesVM: Compiling JS failed: Wrong bytecode version. Expected 76 but got 59
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ WubaRN$ExceptionHandler.handleException (WubaRN.java:526)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ : com.facebook.jni.UnknownCppException: Unknown
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at android.os.Handler.handleCallback(Handler.java:883)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at android.os.Handler.dispatchMessage(Handler.java:100)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at android.os.Looper.loop(Looper.java:224)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at java.lang.Thread.run(Thread.java:919)
demo 效果 (Engine: Hermes):
再尝试一下 core bundle + buz bundle 的场景:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
、Python等项目供你选择,真正体系化!**
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-SMIn7QCb-1712539795230)]