文章目录

  • 一、顶层 Gradle 定义扩展变量
  • 二、获取顶层的 Gradle 对象
  • 三、Module 中使用 Gradle 变量
  • 四、Gradle 中打印变量值
  • 五、涉及到的 Gradle 构建脚本
  • 六、博客资源

一、顶层 Gradle 定义扩展变量


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

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

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" : "",]
}

在 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();
}

三、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"]

将 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

通过调用 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.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {applicationId appId["app"]minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}
}

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

四、Gradle 中打印变量值


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

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

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

五、涉及到的 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
}

引入的 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" : "",]
}

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.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {applicationId appId["app"]minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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'
}

六、博客资源


博客源码 :

  • GitHub : https://github.com/han1202012/Component
  • CSDN 下载 :

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

  1. 【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )

    文章目录 一.组件模式下为组件 Module 指定 Java 源码路径 二.主应用的角色 三.BuildConfig 中生成当前 组件 / 集成 模式字段 四.Library Module 中的代码示 ...

  2. 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )

    文章目录 一.模块化 与 组件化 模式控制 二.applicationId 设置 三.使用 sourceSets 配置组件模式下使用的清单文件 四.组件模式 与 集成模式 切换示例 五.完整的 Gra ...

  3. Android组件化实践2——经典组件化项目架构

    Android组件化实践2--经典组件化项目架构 京东的采用aab( Android App bundles)之后的架构图 安居客项目架构演化 参考:https://zhuanlan.zhihu.co ...

  4. com 组件调用不起来_AwesomeGithub组件化探索之旅

    阅读前请点击右上角"关注",每天免费获取Android知识解析及面试解答.Android架构解析,只做职场干货,完全免费分享! 之前一直听说过组件化开发,而且面试也有这方面的提问, ...

  5. login组件的两种用法_Android-模块化、组件化、插件化、热修复-组件化-组件间的通信(本地,下沉,bus,路由)...

    延续上一篇 MonkeyLei:Android-模块化.组件化.插件化.热修复-组件化工程构建+页面路由多种方式实践 ,我们进行搞下组件之间的通信.比如登录成功后怎么通知其他页面刷新: 方式可能有很多 ...

  6. 单文件组件的组件传值_移动端组件化架构(下)

    我的组件化方案 对于项目架构来说,一定要建立于业务之上来设计架构.不同的项目业务不同,组件化方案的设计也会不同,应该设计最适合公司业务的架构. 架构设计 以我之前公司项目为例,项目是一个地图导航应用, ...

  7. Vue3(撩课学院)笔记02-创建组件,全局组件,局部组件,父子组件,组件标签化,组件的data数据共享,组件间通讯,props,父传子$ref,子传父$parent

    1.创建一个组件 首先要创建一个根组件进行挂载 再创建一个子组件,完成子组件的逻辑 子组件主要使用template模板来完成布局和逻辑 把子组件通过根组件.component的方法挂载到根组件上 &l ...

  8. java组件化的优势_组件化编程开发如何判断组件的优劣性

    随着互联网的不断发展,越来越多的程序员都在学习不同的编程开发方式,而组件化编程开发就是其中的一个常用开发方法.今天我们就一起来了解一下,组件化开发中关于组件的优劣性应该如何判断. 认识组件 随着近些年 ...

  9. Vue.js-Day02-PM【组件化开发(全局注册组件、局部注册组件、案例)、组件的配置选项、轮播图实例(左右切换按钮、底部导航栏、定时器、鼠标移入-图片静止)】

    Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 目   录 4.组件化开发 4.1.组件的注册 全局注册 局部注册(只能在当前整个Vue实例的范围内才可以使用) 使用组件 ...

最新文章

  1. 软件测试人员需要掌握的linux命令(一)
  2. cs224n第二讲词向量表示:word2vec
  3. yum安装Mariadb,二进制安装Mariadb
  4. Django模型层--多表操作
  5. iosid不足以修改问题_寻找合作伙伴的技巧足以与您合作
  6. 浅谈格斗游戏的精髓——方块的战争
  7. 聊聊技术人的中年危机
  8. 如何写工作说明书(sow)
  9. excel多个窗口独立显示_excel效率神器监视窗口
  10. html怎么把图片左移_css如何向左移动图片
  11. Ubuntu 16.04 解决WPS for Linux提示“系统缺失字体symbol、wingdings、wingdings 2、wingdings 3、webding”的问题
  12. Excel如何统计指定背景颜色数据个数
  13. 计算机数值中的乘法除法原理
  14. 软件工程导论复试——一、软件工程学概述
  15. Javascript变量名混淆细节
  16. 一米OA任意文件读取漏洞
  17. executeQuery、executeUpdate和execute
  18. 最短路小结(三种算法+各种常见变种)
  19. java 的简单代码_绝对最简单(Java代码)
  20. 深入浅出WPF——什么是XAML

热门文章

  1. windwos -- bat脚本
  2. 打开excel发送错误报告
  3. Ajax+Node.js前后端交互最佳入门实践(05)
  4. 【学习记录】无法找到“Procedural Foliage Spawner”
  5. 20170803 - 今日技能封装 - Q
  6. FlatBuffers初探
  7. 视频与图像RGB/YUV格式详解
  8. query如何全选或不全选时,不操作已经禁用的checkbox
  9. numpy的array合并-【老鱼学numpy】
  10. JavaScript label语句