不是大牛,也能上手组件化(一)

713 阅读3分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

好处

组件化就是在开发过程中将各个比较独立的业务模块独立打包运行调试,肉眼可见的好处就是缩短了编译测试时间,当然更多的是这样拆分后可以有效降低甚至消灭各个业务逻辑模块的耦合,方便协作开发;各个模块可以横向复用。话不多说我们直接代码搞起来。

代码

前情提要

首先我们需要对 gradle 脚本有一个基本的认识,gradle 使用的是 groovy 语言,也是一种 jvm 语言,通过 groovy 的能力我们自然就可以在 gradle 脚本中做出代码级别的改动,而不仅仅只是配置个依赖那么简单。

新建项目

首先我们需要对我们新建一个项目 ComponentTest 接着新建一个 userinfo 的 lib,我们可以看一下两个包对应的 build.gradle 文件中最上面的一行,这里表示对应的项目编译时候用的插件,我们可以将 library 改成 application 就可以看到 userinfo 也出现在了可安装的 app 菜单上。

// app
plugins {
    id 'com.android.application'
}
// userinfo
plugins {
    id 'com.android.library'
}

这样我们就发现了组件化的第一步,修改上面的配置代码就可以将组件运行到手机上,不过还有 applicationId 和 AndroidManifest.xml 需要处理,下面我们处理一下。

开始操作

首先我们在项目根目录下新建一个 config.gradle 文件,这就相当于新建了一个类文件,可以在别的 gradle 文件内引入的。文件里面定义一个 isModule 变量,根据这个变量我们来控制是否模块化打包。

ext {

    isModule = false

}

接着我们在根目录的 build.gradle 文件内引入上面的配置文件。

apply from: "config.gradle"

现在我们就可以使用我们定义的这个变量了,我们在 lib 的 build 文件里面使用下。

// 通过这个变量来控制是打包成 lib 还是打包成 app
if (isModule) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
// 如果独立打包就设置 applicationId
if (isModule.toBoolean()) {
    applicationId "xyz.xyz0z0.userinfo"
}
//
sourceSets {
    main {
        // 独立调试与集成调试时使用不同的 AndroidManifest.xml 文件,这是独立调试,需要有 application 等信息
        if (isModule.toBoolean()) {
            manifest.srcFile 'src/main/moduleFile/AndroidManifest.xml'
        } else {
            // 这是集成调试,只需要有 activity 信息就可以
            manifest.srcFile 'src/main/AndroidManifest.xml'
        }
    }
}

这里面我们根据开始时的分析,根据我们需要的打包模式,设置打包插件、applicationId、AndroidManifest 文件。这里面我们需要在源码目录中新建一个 moduleFile 文件夹,并在其中新建一个 AndroidManifest.xml 文件,这个文件就是我们独立打包时所用到的,所以需要配置一些其他信息。具体的代码可以在源码项目里面找到。

看看效果

现在我们改变 isModule 的值,就可以控制 userinfo 的打包方式了,而且独立打包的时候也能够完美运行到手机上。这样我们就算是走出了组件化的第一步了。后面我们还需要配置组件通信等步骤,请看第二篇分享。

本文是个人的学习记录,不免对技术点有错误或不够深入的理解,还望大神小白批评指教。 对应的源码地址 github.com/xyz0z0/Comp… 可以参考对应的 commit 记录查看