这个例子有以下特点:
- 四个 Dart 库,其中 Dart 库 lib1 依赖于 lib2。lib1、lib3 和 lib4 被作为延迟组件导入到 flutter 应用程序的主代码中。
- 四个加载单元,其中 id 为 1 的是基本单元,加载单元 2 同时包含 lib1 和 lib2。加载单元 3 和 4 分别包含 lib3 和 lib4。
- 三个定义的延迟组件,加上一个隐式基本组件。延迟组件 1 包含加载单元 2 和静态资源。延迟组件 2 包含加载单元 3 和 4,没有静态资源。而延迟组件 3 是一个仅含静态资源的组件。
app-release.aab
是完整的构建输出文件,包含三个延迟组件以及基本组件。
.aab
文件中总包含一个未显式声明的基本组件,它包含核心的 Flutter 包以及最基本的应用程序代码。任何未被延迟加载的库都会被包含在基本加载单元中。如果没有生成基本单元以外的加载单元,这可能意味着延迟导入的文件不正确。
对于延迟导入的库而言,里面非延迟导入的文件,会被编译到一个加载单元中:
loadLibrary()
调用的生命周期
延迟组件主要通过 dart 中的 loadLibrary()
调用来触发被下载、安装和加载。这个调用在 dart2js 和 aot/native 中的处理是不同的。这里,我们梳理 loadLibrary()
调用转换为一个延迟组件的安装过程:
dart 中 loadLibrary()
会调用的 native 层的 Dart_DeferredLoadHandler 函数,该回调函数在DartIsolate::Initialize 中由 Dart_SetDeferredLoadHandler 设置。Dart 在内部检索分配给库的加载单元 ID,并将其传递给回调函数。回调到 DartIsolate::OnDartLoadLibrary。
加载单元 ID 然