Android 架构 - 组件化
一、概念
组件化是基于可重用目的,对单个功能进行开发,提升复用性降低耦合度。多个功能组件起来就是一个业务组件,多个业务组件组合起来就是一个应用,因此去除了模块间的耦合,使得按业务划分的模块成了可单独运行的业务组件。(组件化只是一定程度上的独立,还是依附于整个项目中,想完全独立详见插件化)
- 功能复用:每个组件都是一个单独的功能,可被不同的模块甚至不同的应用所使用。
- 提高效率:每个组件都是一个可单独编译运行的APP,由于拆分使得代码量少,调试起来快。
- 协同开发:组件之间相互独立,使得不同的开发人员能专注于各自的功能开发互不影响。
1.1 需要考虑的问题
组件分层、切换模式按需编译、组件通信(路由框架)、组件生命周期(组件在应用中存在的时间,组件是否可以按照需求动态使用,涉及到组件的加载卸载等管理问题。)
1.2 插件模式
在组件的构建脚本 build.gradle 中指定,指定为集成模式(Library)可以被其它组件调用,指定为组件模式(Application)可以独立运行调试。
| com.android.application | 项目构建后输出 apk 包,在调试时是一个应用能单独编译运行。 |
| com.android.library | 项目构建后输出 aar 包,在打包时是一个库文件集成到项目中。 |
//写法一(和别的一起写)
plugins {id 'com.android.library'id 'org.jetbrains.kotlin.android'
}
//写法二(分开写)
apply plugin: 'com.android.library'
1.3 创建组件
File→New→New Module。业务组件需要调试选择【Phone & Tablet】,功能组件(最后还是通过业务组件来调试)基础组件只用来集成选【Android Library】。

二、结构划分
依赖关系是上层依赖下层,修改频率是上层高于下层。对于业务组件由于存在页面跳转、方法调用、事件通信等问题需要使用路由通信,其它层组件不存在耦合问题封装成 Library 即可。
| app壳 | 主工程,应用的入口,将业务组件打包成一个APP(打包环境、签名、混淆、主题等配置工作)。 |
| 业务组件 | 业务组件之间无直接关系,通过路由进行通信。既可以作为 Application 单独编译运行调试,又可作为 Library 集成到项目中。(主页、消息、商城) |
| 功能组件 | 对公用的功能进行封装。非必须层,业务组件可以直接依赖基础组件去实现功能。(支付、分享) |
| 基础组件 | 实现路由、一般是第三方框架、第三方SDK,修改频率极低。(Retrofit、Glide) |
三、统一配置
3.1 创建并引入 config.gradle
创建方式是对 Project 的 build.gradle 使用 Ctrl+C 和 Ctrl+V,命名为 “config.gradle” 清空里面的代码并同步一下,然后在 Project 的 build.gradle 中引用刚才创建的文件。

3.2 配置组件模式切换的全局变量 isDebug

四、搬空app壳
4.1 module_core

4.2 MainActivity
将 app 中的 MainActivity.class 和 activity_main.xml 剪切至 module_core 中,并将 AndroidManifest 中的 MainActivity 注册(包含程序入口)也剪切至 module_core 中只保留 <application> 标签。

4.3 AndroidManifest
每个组件都会有自己的清单,最终会打包合并成一个文件,需要解决属性冲突。分别对 app 的 <manifest> 和 <application> 添加如下代码。
| manifest 标签 | xmlns:tools="http://schemas.android.com/tools" |
| application 标签 | tools:replace="android:label,android:icon,android:theme,android:allowBackup" |

4.4 build.gradle
四、
