【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )

举报
韩曙亮 发表于 2022/01/11 00:12:44 2022/01/11
【摘要】 文章目录 一、顶层 Gradle 定义扩展变量二、获取顶层的 Gradle 对象三、Module 中使用 Gradle 变量四、Gradle 中打印变量值五、涉及到的 Gradle 构建脚本六、博...





一、顶层 Gradle 定义扩展变量



在 Project 层级的 build.gradle 中 , 使用 apply from: “component.gradle , 引入 component.gradle 配置 ;

// 将 component.gradle 配置文件中的内容导入到该位置
// 相当于引入头文件
apply from: "component.gradle"

  
 
  • 1
  • 2
  • 3

apply from 相当于引入头文件 , 将 component.gradle 配置文件中的所有内容 , 原封不动的拷贝到该语句所在位置 ;


component.gradle 是开发者自定义的一个配置文件 , 是使用 Groovy 语言编写的 ;

ext 是 extension 扩展 , 通过 ext 可以定义扩展的变量 ;

component.gradle 文件内容如下 : 全局使用的变量定义在这里 ;

// ext 是 extension 扩展的含义
// ext 后的 {} 花括号 , 是闭包 ,
ext{
    // 定义 android 变量 , 类型是字典 Map 集合
    // 其中定义了若干键值对集合
    androidConfig = [
            compileSdkVersion : 30,
            minSdkVersion : 18,
            targetSdkVersion : 30,
            versionCode : 1,
            versionName : "1.0"
    ]

    applicationId = [
            "app" : "kim.hsl.component",
            "mylibrary" : "",
            "mylibrary2" : "",
    ]
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在 Project 层级的 build.gradle 中定义的变量 , 可以在 Module 级的 build.gradle 中使用 ;

如 : 在上述 Project 层级的 build.gradle 中引入了 component.gradle 配置 , 那么在 Module 级别的 build.gradle 中可以通过 rootProject.ext.android 的方式调用在 component.gradle 定义的 android 变量 ;


在顶层构建脚本中定义的变量 , 在任何 Module 中的构建脚本都都可以获取该变量 ;





二、获取顶层的 Gradle 对象



在 build.gradle 中调用 rootProject , 相当于调用 Project 对象的 getRootProject() 方法 , 这是 Groovy 提供的语法糖 , 类似于 Kotlin 用法 ; 该方法返回一个 Project 对象 , 该对象代表根目录下的 Project 层级的 build.gradle 构建脚本对应的 Project 对象 ;

rootProject 相当于顶层的 Project 级别的 build.gradle ;


Project 对应 getRootProject 方法源码 :

public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
    String DEFAULT_BUILD_FILE = "build.gradle";
    String PATH_SEPARATOR = ":";
    String DEFAULT_BUILD_DIR_NAME = "build";
    String GRADLE_PROPERTIES = "gradle.properties";
    
    Project getRootProject();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8




三、Module 中使用 Gradle 变量



上面在顶层的 build.gradle 中定义了扩展变量 , 可以在 Module 下的 build.gradle 中获取 ;

使用 rootProject.ext.androidConfig 代码 , 可以获取在顶层 component.gradle 中定义的 androidConfig 变量 ;

    // 定义 android 变量 , 类型是字典 Map 集合
    // 其中定义了若干键值对集合
    androidConfig = [
            compileSdkVersion : 30,
            minSdkVersion : 18,
            targetSdkVersion : 30,
            versionCode : 1,
            versionName : "1.0"
    ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

将 rootProject.ext.androidConfig 变量赋值给本地的 def androidConfig 变量 , def 相当于 Java 中的 Object , def androidConfig 是声明了一个新变量 , 名称是 androidConfig ;

// def 相当于 Java 中的 Object
// 声明 config 和 appId 变量 , 并为其赋值
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId

  
 
  • 1
  • 2
  • 3
  • 4

通过调用 androidConfig.compileSdkVersion , 可以获取 component.gradle 中定义的 androidConfig 变量中对应的 compileSdkVersion 键对应的值 30 ;

通过调用 androidConfig.minSdkVersion , 可以获取 component.gradle 中定义的 androidConfig 变量对应的 minSdkVersion 键对应的值 18 ;


部分代码示例 :

// def 相当于 Java 中的 Object
// 声明 config 和 appId 变量 , 并为其赋值
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId

android {
    compileSdkVersion androidConfig.compileSdkVersion
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId appId["app"]
        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这样做的好处是 , 可以统一管理 Android 应用的配置版本 , 不用每个 Module 都进行独立修改 ;





四、Gradle 中打印变量值



在 build.gradle 中打印输出变量值 , 在 Module 下的 build.gradle 中使用 println 函数 打印变量 , 变量放在 “${}” 中 , 打印结果在 编译时输出到 Build 面板中 ;

println("Print Variable : rootProject.ext.android : ${rootProject.ext.android}")

  
 
  • 1

在这里插入图片描述

注意 : 不要打印中文 , 会出现乱码 ;





五、涉及到的 Gradle 构建脚本



顶层 Gradle 代码示例 :

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// 将 component.gradle 配置文件中的内容导入到该位置
// 相当于引入头文件
apply from: "component.gradle"

buildscript {
    ext.kotlin_version = "1.4.10"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.0"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

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

allprojects {
    repositories {
        google()
        jcenter()
    }
}

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

引入的 Gradle 代码 :

// ext 是 extension 扩展的含义
// ext 后的 {} 花括号 , 是闭包 ,
ext{
    // 定义 android 变量 , 类型是字典 Map 集合
    // 其中定义了若干键值对集合
    androidConfig = [
            compileSdkVersion : 30,
            minSdkVersion : 18,
            targetSdkVersion : 30,
            versionCode : 1,
            versionName : "1.0"
    ]

    applicationId = [
            "app" : "kim.hsl.component",
            "mylibrary" : "",
            "mylibrary2" : "",
    ]
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Module 层级的 Gradle 代码示例 : Component\app\build.gradle 构建脚本 ;

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

println("Print Variable : rootProject.ext.androidConfig : ${rootProject.ext.androidConfig}")

// def 相当于 Java 中的 Object
// 声明 config 和 appId 变量 , 并为其赋值
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId

android {
    compileSdkVersion androidConfig.compileSdkVersion
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId appId["app"]
        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    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 "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52




六、博客资源



博客源码 :

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/116803258

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。