第2章 组件化编程

依据电子工业出版社完整目录覆盖46个节点:贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同

第2章 组件化编程

本页依据苍王《Android组件化架构》独立重构,不复制原文。版本锁定电子工业出版社2018年3月第1版、316页、ISBN 9787121336775。原书处在Gradle 4.1、Instant Run、Freeline、JCenter、旧Support Library与传统Manifest合并规则的历史环境。

课程先准确解释出版时的依赖、构建、分发和发布机制,再单列现代Android Gradle Plugin、Version Catalog、Build Cache、Jetpack Startup、Activity Result API与Maven Central迁移。已停用或改变的工具不能被删除,也不能冒充当前推荐。

学习目标

  • 能解释“第2章 组件化编程”全部46个正式节点的依赖方向、构建输入、运行所有者、制品与2018年版本边界。
  • 能实现“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”的最小垂直切片,并保存配置、任务图、产物、日志和断言。
  • 能比较正常、合并冲突、路由缺失、增量失效、生命周期错位与发布回滚,分析“用全局事件总线和字符串路由掩盖依赖,把权限、数据库、R类和混淆规则留给最终集成时碰撞”。
  • 能设计反例并凭消息时序、路由表、反射创建记录、存储归属、权限矩阵、资源冲突与渠道产物完成独立复现与交接。

从组件边界与证据开始

不等于目录或Gradle module。边界必须说明谁可以依赖谁、哪些类型公开、资源怎样命名、Manifest怎样合并、初始化由谁调度、制品由谁发布;编译器、构建系统和测试应能拒绝违规关系。

决定一次修改能否增量,以及缓存何时安全命中。需要用项目依赖图与自动测试证明,而不是靠团队口头约定。

运行阶段还要明确。Activity、Fragment、View、Application和后台线程的阶段不同,分发迟到或重复会造成泄漏与副作用。发布阶段用把源码提交连接到AAR与消费者,任何可变版本都会破坏回滚。

本单元主线是贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同。交互图把目录节点放入源码、构建、运行、制品和团队五层;故障实验一次只改变一个合并、路由、缓存或发布条件;证据门拒绝只展示“能够运行”的弱结论。

权威目录逐节点映射

第2章 组件化编程

正式节点 1/46。 “第2章 组件化编程”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.1 本地广播

正式节点 2/46。 “2.1 本地广播”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.1.1 本地广播基础介绍

正式节点 3/46。 “2.1.1 本地广播基础介绍”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.1.2 使用方法

正式节点 4/46。 “2.1.2 使用方法”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.1.3 本地广播源码分析

正式节点 5/46。 “2.1.3 本地广播源码分析”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.2 组件间通信机制

正式节点 6/46。 “2.2 组件间通信机制”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.2.1 组件化层级障碍

正式节点 7/46。 “2.2.1 组件化层级障碍”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.2.2 事件总线

正式节点 8/46。 “2.2.2 事件总线”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.2.3 组件化事件总线的考量

正式节点 9/46。 “2.2.3 组件化事件总线的考量”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3 组件间跳转

正式节点 10/46。 “2.3 组件间跳转”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3.1 隐式跳转

正式节点 11/46。 “2.3.1 隐式跳转”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3.2 ARouter路由跳转

正式节点 12/46。 “2.3.2 ARouter路由跳转”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3.3 Android路由原理

正式节点 13/46。 “2.3.3 Android路由原理”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3.4 组件化最佳路由

正式节点 14/46。 “2.3.4 组件化最佳路由”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.3.5 空类索引

正式节点 15/46。 “2.3.5 空类索引”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4 动态创建

正式节点 16/46。 “2.4 动态创建”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4.1 反射基础

正式节点 17/46。 “2.4.1 反射基础”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4.2 反射进阶

正式节点 18/46。 “2.4.2 反射进阶”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4.3 反射简化jOOR

正式节点 19/46。 “2.4.3 反射简化jOOR”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4.4 动态创建Fragment

正式节点 20/46。 “2.4.4 动态创建Fragment”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.4.5 动态配置Application

正式节点 21/46。 “2.4.5 动态配置Application”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.5 数据存储

正式节点 22/46。 “2.5 数据存储”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.5.1 数据的存储方式

正式节点 23/46。 “2.5.1 数据的存储方式”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.5.2 组件化存储

正式节点 24/46。 “2.5.2 组件化存储”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.5.3 组件化数据库

正式节点 25/46。 “2.5.3 组件化数据库”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.6 权限管理

正式节点 26/46。 “2.6 权限管理”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.6.1 权限机制

正式节点 27/46。 “2.6.1 权限机制”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.6.2 组件化权限

正式节点 28/46。 “2.6.2 组件化权限”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.6.3 动态权限框架

正式节点 29/46。 “2.6.3 动态权限框架”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.6.4 路由拦截

正式节点 30/46。 “2.6.4 路由拦截”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.7 静态常量

正式节点 31/46。 “2.7 静态常量”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.7.1 资源限制

正式节点 32/46。 “2.7.1 资源限制”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.7.2 组件化的静态变量

正式节点 33/46。 “2.7.2 组件化的静态变量”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.7.3 R2.java的秘密

正式节点 34/46。 “2.7.3 R2.java的秘密”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.8 资源冲突

正式节点 35/46。 “2.8 资源冲突”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.8.1 组件化的资源汇合

正式节点 36/46。 “2.8.1 组件化的资源汇合”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.8.2 组件化资源冲突

正式节点 37/46。 “2.8.2 组件化资源冲突”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.9 组件化混淆

正式节点 38/46。 “2.9 组件化混淆”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.9.1 混淆基础

正式节点 39/46。 “2.9.1 混淆基础”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.9.2 资源混淆

正式节点 40/46。 “2.9.2 资源混淆”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.9.3 组件化混淆

正式节点 41/46。 “2.9.3 组件化混淆”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.10 多渠道模块

正式节点 42/46。 “2.10 多渠道模块”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.10.1 多渠道基础

正式节点 43/46。 “2.10.1 多渠道基础”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.10.2 批量打包

正式节点 44/46。 “2.10.2 批量打包”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.10.3 多渠道模块配置

正式节点 45/46。 “2.10.3 多渠道模块配置”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

2.11 小结

正式节点 46/46。 “2.11 小结”必须回到“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”这条工程链:先写组件输入、输出、依赖方向和构建产物,再标运行时所有者、线程、进程、生命周期与失败路径。只列框架API或目录结构,不能证明组件边界成立。

为该节点固定Android Gradle Plugin、Gradle、JDK、仓库与设备环境,准备正常、冲突和回滚三个场景。保存任务图、生成源码或合并报告、运行日志和断言;2018年工具只能先按出版语境解释,再单列现代替代方案。

最小垂直切片

先预测依赖图和初始化顺序,再运行一个只有壳、合同和业务实现的最小工程。合同放在下层,业务实现不能反向依赖壳工程;注册必须幂等且能释放。

interface FeatureContract {
    val id: String
    fun start(registry: MutableMap<String, String>)
    fun stop(registry: MutableMap<String, String>)
}
 
class OrderFeature : FeatureContract {
    override val id = "order"
    override fun start(registry: MutableMap<String, String>) { check(registry.put(id, "ready") == null) }
    override fun stop(registry: MutableMap<String, String>) { check(registry.remove(id) != null) }
}

固定环境,保存依赖、Manifest、任务、产物与运行证据。命令名称可按现代工具链调整,但报告必须标明与2018年原书的差异。

./gradlew --no-daemon projects dependencies
./gradlew --no-daemon :app:processDebugMainManifest --info
./gradlew --no-daemon clean :app:assembleDebug --scan
unzip -l app/build/outputs/apk/debug/app-debug.apk > apk-contents.txt
adb logcat -d -v threadtime > component-run.log

把架构结论写成可以失败的行为合同:

Given pinned source, Gradle, plugin, JDK, repository, manifest, resource, and device inputs
When the smallest scenario for "aca18-02-component-programming" crosses build, runtime, or artifact boundaries
Then dependency direction, merged output, initialization order, observable behavior, and release match the prediction
And duplicate resources, missing routes, stale caches, destroyed owners, and unavailable artifacts fail explicitly
And modern replacements are recorded as migration evidence rather than original 2018 behavior

这三段材料分别证明源码合同、构建重放和用户可见行为。若日志没有提交、任务、变体、产物校验和、组件标识和阶段,便无法区分真正的组件机制与本机缓存或偶然初始化顺序。

五层架构与故障证明

源码边界。 画出壳、业务、公共与基础层,列出允许和禁止依赖。公共合同不得泄漏业务实现,资源前缀、包名、ProGuard规则与Manifest占位符都属于边界。用依赖图和违规样例让构建自动失败。

构建边界。 从源码集、资源、注解处理、Manifest合并到DEX、APK或AAR逐项记录输入输出。冷构建、无变更热构建、代码变化、资源变化和插件变化分别测量;Instant Run与Freeline只能在其历史失效条件内评价。

运行边界。 给Application、Activity、Fragment、View、线程任务和路由服务指定所有者。记录注册与释放时序,注入进程重建、配置变化、重复初始化、缺失实现和迟到回调;事件总线或反射成功调用并不自动证明生命周期正确。

制品边界。 AAR发布必须有不可变坐标、依赖元数据、校验和、仓库权限和回滚版本。测试本地缓存损坏、远程不可达、重复类、资源覆盖与消费者版本冲突。JCenter已经成为历史边界,现代迁移应指向受维护仓库。

团队边界。 每个组件明确源码、接口、构建、发布和故障所有者。模板只能加速一致入口,不能替代评审。架构升级以问题和度量驱动,一次只改变一个边界,并保留回退到上一个可发布版本的路径。

围绕“用全局事件总线和字符串路由掩盖依赖,把权限、数据库、R类和混淆规则留给最终集成时碰撞”预写推翻条件:依赖环、合并冲突、路由错配、重复初始化、错误线程、增量产物陈旧、AAR不可追溯或无法回滚中的任一项出现,都意味着当前方案不成立。最终交付消息时序、路由表、反射创建记录、存储归属、权限矩阵、资源冲突与渠道产物,让另一位开发者无需口头提示即可重放。

跨边界验收

从一个业务组件的源码修改开始,跟踪它经过依赖解析、资源与Manifest合并、编译打包、壳工程初始化、页面或服务分发,直到发布AAR与消费者升级。每一层都保存成功、失败和回滚证据;任何一步需要手工改壳或猜测版本,都说明自动化合同仍有缺口。

本章回顾

本页从“第2章 组件化编程”覆盖到“2.11 小结”,共46个正式节点。掌握标准是能沿“贯通本地广播、事件总线、ARouter、反射、存储、权限、资源、混淆与多渠道的组件协作合同”解释源码、构建、运行、制品与团队边界,运行正常与故障实验,并让另一位开发者凭消息时序、路由表、反射创建记录、存储归属、权限矩阵、资源冲突与渠道产物重放结论。

练习

问题 1:“第2章 组件化编程”覆盖哪些正式节点与工程主线?

问题 2:怎样建立本章最小垂直切片?

问题 3:本章最需要推翻的错误假设是什么?

问题 4:为什么一次集成成功不能证明组件化架构?

问题 5:怎样迁移历史工具而不改写原书?

问题 6:达到独立交接需要什么?

名词解释

本章出现的专业名词,用大白话再讲一遍。

组件边界
拥有清晰源码、资源、构建、运行和发布责任,并通过显式合同协作的工程单元。
构建任务图
从源码和资源输入经Gradle任务、变换、打包直到APK或AAR产物的有向过程。
依赖方向
基础、公共、业务和壳层之间只允许按约定方向连接的规则。
生命周期所有者
负责创建、注册、启动、停止并释放组件能力的唯一主体。
制品坐标
由坐标、版本、校验和、依赖元数据和仓库共同标识的可复现二进制。

← 上一页:第1章 组件化基础 · 下一页:第3章 组件化优化 →

资料与写作方式声明

本章以苍王《Android组件化架构》权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…