组件化系列文章介绍的内容稍微多了点,本着研究透这玩意的精神,从组件化的简介开始说起。
什么是组件化?
将多个功能模板拆分、重组的过程。
为什么要使用组件化?
1、加快编译速度,提高开发效率,增强可维护性、移植性。
2、高内聚(软件模块是由相关性很强的代码组成,只负责一项任务,即单一责任原则)、低耦合(模块间的依赖关系低)。
3、使每个业务模块变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到”app壳工程”中,从而得到一个具有完整功能的APP。
/ | 概念 | 优点 |
---|---|---|
组件化 | 解耦复杂系统时,将多个功能模板拆分、重组的过程。 | 1、提高组件复用性。 2、提高工程编译速度。 3、降低组件间的耦合。 4、能够独立运行在设备上。 5、利于多人团队协作开发。 |
模块化 | 将代码库组织为多个松散耦合的独立部分的做法。 | 1、提高代码复用性。 2、降低组件间的耦合。 3、利于多人团队协作开发。 |
插件化 | 插件化源于免安装运行apk的想法,免安装的apk可以理解为插件,支持插件的app成为宿主。 | 1、动态更新插件。 2、解决方法数超过65535的问题。 3、宿主和插件分开编译,提升开发效率。 4、减少安装Apk的体积、按需下载模块。 |
组件化和插件化的区别
启动Android Studio创建一个Android项目,在项目里new Module
,弹出的Create New Module
中选择Android Libary
或Phone & Tablet
,配置完成Module name
等参数后点击finish
完成创建。
在上图中,创建了common
与order
组件,common
组件推荐作为一个基础库,第三方的一些都在该库进行依赖,其它组件库使用第三方库直接引用common
组件即可,一定程度上避免了组件库重复引用的问题。
创建好的Module
文件目录下都有一个属于自己的build.gradle
文件,Gradle
文件执行顺序:settings.gradle
> Project build.gradle
> Module build.gradle
。
在Module build.gradle
中可以通过plugins
修改当前Model
为application
或library
,如下:
plugins {
id 'com.android.application' // application,可以作为app独立运行
id 'com.android.library' // library,可作为aar包引入application包使用
}
com.android.application
与com.android.library
无法共存,同一个Model
只能存在一个。不同的Model
可以相互使用implementation
引入到Model
中,使得Model
里的方法可以相互调用。
在Android项目中,每个Module
都有自己的.gradle
文件,Gradle
是一个使用Groovy
语言(核心代码是 Java
)编写的构建工具,具体使用教程可参考:来自Gradle开发团队的Gradle入门教程
使用组件化的项目一般会有多个 Module
,为了使不同 Module
的版本库配置使用相同的参数,需要在项目根目录创建一个app_config.gradle
,用以共享组件间相同的配置,避免过度碎片化。
app_config.gradle:
ext {
app_android = [
compileSdk : 32,
minSdk : 21,
targetSdk : 32,
versionCode: 1,
versionName: "1.0"
]
}
app_config.gradle
要想使其它 Module
都可以引用,需要在 Project
的 build.gradle
中对其进行全局引用。
apply from: 'app_config.gradle'
这样一来,所有 Module
的 build.gradle
就可以使用 app_config.gradle
的共享参数了
android {
compileSdk app_android.compileSdk
defaultConfig {
minSdk app_android.minSdk
targetSdk app_android.targetSdk
versionCode app_android.versionCode
versionName app_android.versionName
}
}
组件化的优点中有一个加快编译速度、提升开发效率的功能。
上面说到:在 Module
的 build.gradle
可以通过修改 application
或 library
控制当前组件为打包或集成模式。为了方便后续修改打包模式,app_config.gradle
增加了一个 isRelease
的打包配置参数。
ext {
// 控制打包的模式
isRelease = true
}
通过控制 isRelease
的布尔值,即可实现自动配置对应的 build.gradle
值,当然,前提是自动配置的代码提前写好。
// 公用的插件
plugins {
id 'org.jetbrains.kotlin.android'
}
// 根据打包模式使用的插件
if (isRelease){
apply plugin : 'com.android.library'
} else {
apply plugin : 'com.android.application'
}
当模块处于打包模式时,为避免安装一次出现两个应用图标的问题,整个App工程的所有 AndroidManifest.xml
只能出现一个带android.intent.action.MAIN
的 intent-filter
。
针对这种情况需要额外对不同打包模式下的 AndroidManifest.xml
文件做处理。
为此,我们可以在除主工程以外,需要在 debug
期间作为 application
工程独立运行项目的 build.gradle
文件添加以下配置。
android {
// 源集 —— 用来设置Java目录或者资源目录
sourceSets {
main {
if (!isRelease) {
// 如果是组件化模式,需要单独运行时使用该文件
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
// 集成化模式,整个项目打包时使用该文件
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
// release 时 debug 目录下的Java文件不需要合并到主工程
exclude '**/debug/**'
}
}
}
}
}
接着在main
文件夹添加debug
文件,将用到的 AndroidManifest.xml
文件放入里面,并将 src/main/AndroidManifest.xml
文件的配置设置为集成模式,可参考如下代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name=".MainActivity"
android:exported="true" >
activity>
application>
manifest>
组件化的进一步使用需要用到APT
,APT
全称为Annotation Processing Tool
,即注解处理器。有很多的框架都是基于APT实现,例如:ButterKnife
、Dagger
、EvenBus
、ARouter
等。
关于 APT
与 JavaPoet
的相关知识已整理好相关文章 【Android】APT与JavaPoet学习与实战
前往本文项目 【Android】从零搭建组件化项目
参考文档
1、Android 组件化实战(视频)