Android 组件化 (一)之入门介绍
Android 组件化
Android组件化(二)之Androidmanifest.xml和Application
Android组件化 (三)之 组件间的通信方式
Android组件化 (四)之集成模式中的重构
一、组件化
1.1 说明
随着我们项目的迭代,我们的功能模块回逐渐增多,业务逻辑有最初的不复杂逐渐变的复杂,业务模块的增多,有经验的人肯定回尽量的去符合“高内聚 低耦合“,但是项目的迭代往往是在最初无法预估发展方向的,这时,还要坚持“高内聚 低耦合“的原理,就要不断的对代码进行重构,重构是需要花费很多时间、精力、人力的,这时我们应该在迭代的时候寻求最小的重构机会,将我们的项目组件化
1.2 什么是组件化
组件化(Component) ,将一个项目分成可以独立运行开发和统一集成发布 的方法 ,
note:这是我对组件化的理解,如果有错差,请不要采纳
带上兄呆我的这个定义,我们去看这样几个问题,或许这就是你想知道的问题,来,看下边:
- 我们之前有是怎么做的?
- 那现在和之前又有什么区别呢?
- 什么是独立运行开发?
- 什么有是统一集成发布呢?
- 在紧张的工作中我们需要学习什么
- 现在又是怎样去实现的呢?
好的,我们一个一个来看一下
1.2.1 我们之前是怎么开发的
上边可谓是一顿操作猛如虎,抬头一看啥都么(没)啊,好 那就上图
说明一下 业务上边的线代表互相调用
是不是很复杂,直接就是你中有我,我中有你,无你我亡,密不可分,这就给我们扩展业务、耦合度带来了很大的不便,可谓是牵一发而动全身,功能测试的时候必须要系统测试,团队开发存在冲突,开发周期增长,
1.2.2 那现在和之前又有什么区别呢?
既然之前我们使用的方式寻在诸多问题,现在就介绍一个全新的开发模式,组件化模式,老样子,看图说话
说明:图中的分为项目壳、业务组件和依赖,下面将会围绕这个图进行说明
那它和之前开发的区别在哪里呢? 嗯,问得好,在说清楚之前我先介绍几个组件化中的回出现的名词
- 集成模式 :将所有的业务组件被项目壳依赖,组成一个完整的APP
- 组件模式:独立开发业务组件,每一个业务组件就是一个APP
- 项目壳:负责依赖所有组件,打包(签名打包)等,不做其他的业务逻辑
- 业务组件:根据每个业务而建立的专门针对此业务的可运行的APP,是一个单独的工程
- 通用依赖组件:将一些在开发或者项目中的公共部分提取到这个地方,比如:网络请求啊,Application、BaseActivity等等
- 功能组件:提供基础功能,日志管理等基础运用的
- Main:属于业务组件,指定第一次动的介绍页面、启动页面,主界面等
当然看完这几个名词之后,一半儿的困惑已经消失了,在组件化的开发过程中,我们是将各个模块也就是业务做成独立的可运行的module,包括开发、测试等都是在独立进行,到最后我们将所有的module 依赖到项目壳中,集成编译发布,就完成了
1.2.3 什么是独立运行开发呢
这个很好理解,大家也都很熟悉,只要我们在Android studio 中创建项目之后创建一个module 就可以独立运行开发了
1.2.4 集成统一发布
1.2.5 需要学习什么?(自己心里没点数吗!!!)
1.2.6 该怎么做?
大哥,这才是重点啊!!!
首先记住一句话,这是整个组件化的精髓所在
组件时application,集成时Library!!!!
大家应该知道,AS 中module (可运行的单独项目)Library(依赖)都有build.gradle
然而区分他们的正是
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
我们要在两种模式中自动转换而不是每次去手动修改,因为我们也不知道我们的业务组件到底有多少,所以我们需要找一个一次改变到处生效的方式,对于我们Java开发者而言,最好的的方式就是全局的boolean变量,true时applocation false时library了 ,好,那就寻找一个。
改变组件的属性,并且要Java的变量是需要在Gradle中定义的,Gradle自动构建工具在AS创建项目的时候回生成一个gradle.properties文件 在这个文件中定义一个全局变量,在整个Android项目中都是可以使用的
- 定义一个变量 比如:
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
isComponent=false #这是在gradle.properties中定义的控制全局是组件还以依赖额变量
再说一边 组件时application,集成时Library!!!! 这是很重要的,
然后就开始做了 在每个module的build.gradle中做一个判断
if (isComponent.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
并且你要知道的是library中的build.gradle 中是不需要applicationId 的,同样我们也做一个判断
android {
compileSdkVersion 27
defaultConfig {
if (isComponent.toBoolean()) {
applicationId "com.beastwars.module_main"
}
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
//...
}
这样我们就可以在gradle.properties中做到一处修改,到处生效了,
note:修改完记得Sync Now
这样还是不够的,在AS中每一个组件都是有对应的Androidmanifest.xml ,那等到我们在集成模式的时候每个项目都有自己的自动类,都用自己的Application ,这都时候肯定是要器冲突的,好,这位大哥说了,我们也适用判断,对,是需要判断,但是要也只能在build.gradle中进行判断,来我们看一下是怎么做的
我们的做法是在module中创建一个module的文件夹,在文件夹中同样建立Androidmanifest.xml,和Application类,然后在配置使得在不同的模式中使用不同的Androidmanifest.xml
看一下项目结构
是不是有两个Androidmanifest.xml
再看配置
sourceSets {
main {
if (isComponent.toBoolean()) {
//这就是在module中的Androidmanifest.xml
manifest.srcFile 'src/main/moudle/AndroidManifest.xml'
} else {
//这是集成模式中的Androidmanifest.xml
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
exclude 'test/**'//除掉module中特定的类文件等
}
}
}
}
好了,拿葱的大婶说话了,这样分开不是和module中的Androidmanifest.xml一样吗,顶个毛用,好,大婶先不急,请看下篇 我接着讲!!
上一篇: HCL实验6:静态路由