Gradle - 组件化之 build优化

1 组件分层:
一般划分3-4层:
1 app(壳 入口)
2 业务组件层 :application/library
3 功能组件层 :application/library
4 基础组件层 :      library

业务组件层与功能组件层区别:业务层只能用在该项目内,而功能组件层是独立的功能模块可以运用于其他项目,比如推流模块,播放模块等。

2 以文件夹的形式去管理module,方便查找代码。

2 进行每层核心模块/组件的开发

封装基础配置类commmon.gradle
每个module依赖:
apply from: "${rootProject.rootDir}/common.gradle" // 这是一种脚本插件写法
最基本的写法:
commmon.gradle内部:
添加扩展字段
project.ext{
        isModuleDebug =false  //模块是否单独运行调式
}
然后每个模块内部添加判断isModuleDebug 

然后Manifest文件配置,同样需要两份一个适用于module,一个使用于application.

soureceSets 指定 Manifest路径

根据判断添加依赖

以上写法缺点:每个组件内部的build.gradle 需要进行大量的配置与判断,还有很多版本配置,所以组件一多很麻烦。

3 配置优化

1 版本配置统一配置

project.ext {}内部定义闭包

注意:使用闭包如果能指明作用域,避免引用错误。
common.gradle 中判断当前工程的调式状态。

2 工程状态配置

不同状态开始进行application,library配置。当工程名是app或者idModuleDebug为true时为app执行流程。  

application执行以下

library执行以下

3 添加依赖的配置(使用闭包)

这里使用到了delegate,指定了delegate为dependencies,即后续Implementation引的是dependencies内部方法。

4 设置android{}配置applicationId 避免applicationId一致冲突


commmon.gradle 文件完整配置源码。
project.ext {

    // 模块是否单独运行调试
    isModuleDebug = false

    minSdkVersion = 28
    targetSdkVersion = 30
    versionCode = 1
    versionName = "1.0"
    compileSdkVersion = 30
    applicationId = "com.dongnaoedu.gradledemo06"

    libs = [
            "appcompat"       : "androidx.appcompat:appcompat:1.2.0",
            "k-stdlib"        : "org.jetbrains.kotlin:kotlin-stdlib:1.5.10",
            "ktx"             : "androidx.core:core-ktx:1.3.1",
            "material"        : "com.google.android.material:material:1.2.1",
            "constraintlayout": "androidx.constraintlayout:constraintlayout:2.0.1",
            "arouter"         : "com.alibaba:arouter-api:1.5.1"
    ]

    apts = [
            "ARouterCompiler": "com.alibaba:arouter-compiler:1.5.1",
    ]

    // 专门用来设置application module的
    setAppDefaultConfig = {
        project ->
            project.apply plugin: "com.android.application"
            project.apply plugin: "kotlin-android"
            setAndroidConfig project.android
            setDependencies project.dependencies
    }

    setAndroidConfig = {
        android ->
            android.compileSdkVersion project.compileSdkVersion

            android.defaultConfig {
                minSdkVersion project.minSdkVersion
                targetSdkVersion project.targetSdkVersion
                versionCode project.versionCode
                versionName project.versionName

                if (project.name == 'app') {
                    applicationId project.applicationId
                } else if (project.isModuleDebug) {
                    applicationId project.applicationId
                    applicationIdSuffix = project.name
                }

                testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

                javaCompileOptions {
                    annotationProcessorOptions {
                        // 路由每个模块的名称
                        arguments += [AROUTER_MODULE_NAME: project.name]
                    }
                }
            }

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

            android.sourceSets {
                main {
                    if (project.name != 'app') {
                        if (project.isModuleDebug) {
                            manifest.srcFile "src/debug/AndroidManifest.xml"
                        } else {
                            manifest.srcFile "src/main/AndroidManifest.xml"
                        }
                    }
                }
            }
    }

    // 专门为library情况下进行配置
    setLibDefalutConfig = {
        project.apply plugin: "com.android.library"
        project.apply plugin: "kotlin-android"
        setAndroidConfig project.android
        setDependencies project.dependencies
    }

    setDependencies = {
        dependencies ->
            delegate = dependencies
            project.libs.each {
                k, v -> implementation v
            }
            project.apts.each {
                k, v -> annotationProcessor v
            }
            testImplementation 'junit:junit:4.+'
            androidTestImplementation 'androidx.test.ext:junit:1.1.2'
            androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

            if (project.name == 'app' && !project.isModuleDebug) {
                implementation project(':buissiness:login')
                implementation project(':buissiness:main')
            }
    }

}

if (project.name == 'app' || isModuleDebug) {
    // 除了app以外,还有组件调试的情况,就直接调用setAppDefaultConfig
    project.setAppDefaultConfig project
} else {
    project.setLibDefalutConfig project
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值