3. 预加载类重排方案整体架构
预加载类重排方案并非单一的排序算法,而是一个包含数据采集、分析、排序、集成和构建验证的完整闭环。整体架构划分为三个核心模块,辅以与 Android 构建系统的标准化集成接口,确保改动可自动化、可回滚、可追溯。
3.1 方案模块划分
整个重排方案分为三个独立且可替换的模块,每个模块拥有明确的输入/输出接口,便于单点测试与优化迭代。
| 模块 | 职责 | 输出 |
|---|---|---|
| 分析模块 | 解析热启动 trace,提取类加载顺序、依赖关系、访问频次 | 结构化依赖图 + 频次表 |
| 排序模块 | 根据依赖与频次生成新的预加载顺序,处理循环依赖 | 有序类列表(含校验信息) |
| 集成模块 | 将排序结果写入构建系统,更新 Zygote 加载序列,生成刷机镜像 | 预构建镜像 / 增量补丁 |
模块解耦收益:分析模块可单独使用不同 trace 收集工具(如 atrace / perfetto),排序模块可替换为不同算法(拓扑排序 / 遗传算法),集成模块可适配不同构建版本(user / eng)。各模块间通过 JSON/CSV 交换数据,降低耦合。
3.2 输入输出定义
输入清单
- 类加载序列 trace:Zygote 启动过程中的类加载日志,通常由自定义 bootclasspath agent 输出,格式为每行一个类名(全限定名),按实际加载时间顺序排列。
- 原始预加载类列表:位于
frameworks/base/core/java/android/preloaded-classes,约 2000+ 类,以换行分隔。 - 约束规则文件(可选):某些类必须在前/后加载(如系统服务依赖),以 YAML 格式提供。
输出清单
- 优化后的 preloaded-classes:与原始文件格式相同,但顺序已按热启动优化重排。
- 构建差异补丁:构建系统可直接应用的增量 diff,便于版本管理。
- 验证报告:包含重排前后类加载时间对比、依赖冲突标记等。
3.3 与 Android 构建系统的集成方式
原生 Android 构建系统基于 Android.bp(Soong)和 Makefile。预加载类重排流程需要作为构建前的一个独立步骤嵌入。
集成步骤
- 在
build/make/core/中新增preopt_reorder.py脚本,接收 trace 与原始列表参数。 - 在
Android.bp中声明genrule,触发脚本生成新列表。 - 将新列表覆盖到
out/target/product/<device>/system/etc/preloaded-classes。 - 重新编译 bootimage,验证 Zygote 启动。
Android.bp 集成示例(核心片段):
genrule {
name: "reorder_preloaded_classes",
srcs: [
"preloaded-classes",
"zygote_trace.parsed",
],
out: ["preloaded-classes.reordered"],
cmd: "python3 $(location preopt_reorder.py) " +
"--input $(in) --output $(out) --config constraints.yaml",
tools: ["preopt_reorder.py"],
}
prebuilt_etc {
name: "reordered_preloaded_classes",
src: ":reorder_preloaded_classes",
filename: "preloaded-classes",
sub_dir: "system/etc",
}
集成注意事项
| 场景 | 配置 |
|---|---|
| 全量编译 | 在 make 前先执行 make reorder_preloaded_classes |
| 增量编译 | 将生成的文件加入 PRODUCT_COPY_FILES 避免被清除 |
| 多目标设备 | 每个设备需独立运行 trace 采集,生成对应优化列表 |
常见错误:若 trace 文件缺失或格式错误,脚本应返回非零退出码,构建系统须中止以避免使用未优化列表。在集成脚本中建议添加
set -e 或显式异常处理。
3.4 模块调用流程(构建时)
- 分析阶段:脚本读取 trace,构建依赖图,输出临时文件
dep_graph.json。 - 排序阶段:读取依赖图与原始列表,执行拓扑排序,输出
sorted_list.txt。 - 集成阶段:将排序结果写入构建系统目标路径,更新 Zygote 启动序列索引表(若有)。
上述三个阶段均在构建主机上完成,运行时无任何开销。通过 ninja 的依赖追踪,仅当 trace 或原始列表发生变化时才重复执行。
3.5 版本兼容与回滚
集成模块会在 preloaded-classes 文件头部自动插入 元信息注释,包括生成时间、trace 版本、排序算法版本,便于问题定位。同时保留备份文件 preloaded-classes.bak,通过构建系统 PRODUCT_ARTIFACT_PATH_REQUIREMENTS 确保回滚可重复。
# 自动生成的元信息注释示例
# REORDER_VERSION=2.0
# TRACE_SOURCE=perfetto
# TIMESTAMP=2025-12-18_10:30:00
# RESULTS: boot_time_reduction 12.3% (vs baseline)
android.app.ApplicationLoaders
android.app.LoadedApk
android.content.Context
android.os.Handler
... (后续类列表)