【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
文章目錄
- 一、頂層 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 变量定义与使用 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安装包优化】资源混淆
- 下一篇: 【Android 组件化】使用 Grad