Lynx 渲染原理(一·二):资源下发与模板来源
2. 初始化:全局环境与页面容器
2.1 LynxEnv 全局初始化
源码明确要求在使用 LynxView 前初始化 LynxEnv。初始化内容包括:
- 初始化 LynxServiceCenter;
- 保存 Application、BehaviorBundle、AbsTemplateProvider;
- 初始化 Behavior 和自动注册组件;
- 初始化 DevTool、Native libraries、Trace、WASM;
- 初始化 Native UI thread、显示指标、全局缓存池等。
代码证据:LynxEnv.java:237、LynxEnv.java:277、LynxEnv.java:293、LynxEnv.java:321、LynxEnv.java:337。
2.2 LynxViewBuilder 创建页面容器
LynxViewBuilder 构造时会确保环境懒初始化,并默认拿到全局 TemplateProvider;也可以在当前 View 上覆盖 Provider。
代码证据:LynxViewBuilder.java:55、LynxViewBuilder.java:65。
LynxView lynxView = new LynxViewBuilder()
.setTemplateProvider(provider)
.build(context);
本节小结:这一章只做“把引擎和页面容器准备好”。此时有
LynxEnv、Provider、Behavior 和LynxView,但还没有真正的业务页面节点。
3. 模板下发:Lynx 不自己下载
3.1 Provider 是宿主责任
AbsTemplateProvider 只有一个核心回调:
public abstract void loadTemplate(
@NonNull String url,
Callback callback
);
宿主在这里实现网络、磁盘缓存或本地 assets 读取;成功回调 byte[],失败回调错误信息。代码证据:AbsTemplateProvider.java:12。
官方 Explorer 示例实际使用 Retrofit 异步请求,再将 ResponseBody.bytes() 交给回调:DemoTemplateProvider.java:17。
3.2 URL 场景的真实分流
LynxTemplateRender 会按资源能力选择:
- LynxViewGroup 自己提供 Bundle;
- LynxTemplateResourceFetcher 返回 TemplateBundle、ByteBuffer 或二进制;
- 旧路径使用 AbsTemplateProvider.loadTemplate(url, callback)。
代码证据:LynxTemplateRender.java:1431、LynxTemplateRender.java:1445、LynxTemplateRender.java:1473。
loadTemplate 对外允许从任意线程调用;在同步渲染路径上,源码会把调用切到 UI 线程:LynxTemplateRender.java:1646。
Provider 返回二进制后,回调会切回 UI 线程;空字节直接转成加载失败;有效字节再写回 metaData.binaryData 并重新进入 Bundle/二进制渲染分流:LynxTemplateRender.java:2917。
3.3 下发/下载的工程坑
- 返回值必须是有效 Lynx Bundle 二进制,不能把 HTML 错误页、JSON 错误体或前端源文件直接交给 Lynx。
- IO、网络、解压和磁盘缓存放在 IO 线程;UI 线程只接收结果并进入渲染流程。
- 缓存键至少包含 URL + 版本/hash;动态模板还要校验前端产物与客户端 Runtime 的兼容关系。
- Provider 必须覆盖空响应和失败回调;源码对 null/空模板有失败保护,但宿主仍要保证每个请求有明确终态。
- 模板 Bundle 加载成功不等于图片、字体、视频资源成功;这些资源需要单独配置对应 ResourceFetcher/Service。
- 若使用 ByteBuffer 预解析路径,TemplateBundle.fromTemplate(ByteBuffer, ...) 要求 DirectByteBuffer;非 DirectByteBuffer 会返回无效 Bundle。TemplateBundle.java:202
本节小结:下载不是 Lynx 引擎自己完成的。宿主负责网络、缓存、错误和返回正确的 Bundle,Lynx 拿到结果后才继续解析和渲染。