Gradle for Android 系列: Gradle 文件你真的了解嗎?
讀完本文你將了解到:
我們用 Android Studio 新創建一個項目時,會自動生成 3 個 Gradle 文件:
接下來介紹這三個文件的作用。
1. setting.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):
buildscript從名字就可以看出來,buildscript 是所有項目的構建腳本配置,主要包括依賴的倉庫和依賴的 gradle 版本。
上圖中 repositories 代碼塊將 jcenter 配置為一個倉庫,JCenter 是一個很有名的 Maven 倉庫。確定了依賴的倉庫后,我們就可以在 dependencies 代碼塊中添加依賴的、在 jcenter 倉庫中的包了。
dependencies 代碼塊用于配置構建過程中的依賴包,注意,這里是用于 構建過程 ,因此你不能講你的應用模塊中需要依賴的庫添加到這里。
默認情況下唯一被用于構建過程中的依賴包是 Gradle for Android 的插件。我們還可以添加一些其他用于構建的插件,比如 retrolambda, apt, freeline 等等。
allprojectsallprojects 代碼塊用來聲明將被用于所有模塊的屬性,注意是 所有模塊 。常見的就是配置倉庫地址(jcenter, 自定義 maven 倉庫等),你還可以在 allprojects 中創建 tasks,這些 tasks 最終會運用到所有模塊中,
官方建議盡量少添加用于所有模塊的屬性,因為這意味著強耦合,一旦沒有構建主項目,你的子模塊很有可能因為缺少所有模塊的屬性導致構建失敗。
3.模塊下的 build.gradle
模塊下的 build.gradle 文件只應用于當前模塊,你可以覆蓋主目錄下的 build.gradle 的內容。
以我的練習項目為例介紹:
上圖中主要分三個模塊:apply plugin , android, dependencies。
apply pluginapply 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 面板中直觀的查看,添加,也可以使用代碼添加,這些內容我們后續詳細介紹:
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 文件作用及內容,引申出許多細節,比如 自定義構建、依賴管理、多種類型構建的配置等等。接下來我們將深入學習這些內容。
來自:http://blog.csdn.net/u011240877/article/details/53798052