Lynx 渲染原理(一):资源下发与模板来源

2 阅读2分钟

Lynx 渲染原理(一·二):资源下发与模板来源

2. 初始化:全局环境与页面容器

2.1 LynxEnv 全局初始化

源码明确要求在使用 LynxView 前初始化 LynxEnv。初始化内容包括:

  1. 初始化 LynxServiceCenter;
  2. 保存 Application、BehaviorBundle、AbsTemplateProvider;
  3. 初始化 Behavior 和自动注册组件;
  4. 初始化 DevTool、Native libraries、Trace、WASM;
  5. 初始化 Native UI thread、显示指标、全局缓存池等。

代码证据:LynxEnv.java:237LynxEnv.java:277LynxEnv.java:293LynxEnv.java:321LynxEnv.java:337

2.2 LynxViewBuilder 创建页面容器

LynxViewBuilder 构造时会确保环境懒初始化,并默认拿到全局 TemplateProvider;也可以在当前 View 上覆盖 Provider。

代码证据:LynxViewBuilder.java:55LynxViewBuilder.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 会按资源能力选择:

  1. LynxViewGroup 自己提供 Bundle;
  2. LynxTemplateResourceFetcher 返回 TemplateBundle、ByteBuffer 或二进制;
  3. 旧路径使用 AbsTemplateProvider.loadTemplate(url, callback)。

代码证据:LynxTemplateRender.java:1431LynxTemplateRender.java:1445LynxTemplateRender.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 拿到结果后才继续解析和渲染。