Android Gradle系列-入門篇

前言

這篇文章定義為入門篇辜纲,將結(jié)合自己剛開始學習Android時的疑惑與現(xiàn)在對Gradle的認識,進一步整理Gradle在Android中的整體結(jié)構(gòu)悄蕾。

思考

當我使用Android Studio時习绢,一直有幾個疑問圍繞著我:

  1. Android Studio是怎樣將Java與Kotlin代碼的編譯成APK文件?

  2. Gradle是怎樣將Java與Kotlin代碼編譯成APK文件拨脉?

后來知道Android Studio自身是不能夠編譯成APK的,它是集成了Gradle。通過研究Gradle逻翁,發(fā)現(xiàn)Gradle也只是一個構(gòu)建工具,真正編譯成APK的功能是由Android app plugins提供的捡鱼。Gradle只是自動化構(gòu)建工具八回,提供構(gòu)建時的各種生命周期,例如:building、testing缠诅、publishing等溶浴。所以Gradle不僅支持Android還支持C/C++、Scale等管引。

而這個plugin其實就是在project中的build.gradle中聲明的classpath

 1buildscript { 2    repositories { 3        // Gradle 4.1 and higher include support for Google's Maven repo using 4        // the google() method. And you need to include this repo to download 5        // Android Gradle plugin 3.0.0 or higher. 6        google() 7        ... 8    } 9    dependencies {10        classpath 'com.android.tools.build:gradle:3.4.0'11    }12}

所有每次對Android構(gòu)建進行了優(yōu)化士败,我們都要來更新這個版本。

Scripts

有了上面的基礎(chǔ)汉匙,當我們新建一個Android項目時拱烁,你將會看到如下與Gradle相關(guān)的文件:

你會看到文件名幾乎都有g(shù)radle字段,下面我會一一介紹它們的作用

Gradle Wrapper

首先是gradle-wrapper.properties文件噩翠,打開它你將會看到如下類似信息

1#Sat Jan 19 08:25:46 CST 20192distributionBase=GRADLE_USER_HOME3distributionPath=wrapper/dists4zipStoreBase=GRADLE_USER_HOME5zipStorePath=wrapper/dists6distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

這個是gradle版本的配置項戏自,申明你當前項目中使用的gradle版本。當我們構(gòu)建項目的時候伤锚,它會根據(jù)版本自動下載擅笔。并且保存到你的電腦本地中。如果你使用的是Mac屯援,你可以使用如下命令查看你的所有已經(jīng)下載的gradle版本猛们。

1ls ~/.gradle/wrapper/dists/

所以如果你不滿意當前版本,也可以通過查看version of Gradle(https://gradle.org/releases/)修改到相應的版本

settings.gradle

這個文件是項目與其子項目或者module間的配置狞洋。里面通過include函數(shù)來告訴該項目所包換的子項目或者依賴的module弯淘。例如剛新建項目時只有一個app子項目。

1include ':app'

所以settings.gradle是位于project的最外層吉懊,即與app同級庐橙。

build.gradle

現(xiàn)在我們已經(jīng)知道一個project可以包含一個或者多個sub-projects,而Android一般會將sub-projects當做module借嗽,所以你會在這看到兩個build.gradle态鳖。根據(jù)后面的hint提示,發(fā)現(xiàn)它們分別來自與project與module恶导。

首先我們來看project中的build.gradle浆竭,即位于根目錄下的文件

 1buildscript { //1 2 3    ext.objectboxVersion = '2.3.0' //4 4 5    repositories { //2 6        google() 7        jcenter() 8    } 9    dependencies { //310        classpath 'com.android.tools.build:gradle:3.3.2'11        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"        12    }1314}1516allprojects { //517    repositories {18        google()19        jcenter()20    }21}2223task clean(type: Delete) { //624    delete rootProject.buildDir25}
  1. buildscript閉包是申明編譯該項目所需的相關(guān)配置

  2. 告知gradle這些配置將從google()與jcenter()中獲取

  3. 申明相關(guān)的plugin,例如Android Plugin for Gradle惨寿。

  4. 在gradle中有一個extra property屬性邦泄,允許我們通過它來申明一些變量,例如plugin的版本號裂垦。有一個特性就是這些變量在gradle中都是全局的虎韵。所以對于多個module時,我們可以通過它來統(tǒng)一相關(guān)的版本號缸废。最后在3中通過${name}來引用

  5. 因為可能有多個sub-project,對于一些相同的配置,可以通過allprojects來進行統(tǒng)一管理企量。

  6. 申明一個task测萎,用來執(zhí)行相關(guān)任務,這里是clean操作届巩,目的是刪除build文件夾中的數(shù)據(jù)

下面是module中的build.gradle

 1apply plugin: 'com.android.application' 2apply plugin: 'io.objectbox' //1 3 4android { //2 5    compileSdkVersion 28 6    defaultConfig { 7        minSdkVersion 21 8        targetSdkVersion 27 9        versionCode 10000510        versionName "1.0.5"11        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"12    }13    buildTypes {14       release {15            minifyEnabled false16            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'17        }18    }19}2021dependencies { //322    implementation fileTree(include: ['*.jar'], dir: 'libs')23    implementation 'com.android.support:appcompat-v7:28.0.0'24    implementation 'com.android.support:support-v4:28.0.0'25}
  1. 通過調(diào)用apply函數(shù)硅瞧,引入我們需要依賴的plugin,這個就是我們在根build.gradle中申明的classpath

  2. android閉包是gradle最重要的配置申明恕汇,例如默認的配置信息defaultConfig腕唧,包含minSdkVersion最小支持的android版本,versionCode與versionName等瘾英。這些配置都與編譯息息相關(guān)枣接,最好你應該熟悉它們。你實在記不住的話缺谴,我這里也有秘籍但惶,AppExtension(https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.AppExtension.html)這里面包含所有的配置項與所代表的意義。

  3. 這里的dependencies用來申明項目所依賴的第三方庫湿蛔,而這些庫的獲取來源無需再次申明膀曾,因為我們已經(jīng)在之前的根目錄的build.gradle中的allprojects閉包中進行了申明。再者之前的ext全局變量也可以在這里使用阳啥。

gradle.properties

這個文件一般都是本地文件添谊,主要用來對gradle構(gòu)建的一些個人配置項。例如gradle運行是否并行察迟,gradle的jvmargs大小斩狱、是否開啟daemon等等。它會在gradle運行時注入到相應的build.gradle中卷拘。

local.properties

這個文件也是本地文件喊废,只不過它用來配置gradle之外的配置信息,例如ndk與sdk目錄栗弟,或者一些敏感的信息污筷,例如插件開發(fā)打包上傳到遠程倉庫這時可能需要賬號、密碼乍赫、api_key等瓣蛀,防止打包時暴露。

Gradle Tasks

gradle tasks是用來執(zhí)行特定的gradle任務的雷厂。我們可以直接點擊Android Studio右邊的Gradle按鈕惋增,你會發(fā)現(xiàn)在Tasks下會列出該項目的所用可執(zhí)行的gradle任務。

image

或者你也可以在命令行中執(zhí)行如下命令改鲫,查看app下的所有tasks

1./gradlew app:tasks

我們順便點擊一個诈皿,例如assembleDebug林束,我們將會在Run日志系統(tǒng)中看到如下執(zhí)行結(jié)果

根據(jù)輸出的日志,也標明它是執(zhí)行了task: assembleDebug

當然我們也可以在命令行執(zhí)行指定的task稽亏,例如要達到上面相同的效果壶冒,我們可以輸入如下命令

1./gradlew assembleDebug --console plain
  1. ./gradlew 代表的是使用Gradle Wrapper中的gradle,就是該項目本身的gradle版本截歉,避免直接使用gradle命令

  2. assembleDebug是task的名稱

  3. --console plain輸出完整的日志

既然說到這里胖腾,再說一個初級者容易做的無意義的操作。有時會碰到一些問題而去點擊Clean Project瘪松,再點擊Rebuild Project咸作。其實Clean Project是不必要的。我們可以直接先點擊Rebuild Project宵睦,查看日志

結(jié)果是它分別執(zhí)行了task: clean记罚,assembleDebug。所以Rebuild Project就已經(jīng)包含了Clean Project状飞,我們無需多此一舉執(zhí)行Clean Project毫胜。

最后

嗯,就這些诬辈。最后酵使,希望這篇文章,能夠讓大家對gradle在項目中的結(jié)構(gòu)與所處的地位有一個更清晰的理解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焙糟,一起剝皮案震驚了整個濱河市口渔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穿撮,老刑警劉巖缺脉,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悦穿,居然都是意外死亡攻礼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門栗柒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁扮,“玉大人,你說我怎么就攤上這事瞬沦√粒” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵逛钻,是天一觀的道長僚焦。 經(jīng)常有香客問我,道長曙痘,這世上最難降的妖魔是什么芳悲? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任立肘,我火速辦了婚禮,結(jié)果婚禮上芭概,老公的妹妹穿的比我還像新娘赛不。我一直安慰自己,他們只是感情好罢洲,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著文黎,像睡著了一般惹苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耸峭,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天桩蓉,我揣著相機與錄音,去河邊找鬼劳闹。 笑死院究,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的本涕。 我是一名探鬼主播业汰,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菩颖!你這毒婦竟也來了样漆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晦闰,失蹤者是張志新(化名)和其女友劉穎放祟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻右,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡跪妥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了声滥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眉撵。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖醒串,靈堂內(nèi)的尸體忽然破棺而出执桌,到底是詐尸還是另有隱情,我是刑警寧澤芜赌,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布仰挣,位于F島的核電站,受9級特大地震影響缠沈,放射性物質(zhì)發(fā)生泄漏膘壶。R本人自食惡果不足惜错蝴,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颓芭。 院中可真熱鬧顷锰,春花似錦、人聲如沸亡问。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州藕。三九已至束世,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間床玻,已是汗流浹背毁涉。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锈死,地道東北人贫堰。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像待牵,于是被迫代替她去往敵國和親其屏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容