当前位置: 首页 > article >正文

RN 0.63 双端冷启动线程流转

RN 0.63 旧架构下Android 和 iOS 的冷启动都经历了相同的思路主线程入口 → 后台线程做重活创建引擎、加载 Bundle→ JS Thread 接管 → Shadow 计算布局 → 主线程渲染首帧。两端实现细节不同但线程模型一致。一、涉及的线程iOS4 条线程/队列线程/队列名称负责什么主线程Main ThreadAppDelegate 入口、RCTRootView 挂载、最终 UIKit 渲染后台初始化队列InitGCD background queue创建 JS 引擎、JS Thread、注册模块、加载 BundleJS 线程JS ThreadNSThread CFRunLoop执行 Bundle驱动后续 JS 逻辑布局计算队列Shadow QueueGCD serial queueYoga 布局计算生成 UIBlocksAndroid5 条线程线程名称负责什么主线程Main ThreadApp 入口、Activity 创建、ReactContext 挂载、最终 UI 渲染后台初始化线程Init ThreadAsyncTask创建 JS 引擎、Bridge、注册模块、加载 BundleJS 线程JS ThreadMessageQueueThreadBundle 执行完后启动负责所有后续 JS 逻辑布局计算线程Shadow ThreadYoga 计算布局构建 Shadow TreeUI 线程UI Thread将布局结果转成真实 Android View实际就是主线程二、iOS 冷启动流转┌──────────────────────────────────────────────────────────┐ │ 1. App 冷启动主线程 │ └──────────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────┐ │ AppDelegate.application:didFinishLaunching │ │ 创建 RCTBridge只是配置未启动 JS │ │ 创建 RCTRootView │ └───────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────┐ │ RCTRootView 触发 RCTBridge 开始初始化 │ │ → RCTBridge 内部创建 RCTCxxBridge │ └───────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切入后台队列GCD background ✦ ══════════════════ ┌──────────────────────────────────────────────────────────┐ │ 2. RCTCxxBridge 初始化后台 GCD queue │ └──────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ a. 创建 JS 引擎JSC 或 Hermes │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ b. 创建 JS Thread │ │ NSThread CFRunLoop 驱动 │ │ 线程名com.facebook.react.JavaScript │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ c. 注册 NativeModules │ │ 扫描所有 RCTBridgeModule生成模块配置表 │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ d. 加载 JS Bundle │ │ DevHTTP 读取 Metro │ │ ReleaseNSBundle mainBundle │ └─────────────────────────────────────────────┘ ══════════════════ ✦ 切到 JS Thread ✦ ══════════════════ ▼ ┌──────────────────────────────────────────────────────────┐ │ 3. 执行 JS BundleJS Thread │ │ - 定义所有模块 │ │ - 注册 ViewManagers │ │ - AppRegistry.registerComponent │ └──────────────────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切回主线程 ✦ ══════════════════ ┌──────────────────────────────────────────────────────────┐ │ 4. RCTBridge 通知 RCTRootView bridge 就绪主线程 │ │ → 调用 AppRegistry.runApplication │ │ → JS 开始描述 UI 结构 │ └──────────────────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切到 Shadow Queue ✦ ══════════════════ ┌─────────────────────────────────────────────┐ │ 5. RCTShadowView 布局计算Shadow Queue │ │ - 构建 Shadow Tree │ │ - Yoga 计算布局 │ │ - 生成 UIBlocks 放入 _pendingUIBlocks │ └─────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切回主线程 ✦ ══════════════════ ┌─────────────────────────────────────────────┐ │ 6. RCTUIManager flush UIBlocks主线程 │ │ - 创建 / 更新真实 UIKit View │ │ - 由 CADisplayLink 每帧触发 │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 7. RN UI 首帧渲染完成 │ └─────────────────────────────────────────────┘三、Android 冷启动流转┌──────────────────────────────────────────────────────────┐ │ 1. App 冷启动主线程 │ └──────────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────┐ │ Application.onCreate() │ │ 创建 ReactNativeHost仅配置不创建 RN 实例 │ └───────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────┐ │ Activity.onCreate() │ │ 创建 ReactRootView │ └───────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────┐ │ ReactRootView.startReactApplication() │ │ → 获取 ReactInstanceManagerRIM │ │ → RIM.createReactContextInBackground() │ └───────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切入后台线程Init Thread ✦ ══════════════════ ┌──────────────────────────────────────────────────────────┐ │ 2. ReactContextInitAsyncTask.run()后台线程 │ └──────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ a. 创建 JS 引擎JSC 或 Hermes │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ b. 创建 CatalystInstanceC Bridge │ │ JS ↔ C ↔ JNI ↔ Java 四层通信 │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ c. 注册 NativeModules由 ReactPackage 提供 │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ d. 加载 JS Bundle │ │ DevHTTP 读取 Metro │ │ Releaseassets://main.jsbundle │ └─────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────┐ │ e. 执行 JS Bundle │ │ - 定义所有模块 │ │ - 注册 UIManager / ViewManagers │ │ - AppRegistry.registerComponent │ │ → JS Thread 启动MessageQueueThread │ └──────────────────────────────────────────────────────────┘ ══════════════════ ✦ 切回主线程 ✦ ══════════════════ ▼ ┌──────────────────────────────────────────────────────────┐ │ 3. RIM.setupReactContext()主线程 │ │ - 创建 ReactContext │ │ - 通知所有 ReactRootView attach │ │ - 触发 UIManager.createRoot │ └──────────────────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切到 Shadow Thread ✦ ══════════════════ ┌─────────────────────────────────────────────┐ │ 4. Yoga 布局计算Shadow Thread │ │ - 构建 Shadow Tree │ │ - 计算各节点尺寸和位置 │ └─────────────────────────────────────────────┘ │ ▼ ══════════════════ ✦ 切到 UI Thread主线程 ✦ ══════════════════ ┌─────────────────────────────────────────────┐ │ 5. UIManager 操作 Android View │ │ createView / updateView / manageChildren │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 6. RN UI 首帧渲染完成 │ └─────────────────────────────────────────────┘四、双端对比环节AndroidiOS应用入口Application.onCreate()Activity.onCreate()AppDelegate.application:didFinishLaunchingRN 根视图ReactRootViewRCTRootViewBridge 管理器ReactInstanceManagerRIMRCTBridgeBridge 实体CatalystInstanceJava JNI CRCTCxxBridgeObjC C无 JNI后台初始化方式AsyncTask后台 GCD queueJS Thread 驱动MessageQueueThreadLooper/HandlerNSThreadCFRunLoopNativeModule 注册ReactPackageRCTBridgeModule宏Shadow 计算Shadow Thread独立 Java 线程Shadow QueueGCD serial queueUI 更新UIManager→ Android ViewRCTUIManager→ UIKit ViewUI 帧驱动ChoreographerCADisplayLink通信层JS ↔ C ↔ JNI ↔ Java4层JS ↔ C ↔ ObjC3层无 JNIiOS 比 Android 少一层 JNI因为 ObjC 支持直接混编 C.mm文件不需要额外的跨语言桥接。五、名词解释ReactNativeHostAndroid 侧 RN 的全局配置容器工厂模式。只持有配置Bundle 路径、Dev 模式开关等不直接创建 RN 实例由ReactInstanceManager负责真正的初始化。ReactRootView / RCTRootViewRN 的根视图容器。Android 侧继承自FrameLayoutiOS 侧继承自UIView。作用一样作为 Native 布局和 RN 渲染内容的边界RN 渲染的所有组件都挂在它下面。ReactInstanceManagerRIMAndroid 侧 RN 实例的调度中心。负责创建 JS 引擎、管理ReactContext生命周期、协调各线程的初始化顺序。iOS 侧对应的是RCTBridge。ReactContextInitAsyncTaskAndroid 的AsyncTask子类专门把 RN 初始化的耗时工作创建引擎、加载 Bundle移到后台线程避免主线程被阻塞。CatalystInstance旧架构 Android 侧的 Bridge 核心实体负责 JS ↔ C ↔ JNI ↔ Java 四层通信。所有 JS 调 Native、Native 调 JS 都经过它且必须 JSON 序列化。新架构用 JSI 替掉了它。JNIJava Native InterfaceJava 调用 C/C 原生代码的桥接机制。因为 JS 引擎JSC/Hermes是 C 写的Android 业务层是 Java两者必须通过 JNI 跨语言调用。iOS 没有这层ObjC 可以直接混编 C。ReactPackageAndroid 侧注册 NativeModule 的方式。开发者实现ReactPackage接口并返回模块列表RN 初始化时统一扫描注册。iOS 侧用RCTBridgeModule宏替代自动注册不需要手动列举。JS BundleMetro 打包后的 JavaScript 产物main.jsbundle。包含所有业务代码和第三方库。Dev 模式从 Metro HTTP 服务实时拉取Release 模式预先打包进 App 资源目录。MessageQueueThreadAndroid 侧 JS Thread 的实现基于LooperHandler机制。是一个有消息队列的后台线程所有 JS 任务串行投递到这里执行。iOS 侧对应的是NSThreadCFRunLoop。ReactContextRN 的运行时容器持有 JS 执行环境、NativeModule 注册表、Bridge 实例等。可以理解为 RN 的全局上下文初始化完成后通知所有ReactRootView开始渲染。UIManager / RCTUIManager负责将 JS 描述的 UI 结构转换为真实 Native View 的管理器。接收来自 JS 的createView、updateView、manageChildren等指令在主线程操作真实 View。Shadow Tree / ShadowNode / RCTShadowViewRN 的虚拟布局树。每个 JS 组件对应一个 Shadow 节点存储布局属性宽高、padding、flex 等。布局计算在 Shadow Thread / Shadow Queue 中进行不占用主线程。YogaFacebook 开源的跨平台布局引擎实现了 CSS Flexbox 规范Android 和 iOS 共用同一套 C 实现。RN 在 Shadow Thread 中用 Yoga 计算每个节点的实际尺寸和位置。RCTBridge / RCTCxxBridgeiOS 侧的 Bridge 管理器RCTBridge及其 C 实现层RCTCxxBridge。RCTBridge是对外的 ObjC 接口RCTCxxBridge是真正执行初始化的 C 核心负责创建 JS 引擎、JS 线程、注册模块。RCTBridgeModuleiOS NativeModule 的注册协议。在 ObjC 类里加上RCT_EXPORT_MODULE()宏RN 初始化时自动扫描注册不需要像 Android 那样在ReactPackage里手动列举。_pendingUIBlocksRCTUIManager内部的待执行 UI 操作队列。Shadow Queue 计算完布局后把需要做的 View 操作封装成 Block 放进来等 CADisplayLink 触发时批量提交到主线程执行避免频繁切换主线程。CADisplayLink / Choreographer屏幕刷新率同步计时器。iOS 用CADisplayLinkAndroid 用Choreographer都是每帧~16.7ms触发一次驱动 RN 把_pendingUIBlocks批量提交到主线程更新 UI。六、与新架构的对比旧架构0.63的瓶颈主要集中在 Init Thread 这一段旧架构新架构改进CatalystInstance四层序列化通信JSIJS 直接持有 C 对象引用无序列化NativeModules 启动时全量注册TurboModules懒加载首次调用时才初始化Shadow Tree 可变需要线程锁FabricShadow Tree 不可变多线程安全不支持 React 并发特性Fabric 支持可中断渲染、优先级调度

相关文章:

RN 0.63 双端冷启动线程流转

RN 0.63 旧架构下,Android 和 iOS 的冷启动都经历了相同的思路:主线程入口 → 后台线程做重活(创建引擎、加载 Bundle)→ JS Thread 接管 → Shadow 计算布局 → 主线程渲染首帧。两端实现细节不同,但线程模型一致。一…...

别再手动画码了!C#搭配ZXing.Net库,5分钟搞定商品标签一维码与会员卡二维码生成

企业级条码生成实战:用C#和ZXing.Net实现高效标签与会员卡管理 在仓储物流和会员管理的数字化浪潮中,条码技术早已从简单的商品标识进化为企业数据流转的核心枢纽。想象一下这样的场景:当仓库管理系统(WMS)收到订单时,系统自动生成…...

数据结构之伸展树(Splay Tree)详解

伸展树(Splay Tree)详解 目录 引言伸展树的基本概念伸展操作伸展树的操作 插入操作查找操作删除操作 时间复杂度分析伸展树与其他平衡二叉搜索树的比较应用场景代码实现示例总结 引言 伸展树(Splay Tree)是一种自调整的二叉搜…...

Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案

Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

FastAdmin自定义Excel导入功能:从数据读取到灵活处理

1. 为什么需要自定义Excel导入功能 FastAdmin自带的Excel导入功能虽然开箱即用,但在实际项目中经常会遇到各种限制。最常见的问题就是系统强制要求Excel表头必须与数据库字段备注完全一致,这种强耦合的设计会导致三个主要痛点: 首先&#xff…...

从需求到代码:基于快马平台快速构建javaweb在线考试系统实战

今天想和大家分享一个实战项目——基于SpringBootVue的在线考试系统。这个系统从需求分析到代码实现,我全程使用了InsCode(快马)平台来加速开发流程,效果出乎意料的好。 系统架构设计 采用前后端分离架构,后端使用SpringBootSpringSecurity&a…...

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型 第一次打开TruckSim时,面对密密麻麻的参数和复杂的界面,很多新手会感到无从下手。作为一款专业的商用车动力学仿真软件,TruckSim确实有一定的学习门槛,但掌…...

开源智能体的安全第一课:OpenClaw案例

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

别再用临时邮箱了!用Python+Selenium自动化管理你的Augment AI多账户(附完整脚本)

构建可持续的Augment AI自动化账户管理系统 在AI辅助编程工具日益普及的今天,开发者们对高效工具的依赖程度越来越高。Augment AI作为一款强大的代码助手,其免费版本300次的使用限制常常成为开发者工作流中的瓶颈。传统解决方案如手动重置或使用临时邮箱…...

告别DCOM噩梦:手把手教你用KepOPC DA2UA中间件搞定OPC DA到UA的转换(附Python读写测试代码)

工业数据互通新范式:零配置实现OPC DA到UA的无缝迁移实战 如果你是一名工业自动化工程师,一定对这样的场景不陌生:凌晨两点还在客户现场调试DCOM配置,反复检查防火墙规则、用户权限和网络策略,却依然无法让OPC DA客户端…...

手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

目录 手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量​ 摘要​ 一、背景与挑战​ 1.1 坡道重力扰动的痛点与传统控制局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统PI控制的缺陷​ 1.2 DOB控制的核心优势​ 1.3 设计目标​ 二、系统架构与D…...

YOLOv11卷积模块深度剖析:从参数解析到实战应用

1. YOLOv11卷积模块设计精要 第一次接触YOLOv11的配置文件时,我和大多数开发者一样被那些看似简单却暗藏玄机的参数搞得一头雾水。特别是当我在backbone部分看到[-1, 1, Conv, [64, 3, 2]]这样的配置时,直觉告诉我输出通道数应该是64,但实际运…...

高并发系统的“救命稻草”——BASE 理论

今天我们要聊的话题,是互联网架构的“遮羞布”,也是高并发系统的“救命稻草”——BASE 理论。如果说 ACID(原子性、一致性、隔离性、持久性)是传统数据库的“洁癖”,要求数据必须时刻保持完美,那 BASE 就是…...

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为流放之路复杂的角色构建而头疼吗?PoeCharm作为Path of …...

在WSL2上搞定PyTorch模型转昇腾OM:我的Atlas 200DK部署踩坑实录

在WSL2上实现PyTorch模型到昇腾OM的高效转换:避坑指南与实战解析 对于希望在Windows环境下完成昇腾模型转换的开发者来说,WSL2提供了一个近乎完美的解决方案。本文将深入探讨如何在这一环境中高效完成从PyTorch到昇腾OM模型的完整转换流程,同…...

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在数字娱乐日益普及的今天,Steam创意工坊作为游戏模组的重要…...

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensible)是…...

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUI+API+Redis缓存

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUIAPIRedis缓存 1. 环境准备与快速部署 在开始之前,请确保您的硬件配置满足以下要求: 显卡:RTX 4090/4090D 24GB显存内存:≥120GBCPU:10核及以上磁盘…...

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能 【免费下载链接】openlens-node-pod-menu Node and pod menus for OpenLens 项目地址: https://gitcode.com/gh_mirrors/op/openlens-node-pod-menu 引言:解决OpenLens 6.3.0的功…...

新手友好:借助快马平台的免费token轻松迈出AI应用开发第一步

作为一名刚接触AI开发的新手,我最近在InsCode(快马)平台上完成了一个文本摘要生成器的项目,整个过程非常顺畅。这个平台对初学者特别友好,尤其是提供了免费token,让我们可以零成本体验AI开发的乐趣。 理解token的概念 刚开始我对…...

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo,新手最容易踩的5个坑

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo的实战解析 在Unity开发中,射线检测(Raycast)就像游戏世界的触觉神经,它让虚拟物体有了"感知"能力。但这条看似简单的直线背后,却藏着不少让新手开发者抓狂的陷阱。…...

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看 你是不是刚接触AI模型,看着各种复杂的部署命令和配置就头疼?想快速体验一个能聊天、能推理、还能帮你写东西的智能助手,但又担心自己的电脑配置不够,或…...

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南 引言 从帮助渐冻症患者“开口说话”,到用“意念”操控无人机,脑机接口(BCI)正从科幻走进现实,成为“AI for Scienc…...

Docker网络扫盲:除了host.docker.internal,还有哪些方法能让Dify容器访问宿主机的服务?

Docker容器与宿主机通信的5种实战方案及选型指南 当你第一次在Docker容器里尝试连接宿主机上的MySQL或Redis服务时,那个经典的"Connection refused"错误可能会让你困惑不已。为什么明明在宿主机上运行得好好的服务,到了容器里用localhost就访问…...

Whisper.cpp 跨平台编译与语音识别实战指南

1. Whisper.cpp 是什么?能做什么? 第一次接触 Whisper.cpp 是在一个语音转文字的需求场景中。当时需要处理大量会议录音,但发现主流的语音识别工具要么需要联网,要么对硬件要求极高。直到发现了这个基于 C 实现的轻量级解决方案&a…...

AI建站工具避坑指南:10个高频问题与真相解答

面对AI建站这个新事物,心动的人多,但真正敢下手的人,心里都藏着不少问号。“这东西靠谱吗?”“我的数据会不会丢了?”“用这个做了网站,以后会不会被圈住?”这些顾虑非常正常。今天这篇文章&…...

Vue多文件学习项目综合案例——面经基础版,黑马vue教程

文章目录一、项目截图二、主要知识点三、main.js四、App.vue五、viewsArticle.vueArticleDetail.vueCollect.vueLayout.vueLike.vueUser.vuerouterindex.js一、项目截图 二、主要知识点 路由跳转路由传参缓存组件:keep-alive 三、main.js import Vue from vue im…...

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是…...

Bifrost:三星固件处理的跨平台工具解决方案

Bifrost:三星固件处理的跨平台工具解决方案 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 在三星设备的维护与开发过程中,固件管理始终是核心环节。无论是官方系统更新、自定义ROM开发还是设备…...

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径 【免费下载链接】entr Run arbitrary commands when files change 项目地址: https://gitcode.com/gh_mirrors/en/entr entr 是一款轻量级文件变化监控工具,能够在文件发生变化时自动执行…...