资讯详情

SystemUI Dagger2 精读:从注解到组件边界

📅 2026/10/22 13:05:05 | 华诺云谱 👁 阅读
SystemUI Dagger2 精读:从注解到组件边界
SystemUI Dagger2 精读从注解到组件边界基于D:\yanliangwork\n06SystemUiAOSP SystemUI / MediaTek 分支Android 15 时代代码目标读完能判断「一段新逻辑该放进哪个 Component、该不该开新 Subcomponent」这本书在解决什么问题绝大多数 Dagger 教程教你写Inject、Module、Component然后给你一个MainActivity和CoffeeMaker。你看完觉得自己懂了打开 SystemUI 却依然不知道为什么Pip明明在WMComponent里我却在SysUIComponent的构造参数里写OptionalPip为什么 Keyguard 的弹层要单开一个KeyguardBouncerComponent而不是把它的类直接塞进SysUIComponent为什么Dependency.java里堆了 140 个Lazy字段还活着这三个问题都不是语法问题是边界问题。而 Dagger 的边界是由「谁在什么时候、用什么输入、创建一个组件实例」决定的——这恰好是官方文档从不讲的部分。所以这本书不按注解字典组织而是按机制组织每一个机制都要落到一条真实调用链上每个结论都能在源码里指到具体行。先说结论全书三个核心判断判断一Dagger 在 SystemUI 里干的事本质是把启动顺序写进类型系统。SystemUI 是一个没有 Activity 生命周期可依附的常驻进程谁先建、谁后建、谁能看见谁全靠组件图表达。判断二作用域不是单例开关是实例缓存在哪个组件实例里。SysUISingleton的语义不是全局唯一而是唯一存在于 SysUIComponent 这一份实例中。搞混这一点就会写出同一个类有两个实例的幽灵 bug。判断三子组件的存在理由只有两个——运行期输入、独立生命周期。不是因为这个模块代码多也不是因为想分类整理。判据在第八章。源码基线本书引用的所有数字都来自实测指标数值说明Java/Kotlin 文件总数4144整个 SystemUI 模块含 Dagger 注解的文件1204约 29%DI 是主干而非点缀Component7真正的 graph 入口只有 1 个 rootSubcomponent48数量是 Component 的 7 倍这就是 SystemUI 的形态Subcomponent.Factory/.Builder34子组件几乎都是运行期创建的SysUISingleton581 个文件主作用域WMSingletonSystemUI 内仅 2 个文件定义在 WMShell 库说明边界是物理隔离的Provides方法523Binds方法342接口→实现的映射远多于手写工厂BindsOptionalOf21形态差异TV/无 PIP 设备的表达手段使用Lazy的文件71使用Provider的文件55使用IntoMap的文件40多绑定是清单的实现方式限定符qualifiers11 个Main/Background/Application/RootView/PerUser等编译配置Android.bpjavacflags: [-Adagger.fastInitenabled] // 226 行 plugins: [dagger2-compiler] // 229 行fastInit Soong 的plugins意味着Dagger 是编译期插件运行时零注解扫描。全书地图┌─────────────────────────────┐ │ 第1章 编译期APT 生成什么 │ └──────────────┬──────────────┘ │ 知道生成物长什么样 ┌────────────────────────────┼────────────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ 第2章 Inject │ │ 第3章 Module │ │ 第4章 Binds │ │ 1200 处构造注入│ │ Provides 523 处 │ │ 342 处映射 │ └───────┬───────┘ └────────┬─────────┘ └────────┬─────────┘ └───────────────┬───────────┴────────────────────────────┘ ▼ ┌──────────────────────┐ │ 第5章 作用域到底约束什么│ └──────────┬───────────┘ ▼ ┌──────────────────────┐ │ 第6章 Root/WM/SysUI │ ← 三条生命周期、单向可见性 └──────────┬───────────┘ ┌────┴────┐ ▼ ▼ ┌───────────────┐ ┌──────────────────────┐ │ 第7章 WM 边界 │ │ 第8章 子组件与 Keyguard│ ← 两个真实困惑 └───────┬───────┘ └──────────┬───────────┘ └────────┬─────────────┘ ▼ ┌────────────────────────────────────────┐ │ 第9章 成员注入Activity/Service/Provider│ │ 第10章 多绑定 IntoMap启动清单 │ │ 第11章 Lazy / Provider时机控制 │ └────────────────┬───────────────────────┘ ▼ ┌──────────────────────┐ │ 第12章 Dependency 去留 │ 新代码放哪决策树 └──────────────────────┘阅读路线按你的时间选45 分钟版第 5 章 → 第 6 章 → 第 8 章 → 第 12 章的决策树。这四段解决边界问题足够你判断新代码放哪。3 小时版1→2→3→4→5→6把机制打透跳过 9/10/11 的实现细节。通读版按顺序每章末尾的练习都要动手练习都不超过 10 分钟但能把看懂变成会改。每章固定结构小节作用① 机制讲清这个注解/组件在 Dagger 里的精确定义不讲类比② 源码定位文件名 行号表格可直接跳转③ 依赖图ASCII 图说明数据依赖的流向④ 为什么这么设计取舍分析如果反着做会怎样⑤ 动手练习可验证、有明确预期结果⑥ 常见坑编译期/运行期症状 → 根因一句话带走Dagger 不会让你的代码变好它只会把你的耦合关系画出来。你在这本书里要学的不是注解是怎么读那张图——以及怎么改它。开始阅读第 1 章 编译期 →
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑