欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 22:02:58
...

Android 组件化

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

一、组件化

1.1 说明

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

1.2 什么是组件化

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

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

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

1.2.1 我们之前是怎么开发的

上边可谓是一顿操作猛如虎,抬头一看啥都么(没)啊,好 那就上图
Android 组件化 (一)之入门介绍

说明一下 业务上边的线代表互相调用

是不是很复杂,直接就是你中有我,我中有你,无你我亡,密不可分,这就给我们扩展业务、耦合度带来了很大的不便,可谓是牵一发而动全身,功能测试的时候必须要系统测试,团队开发存在冲突,开发周期增长,

1.2.2 那现在和之前又有什么区别呢?

既然之前我们使用的方式寻在诸多问题,现在就介绍一个全新的开发模式,组件化模式,老样子,看图说话
Android 组件化 (一)之入门介绍

说明:图中的分为项目壳、业务组件和依赖,下面将会围绕这个图进行说明

那它和之前开发的区别在哪里呢? 嗯,问得好,在说清楚之前我先介绍几个组件化中的回出现的名词
- 集成模式 :将所有的业务组件被项目壳依赖,组成一个完整的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
看一下项目结构
Android 组件化 (一)之入门介绍

是不是有两个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

相关标签: 组件化 插件化