Android模块化点滴-Gradle配置| 8月更文挑战

681 阅读2分钟

Gadle配置

统一依赖管理

创建配置文件config.gradle文件,记录需要统计管理的信息。里面包括了各个依赖库的版本、各个模块的id、正式环境和测试环境的地址信息等等。

ext {

    // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式
    // false: 组件化模式(子模块可以独立运行),true :集成化模式(打包整个项目apk,子模块不可独立运行)
    isRelease = false

    // 建立Map存储,对象名、key可以自定义
    androidId = [
            compileSdkVersion: 30,
            minSdkVersion    : 21,
            targetSdkVersion : 30,
            versionCode      : 1,
            versionName      : "1.0"
    ]

    appId = ["app" : "com.loveqrc.moduledemo",
             "user": "com.loveqrc.moduledemo.user",
    ]

    url = [
            "debug"  : "https://1.2.3.4/debug",
            "release": "https://5.6.7.8/release"
    ]

    supportLibrary = "28.0.0"
    dependencies = [
            // ${supportLibrary}表示引用一个变量
//            "recyclerview": "com.android.support:recyclerview-v7:${supportLibrary}",
            "constraintlayout": "androidx.constraintlayout:constraintlayout:2.0.4",
            "corekotlin": "androidx.core:core-ktx:1.3.2",
            "appcompat" : "androidx.appcompat:appcompat:1.2.0",
            "material"   : "com.google.android.material:material:1.3.0",
    ]
}

配置完成后,在项目的根build.gradle中进行引入

// 非常重要,根目录的build.gradle头部加入自定义gradle,相当于layout布局中include
apply from: "config.gradle"
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.0"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

引入成功后,就可以在各个模块中使用了,也可以动态改变isRelease值来切换项目是组件化还是集成化。

组件化与集成化切换

在模块中build.gradle配置是否是发布版本,进行组件化与集成化切换。

if (isRelease) { // 如果是发布版本时,各个模块都不能独立运行
     apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'

配置defaultConfig

compileSdk rootAndroidId.compileSdk

defaultConfig {
    if (!isRelease) { // 如果是集成化模式,不能有applicationId
        applicationId appId.user // 组件化模式能独立运行才能有applicationId
    }
    minSdk rootAndroidId.minSdk
    targetSdk rootAndroidId.targetSdk
    versionCode rootAndroidId.versionCode
    versionName rootAndroidId.versionName

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    consumerProguardFiles "consumer-rules.pro"
}

资源路径配置

当项目是组件化时,每个模块可以单独启动,那么每个模块都需要启动页面,当项目时集成化时,不能有启动页面,这就需要分开配置组件化时和集成化的AndroidManifest.xml

// 配置资源路径,方便测试环境,打包不集成到正式环境
sourceSets {
    main {
        if (!isRelease) {
            // 如果是组件化模式,需要单独运行时
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            // 集成化模式,整个项目打包apk
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java {
                // release 时 debug 目录下文件不需要合并到主工程
                exclude '**/debug/**'
            }
        }
    }
}

配置成功后,就可以在main文件夹下创建组件化时的AndroidManifest.xml了。

依赖配置

def support = rootProject.ext.dependencies
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 循环引入第三方库
    support.each { k, v -> implementation v }
}