讀懂Android項(xiàng)目中的Gradle

用了這么久 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)的文件。

Project
  1. .gradle
    該文件夾是編譯后生成的文件它呀,不需要關(guān)注螺男。

    .gradle

  2. gradle
    這個(gè)文件夾是 Gradle Wrapper 的版本配置,實(shí)現(xiàn)了無(wú)需手動(dòng)下載 Gradle纵穿,通過(guò)配置即可自動(dòng)下載下隧,需要與 gradlew 配合使用。

    gradle

    • 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è)置為本地路徑各墨。

  3. 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 文件夾
    }
    
  4. 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 文件中的值了。

  5. 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 并編譯代碼。

  6. 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角塑。

Module

這個(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'
}
  1. apply plugin表示的是應(yīng)用插件侥猩。
    • 使用 android 插件:
      apply plugin: 'com.android.application'
      // apply plugin: 'com.android.library'
      
      能使用上面插件的原因是榔至,在根目錄的 build.gradle 中配置了 Android 插件依賴。
      classpath 'com.android.tools.build:gradle:4.0.1'
      
    • 使用 kotlin 插件:
      apply plugin: 'kotlin-android'
      apply plugin: 'kotlin-android-extensions'
      
      能使用上面插件的原因是欺劳,在根目錄的 build.gradle 中配置了 Kotlin 插件依賴唧取。
      classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
      
  2. dependencies表示依賴配置,這里指的是工程依賴杰标;在根目錄的 build.gradle 文件中兵怯,buildscript 里面定義的 dependencies 指的是插件依賴,不是同一個(gè)概念腔剂。
  3. 這里沒(méi)有定義 repositories媒区,是因?yàn)樵诟夸浀?build.gradle 文件中,已經(jīng)定義了全部項(xiàng)目的工程依賴倉(cāng)庫(kù),不需要每個(gè) Module 再重復(fù)定義袜漩。
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绪爸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宙攻,更是在濱河造成了極大的恐慌奠货,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座掘,死亡現(xiàn)場(chǎng)離奇詭異递惋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)溢陪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)萍虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人形真,你說(shuō)我怎么就攤上這事杉编。” “怎么了咆霜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵邓馒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蛾坯,道長(zhǎng)光酣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任偿衰,我火速辦了婚禮挂疆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘下翎。我一直安慰自己缤言,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布视事。 她就那樣靜靜地躺著胆萧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俐东。 梳的紋絲不亂的頭發(fā)上跌穗,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音虏辫,去河邊找鬼蚌吸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砌庄,可吹牛的內(nèi)容都是我干的羹唠。 我是一名探鬼主播奕枢,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佩微!你這毒婦竟也來(lái)了缝彬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哺眯,失蹤者是張志新(化名)和其女友劉穎谷浅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奶卓,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡一疯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寝杖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违施。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑟幕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情留潦,我是刑警寧澤只盹,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站兔院,受9級(jí)特大地震影響殖卑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坊萝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一孵稽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十偶,春花似錦菩鲜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狮崩,卻和暖如春蛛勉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睦柴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工诽凌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坦敌。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓侣诵,卻偏偏與公主長(zhǎng)得像招刹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窝趣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353