Android 组件化 (一)之入门介绍

Android 组件化

Android组件化(二)之Androidmanifest.xml和Application
Android组件化 (三)之 组件间的通信方式
Android组件化 (四)之集成模式中的重构

一、组件化

1.1 说明

随着我们项目的迭代,我们的功能模块回逐渐增多,业务逻辑有最初的不复杂逐渐变的复杂,业务模块的增多,有经验的人肯定回尽量的去符合“高内聚 低耦合“,但是项目的迭代往往是在最初无法预估发展方向的,这时,还要坚持“高内聚 低耦合“的原理,就要不断的对代码进行重构,重构是需要花费很多时间、精力、人力的,这时我们应该在迭代的时候寻求最小的重构机会,将我们的项目组件化

1.2 什么是组件化

组件化(Component) ,将一个项目分成可以独立运行开发统一集成发布 的方法 ,
note:这是我对组件化的理解,如果有错差,请不要采纳
带上兄呆我的这个定义,我们去看这样几个问题,或许这就是你想知道的问题,来,看下边:

  1. 我们之前有是怎么做的?
  2. 那现在和之前又有什么区别呢?
  3. 什么是独立运行开发?
  4. 什么有是统一集成发布呢?
  5. 在紧张的工作中我们需要学习什么
  6. 现在又是怎样去实现的呢?

好的,我们一个一个来看一下

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一样吗,顶个毛用,好,大婶先不急,请看下篇 我接着讲!!

Android 组件化(二)之Androidmanifest.xml和Application

猜你喜欢

转载自blog.csdn.net/qq_32648731/article/details/80693725