随着项目日益变得复杂、庞大,单一结构项目变得越来越难以维护,平时改个很小的功能,往往有种牵一发而动全身的赶脚,特别难受。最近简单尝试了下组件化后,嗯~真香。

android 创建组件 android组件化实现_android 创建组件


先上个项目结构图,简单分了壳app、主页main、登录模块login和个人中心模块member,另外还简单拆分了公共组件、基础组件和路由。

android 创建组件 android组件化实现_xml_02

开始搭建

首先创建壳工程,app模块下里面什么也不需要,它只是个空客,如果不小心默认生成了MainActivity,删掉;然后修改AndroidManifest.xml,去掉启动Activity相关,修改后如下

android 创建组件 android组件化实现_xml_03

业务模块创建

将模块main、login和member相继创建出来,这里演示创建main模块,其他模块的创建类似。

1、创建Module

android 创建组件 android组件化实现_android 创建组件_04

2、选择Module类型

这里选 Phoen & Tablet Module ,因为开发阶段每个Module都可以作为一个app独立运行。选 Next

android 创建组件 android组件化实现_xml_05

3、配置Module信息

命名Module名称、包名语言(Java or Kotlin)和最低支持Android SDK。Next后选择Activity,这里可以不选,我选了Empty Activity。再Next后默认使用MainActivity点Finish。这里需要注意一点的是,后面新建其他模块的时候,建议各模块新建的类不要重复,虽然可能不会报错,但是后面编译的时候可能会遇到一些奇怪的问题。

android 创建组件 android组件化实现_xml_06

其他的模块也如法炮制的创建就好了,这块还是很简单的。

统一版本管理

统一版本管理是必要的,这样做的好处是便于管理,避免依赖冲突等等。

1、配置文件config.gradle

在项目根目录新建config.gradle配置文件,配置文件中统一管理SDK,Android库和第三方库

android 创建组件 android组件化实现_android 创建组件_07

然后在project的build.gradle中依赖它

apply from: 'config.gradle'

buildscript {
    repositories {
        google()
        jcenter()
    }
    ...

2、Module中版本管理

isApplication是config.gradle的配置,为true时,各模块作为独立应用运行,反之则是项目的一个module。各模块如下配置

if (rootProject.ext.android.isApplication) {
    apply plugin: 'com.android.application'
}else {
    apply plugin: 'com.android.library'
}

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        if (rootProject.ext.android.isApplication) {
            applicationId "com.smart.main"//作为module时,不允许有自己的applicationId
        }
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
//略...
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    rootProject.ext.dependencies.commonModuleDependencies.each {
        implementation project(it)
    }
    annotationProcessor project(path: ':anotation_compiler')
    testImplementation rootProject.ext.dependencies.testDependencies
    androidTestImplementation rootProject.ext.dependencies.androidTestImplementation

}

到这里,组件化项目基本成型了,修改config.gradle中的isApplication等于true时,各个模块可独立运行;等于false时,各个模块就是项目的一部分,不能独立运行,可以观察模块图标。

AndroidManiFest资源合并

做完上面的工作后,isApplication等于false项目并不能跑起来。原因是各个模块都有属于自己的LAUNCHER Activity,所以还需要做处理。这里我以Login模块为例

1、不同模式下的Manifest

在main目录下新建manifest文件夹(文件名自定),制作一份AndroidManifest.xml在次目录,当Login作为module时使用,里面只声明组件。

android 创建组件 android组件化实现_ci_08

2、module下build.gradle配置

在 android 下添加 sourceSets,isApplication为true时使用默认的,为false时使用自定义的 AndroidManifest.xml

sourceSets{
    main{
        if (rootProject.ext.android.isApplication){
            manifest.srcFile 'src/main/AndroidManifest.xml'
        }else {
            manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
        }
    }
}

到此,无论出于哪种模式下,项目都能正常跑起来了。当然了,这只是一个很简单的Demo,距离成型的组件化项目还有很多坑要爬,慢慢爬呗,迈出了这第一步,下一步的落下就没那么恐惧了。

源码地址:戳我