Kotlin学习(二)-------组件化架构

91 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是组件化?

公司业务发展好,项目迭代版本增多,开发周期更长,业务模块日渐增加,就一个小开发仔已经满足不了日常的开发需求了,但是项目代码逻辑这么复杂怎么办?业务这么多怎么办?
有没有方法能完全隔离各业务模块,模块间通讯来约束一定的规则,各个业务之间编写自己的module!
module?能不能是library!对了,能不能让所有的业务子模块变为Library,提供给App主模块引用,各开发仔只负责编写自己的业务Library?

但Library不能像App主模块一样自主编译调试,如果在App主模块里开发完再抽取成Library显然是不可取的,能不能在开发过程中让业务部门的Library是个自主运行的Module,打包上线时再转换为供App主模块引用的Library?

Android 主Module 与 Library配置上有什么区别?

1、build.gradle配置信息不同

image.png

2、AndroidManifest.xml配置信息

image.png

Library能像主项目一样运行起来么,当然也可以,将liabrary仿照主项目的配置改一下,就变成module了!

不妨总结下,将Library转换为可执行Module的过程,称之为 “组件化” 过程,转换为组件后,业务部门对其进行开发,开发完毕再转换为Library供app主模块引入,最终打出完整的apk包,这个过程称之为 “集成化” 过程。

如何做到自动化转换?

显然,如果开发中手动去做转换,这样的体验很糟糕,且极易出错,不妨交给Gradle试试。

以上面为例,我们先用Gradle将这两个模块涉及到的依赖以及版本信息统一管理起来,歩奏大致如下:

  • 1、在项目根目录创建config.gradle文件;
  • 2、配置版本依赖库相关信息;
  • 3、并在项目根目录的build.gradle中将其导入。
// config.gradle文件内容:
ext {

    // true 组件化环境,将所有业务Library组件化为可执行Module,供开发人员开发
    // false 集成环境,将所有可执行Module集成化为Library,打包到App主模块里
    isComponent = false

    //各依赖的版本号也统一写在这里,方便直观的查看及其更改
    kotlin_version = "1.3.72"
    ktx_version = "1.3.2"
    appcompat_version = "1.2.0"
    material_version = "1.2.1"
    constraintlayout_version = "2.0.4"
    kotlin_mvp_version = "1.2.1"

    //App编译环境 字典配置
    application = [
            compileSdkVersion: 30,
            buildToolsVersion: "30.0.2",
            minSdkVersion    : 16,
            targetSdkVersion : 30
    ]
    //各模块AppId 字典配置
    appId = [
            app : "com.ljb.myapp",
            user: "com.ljb.myapp.user"
    ]
   
   //各模块引入的第三方公共库 字典配置
    dependenciesImport = [
            kotlin_stdlib   : "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version",
            ktx             : "androidx.core:core-ktx:$ktx_version",
            appcompat       : "androidx.appcompat:appcompat:$appcompat_version",
            material        : "com.google.android.material:material:$material_version",
            constraintlayout: "androidx.constraintlayout:constraintlayout:$constraintlayout_version",
    ]

}
// 项目根目录build.gradle导入config.gradle:
apply from: "config.gradle"    

buildscript {

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

每个模块的build.gradle配置完后,大致如下(以app主模块为例)

//app主模块build.gradle中的配置
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

def appId = rootProject.ext.appId
def application = rootProject.ext.application
def dependenciesImport = rootProject.ext.dependenciesImport

def isRelease = rootProject.ext.isRelease

android {
    compileSdkVersion application.compileSdkVersion
    buildToolsVersion application.buildToolsVersion

    defaultConfig {
        applicationId appId.app
        minSdkVersion application.minSdkVersion
        targetSdkVersion application.targetSdkVersion
        versionCode 1
        versionName "1.0.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //将当前构建环境状态写入 BuildConfig 文件中
        buildConfigField("boolean", "isComponent", String.valueOf(isRelease))
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    dependenciesImport.each { k, v -> implementation(v) }

}

参考文献:# Android组件化架构 —— 基础(一) - 组件化与集成化