Gradle for Android 系列:初識 Gradle 檔案

張拭心發表於2017-01-04

讀完本文你將瞭解到:

settinggradle

主目錄下的 buildgradle

模組下的 buildgradle

備註

注意 applicationId 和 package name 其實不是一個東西

總結

2046765-d0d33451ce623260

我們用 Android Studio 新建立一個專案時,會自動生成 3 個 Gradle 檔案:

2046765-68ee12c88a01d56e

接下來介紹這三個檔案的作用。

1. setting.gradle

上篇文章:為什麼 Gradle 這麼火 中介紹了,

一個 Gradle 構建通常包括三個階段:初始化,配置,和執行。

setting.gradle 檔案在 初始化過程中被執行,構建器通過 setting.gradle 檔案中的內容瞭解哪些模組將被 build,下面的內容表明當前專案中除了 app 模組還有另外一個叫做 “shixinlibrary” 的依賴模組:

include ‘:app’, ‘:shixinlibrary’

注意:單模組專案不一定需要有 setting 檔案,但一旦有多個模組,必須要有 setting 檔案,同時也要寫明所有要構建的模組,否則 gradle 不會 build 不包括的模組。

2.主目錄下的 build.gradle

看 gradle 檔案中的註釋:

Top-level build file where you can configuration options common to all sub-projects/modules.

主目錄下的 build.gradle 檔案是最頂層的構建檔案,這裡配置所有模組通用的配置資訊。

預設的頂層 build.gradle 檔案中包括兩個程式碼塊 (buildscript 和 allprojects):

2046765-2d29b71e034710f2

buildscript 

從名字就可以看出來,buildscript 是所有專案的構建指令碼配置,主要包括依賴的倉庫和依賴的 gradle 版本。

上圖中 repositories 程式碼塊將 jcenter 配置為一個倉庫,JCenter 是一個很有名的 Maven 倉庫。確定了依賴的倉庫後,我們就可以在 dependencies 程式碼塊中新增依賴的、在 jcenter 倉庫中的包了。

dependencies 程式碼塊用於配置構建過程中的依賴包,注意,這裡是用於構建過程,因此你不能講你的應用模組中需要依賴的庫新增到這裡。

預設情況下唯一被用於構建過程中的依賴包是 Gradle for Android 的外掛。我們還可以新增一些其他用於構建的外掛,比如 retrolambda, apt, freeline 等等。

allprojects 

allprojects 程式碼塊用來宣告將被用於所有模組的屬性,注意是所有模組。常見的就是配置倉庫地址(jcenter, 自定義 maven 倉庫等),你還可以在 allprojects 中建立 tasks,這些 tasks 最終會運用到所有模組中,

官方建議儘量少新增用於所有模組的屬性,因為這意味著強耦合,一旦沒有構建主專案,你的子模組很有可能因為缺少所有模組的屬性導致構建失敗。

3.模組下的 build.gradle

模組下的 build.gradle 檔案只應用於當前模組,你可以覆蓋主目錄下的 build.gradle 的內容。

以我的練習專案為例介紹: 

2046765-bfadf795c346b616

上圖中主要分三個模組:apply plugin , android, dependencies。

apply plugin 

apply plugin 宣告瞭接下來要用到哪些外掛的內容,上圖表明使用了 androd 外掛,這裡之所以能用 android 外掛,是因為主目錄中宣告瞭 Gradle for Android 的依賴,這裡才能使用。

因此當我們需要使用其他外掛,比如 retrolambda 時,首先需要在主目錄 build.gradle 檔案中新增依賴,然後在模組 build.gradle 中宣告使用 retrolambda 外掛。

備註:預設的 android 外掛是由 Google 官方維護的,為我們提供了構建、測試、打包 Android 應用的能力。除此之外我們還可以自定義外掛。在逐漸加深對 Gradle 的瞭解後,我們將嘗試自己寫個 Gradle 外掛。

android 

在宣告瞭 android 外掛後,我們就可以使用 android 外掛提供的內容進行構建配置。

android 構建配置中必須要有的是兩個版本:

compileSdkVersion : 編譯應用的 Android API 版本

buildToolsVersion : 構建工具版本 

構建工具包括 aapt, zipalign, renderscript 等

用於在打包時生成各種中間產物,可以從 SDK Manager 中下載構建工具

defaultConfig 程式碼塊用於配置應用的預設屬性,可以覆蓋 AndroidManifest.xml 中的屬性,比如:

applicationId : 覆蓋了 AndroidManifest 中的 package name

minSdkVersion : 覆蓋了 AndroidManifest 中的屬性,配置執行應用的最小 API

targetSdkVersion : 一樣,用於通知系統當前應用已經被這個版本測試過,和之前的 compileSdkVersion 沒有關係

versionCode : 一樣,應用的版本號

versionName : 版本名稱

defaultConfig 還可以新增簽名,佔位符等等,這裡只列這些。

buildTypes 用來定義如何構建和打包不同型別的應用,常見的就是測試和生產。具體內容後序介紹。

android 中還可以配置其他資訊,比如 簽名、渠道等,你可以在 Project Structure 皮膚中直觀的檢視,新增,也可以使用程式碼新增,這些內容我們後續詳細介紹: 

2046765-4a7bf3b632df7393

dependencies 

上圖中可以看到 依賴配置 在 android 程式碼塊的外邊,事實上依賴配置是 Gradle 配置的基礎功能,也就是說除了 Android,其他型別的專案(比如 JavaEE )也可以這麼用。

我們可以在依賴配置中,新增要使用的庫,當然也可以新增本地的 jar 包。具體依賴配置內容我們後續深入介紹。

備註

注意: applicationId 和 package name 其實不是一個東西。

在使用 Gradle 構建以前,package name 其實有兩個作用:

在 R 檔案中用作報名

應用的唯一標示

我們知道,一個安卓手機上相同包名的 app 只能有一個。但是當我們想要同時安裝一個應用的不同的版本,比如一種測試一種生產,這時,就需要修改 package name 了,但是資原始碼和 R 檔案要求使用的包名不能改變,否則你的所有原始檔都會隨著構建版本而改變。怎麼辦呢?

Gradle 出現後,Android 工具團隊解耦了 package name 的兩種不同用法,提出了 applicationId 的概念:

定義在 Manifest 檔案中的 package,繼續用於原始碼和 R 檔案的標示

而 applicationId 則用作裝置和 Google Play 的唯一標識

也就是說 applicationId 覆蓋了 package name 的一部分職責。

總結

這篇文章概覽了一個 Android 專案中的 Gradle 檔案作用及內容,引申出許多細節,比如 自定義構建、依賴管理、多種型別構建的配置等等。接下來我們將深入學習這些內容。

相關閱讀:

Gradle for Android 系列:為什麼 Gradle 這麼火

相關文章