用了這么久 AS炮障,要是還是不明白 Gradle目派,真的說(shuō)不過(guò)去。從網(wǎng)上下載一個(gè)項(xiàng)目跑不起來(lái)胁赢,Gradle 各種報(bào)錯(cuò)束手無(wú)措企蹭,這就很尷尬了。現(xiàn)在我們就來(lái)看看這個(gè) Gradle 到底是什么智末,這里不會(huì)詳細(xì)介紹 Gradle谅摄,只是一個(gè)入門(mén)介紹,不至于一臉懵逼吹害。
一螟凭、Project 中的 Gradle
先來(lái)看下根目錄與 Gradle 相關(guān)的文件。
-
.gradle
該文件夾是編譯后生成的文件它呀,不需要關(guān)注螺男。
-
gradle
這個(gè)文件夾是 Gradle Wrapper 的版本配置,實(shí)現(xiàn)了無(wú)需手動(dòng)下載 Gradle纵穿,通過(guò)配置即可自動(dòng)下載下隧,需要與 gradlew 配合使用。
- gradle-wrapper.jar:包含 Gradle 運(yùn)行時(shí)的邏輯代碼谓媒。
- gradle-wrapper.properties:負(fù)責(zé)配置包裝器運(yùn)行時(shí)行為的屬性文件淆院,用來(lái)配置使用哪個(gè)版本的 Gradle 等屬性。
#Sun Jun 28 14:04:41 CST 2020 # Gradle 解壓后存儲(chǔ)的根目錄句惯,類似于 JAVA_HOME distributionBase=GRADLE_USER_HOME # distributionBase + distributionPath 就是 Gradle 解壓后的存放位置 distributionPath=wrapper/dists # Gradle壓縮包存儲(chǔ)根目錄土辩,類似于 JAVA_HOME zipStoreBase=GRADLE_USER_HOME # zipStoreBase + zipStorePath 就是 Gradle 壓縮包的存放位置 zipStorePath=wrapper/dists # Gradle 壓縮包的下載地址支救,可以在這里配置需要使用的 Gradle 版本 distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
另外,distributionUrl 不僅可以設(shè)置網(wǎng)絡(luò)地址拷淘,還可以設(shè)置為本地路徑各墨。
-
build.gradle
Gradle 根工程配置文件,這是 Project 下的 build.gradle启涯,后面還會(huì)說(shuō)到 Module 下的 build.gradle贬堵。// Top-level build file where you can add configuration options common to all sub-projects/modules. // 頂級(jí)構(gòu)建文件,您可以在其中添加對(duì)所有子項(xiàng)目/模塊通用的配置選項(xiàng)结洼。 buildscript {// 所有的子模塊都會(huì)讀取到這個(gè)配置里面的內(nèi)容黎做,在這里定義 Gradle 插件所在的倉(cāng)庫(kù)和依賴 ext.kotlin_version = "1.3.72"http:// 創(chuàng)建一個(gè)變量,用于控制 kotlin 版本號(hào) repositories {// 構(gòu)建插件倉(cāng)庫(kù) google()// 使用 google 倉(cāng)庫(kù)松忍,https://dl.google.com/dl/android/maven2/ jcenter()// 使用 jcenter 倉(cāng)庫(kù)蒸殿,https://jcenter.bintray.com/ } dependencies {// 構(gòu)建插件依賴配置 // 引入 Android 的 Gradle 插件 classpath 'com.android.tools.build:gradle:4.0.1' // 引入 Kotlin 的 Gradle 插件 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 // 注意:不要將應(yīng)用程序依賴項(xiàng)放在這里;它們屬于單個(gè)模塊的build.gradle文件 } } allprojects {// 全部項(xiàng)目的配置挽铁,給 Module repositories {// 工程依賴倉(cāng)庫(kù) google()// 使用 google 倉(cāng)庫(kù)伟桅,https://dl.google.com/dl/android/maven2/ jcenter()// 使用 jcenter 倉(cāng)庫(kù),https://jcenter.bintray.com/ } } task clean(type: Delete) {// 創(chuàng)建一個(gè)名為 clean 的任務(wù) delete rootProject.buildDir// 刪除全部子項(xiàng)目的 build 文件夾 }
-
gradle.properties
Gradle 屬性配置文件叽掘,值會(huì)添加到 project 當(dāng)中楣铁。# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx2048m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app"s APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official
上面看到的鍵值,是新建項(xiàng)目時(shí)自動(dòng)生成的更扁,當(dāng)然還可以添加新的鍵值盖腕,然后在 gradle 文件中取到。
例如浓镜,在上面文件的最后溃列,添加一個(gè):
kotlin_version=1.3.72
這樣就可以移除 build.gradle 中定義的
ext.kotlin_version = "1.3.72"
,依然可以編譯通過(guò)膛薛,不過(guò)此時(shí)的kotlin_version
听隐,使用是該 gradle.properties 文件中的值了。 -
gradlew 和 gradlew.bat
Gradle Wrapper 啟動(dòng)腳本哄啄,根據(jù)上面 gradle 文件夾中配置的版本雅任,執(zhí)行對(duì)應(yīng)的腳本。- gradlew:Linux咨跌、Mac 平臺(tái)下沪么,用于執(zhí)行 Gralde 命令的包裝器腳本。
- gradlew.bat:Windows 平臺(tái)下锌半,用于執(zhí)行 Gralde 命令的包裝器腳本禽车。
Gradle Wrapper 的作用是簡(jiǎn)化 Gradle 本身的安裝、部署。不同版本的項(xiàng)目可能需要不同版本的 Gradle殉摔,手工部署的話比較麻煩州胳,而且可能產(chǎn)生沖突,所以需要 Gradle Wrapper 幫你搞定這些事情钦勘。Gradle Wrapper 是 Gradle項(xiàng)目的一部分陋葡。
當(dāng)從版本庫(kù)下載代碼之后亚亲,如果你本機(jī)安裝過(guò) Gradle彻采,當(dāng)然直接直接編譯運(yùn)行既可。
但是對(duì)沒(méi)有安裝 Gradle 的用戶捌归,可以執(zhí)行項(xiàng)目根目錄下的 gradlew 腳本 肛响,將會(huì)在 gradle-wrapper.properties 中的 ~/.gradle/wrapper/dists 目錄中首次下載并安裝 Gradle 并編譯代碼。
-
settings.gradle
Gradle 工程初始化配置文件惜索,它的作用就是用于多項(xiàng)目構(gòu)建特笋。include ':app' rootProject.name = "Kotlin"
如果有多個(gè) Module,就會(huì)有多個(gè)
include
巾兆,大致就是下面的樣子:include ':app' include ':library' rootProject.name = "Kotlin"
二猎物、Module 中的 Gradle
再來(lái)看下 app 目錄下 Gradle 相關(guān)的文件,只有一個(gè) build.gradle角塑。
這個(gè)就是 Module 下的 build.gradle蔫磨,內(nèi)容不同于 Project 下的 build.gradle。
apply plugin: 'com.android.application'// 表示是一個(gè) android 的應(yīng)用
// apply plugin: 'com.android.library'// 表示是一個(gè) android library圃伶,與上面只能二選一
apply plugin: 'kotlin-android'// 使用 kotlin 插件堤如,如果使用 kotlin 必寫(xiě)
apply plugin: 'kotlin-android-extensions'// 使用 kotlin 擴(kuò)展插件,不是必寫(xiě)
android {// 由于使用了 apply plugin: 'com.android.application' 所以可以用
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.ff.kotlin"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
// 單元測(cè)試
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {// 指定生成安裝文件的配置窒朋,常有兩個(gè)子包:release搀罢,debug
release {
minifyEnabled false// 是否對(duì)代碼進(jìn)行混淆,true表示混淆
// proguard-android-optimize.txt默認(rèn)的混淆文件(SDK目錄/tools/proguard/)
// proguard-rules.pro自行添加混淆規(guī)則文件(相應(yīng)module的目錄下)
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {// 工程依賴配置
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
-
apply plugin
表示的是應(yīng)用插件侥猩。- 使用 android 插件:
能使用上面插件的原因是榔至,在根目錄的 build.gradle 中配置了 Android 插件依賴。apply plugin: 'com.android.application' // apply plugin: 'com.android.library'
classpath 'com.android.tools.build:gradle:4.0.1'
- 使用 kotlin 插件:
能使用上面插件的原因是欺劳,在根目錄的 build.gradle 中配置了 Kotlin 插件依賴唧取。apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- 使用 android 插件:
-
dependencies
表示依賴配置,這里指的是工程依賴杰标;在根目錄的 build.gradle 文件中兵怯,buildscript
里面定義的dependencies
指的是插件依賴,不是同一個(gè)概念腔剂。 - 這里沒(méi)有定義
repositories
媒区,是因?yàn)樵诟夸浀?build.gradle 文件中,已經(jīng)定義了全部項(xiàng)目的工程依賴倉(cāng)庫(kù),不需要每個(gè) Module 再重復(fù)定義袜漩。allprojects { repositories { google() jcenter() } }