Gradle for Android 第二篇( Build.gradle入門 )
新年新氣象,奮鬥的一年,在這一章,我們將學習以下內容:
- 理解Gradle檔案
- 編寫簡單的構建任務
- 自制構建指令碼
Gradle for Android 第一篇( 從 Gradle 和 AS 開始 )
Gradle for Android 第三篇( 依賴管理 )
Gradle for Android 第四篇( 構建變體 )
Gradle for Android 第五篇( 多模組構建 )
理解Gradle指令碼
當然我們現在討論的所有內容都是基於Android studio的,所以請先行下載相關工具。當我們建立一個新的工程,Android studio會預設為我們建立三個gradle檔案,兩個build.gradle,一個settings.gradle,build.gradle分別放在了根目錄和moudle目錄下,下面是gradle檔案的構成圖:
MyApp ├── build.gradle ├── settings.gradle └── app └── build.gradle
setting.gradle解析
當你的app只有一個模組的時候,你的setting.gradle將會是這樣子的:
include ':app'
setting.gradle檔案將會在初始化時期執行,關於初始化時期,可以檢視上一篇部落格,並且定義了哪一個模組將會被構建。舉個例子,上述setting.gradle包含了app模組,setting.gradle是針對多模組操作的,所以單獨的模組工程完全可以刪除掉該檔案。在這之後,Gradle會為我們建立一個Setting物件,併為其包含必要的方法,你不必知道Settings類的詳細細節,但是你最好能夠知道這個概念。
根目錄的build.gradle
該gradle檔案是定義在這個工程下的所有模組的公共屬性,它預設包含二個方法:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } } allprojects { repositories { jcenter() } }
buildscript方法是定義了全域性的相關屬性,repositories定義了jcenter作為倉庫。一個倉庫代表著你的依賴包的來源,例如maven倉庫。dependencies用來定義構建過程。這意味著你不應該在該方法體內定義子模組的依賴包,你僅僅需要定義預設的Android外掛就可以了,因為該外掛可以讓你執行相關Android的tasks。
allprojects方法可以用來定義各個模組的預設屬性,你可以不僅僅侷限於預設的配置,未來你可以自己創造tasks在allprojects方法體內,這些tasks將會在所有模組中可見。
模組內的build.gradle
模組內的gradle檔案只對該模組起作用,而且其可以重寫任何的引數來自於根目錄下的gradle檔案。該模組檔案應該是這樣:
apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.gradleforandroid.gettingstarted" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' }
外掛
該檔案的第一行是Android應用外掛,該外掛我們在上一篇部落格已經介紹過,其是google的Android開發團隊編寫的外掛,能夠提供所有關於Android應用和依賴庫的構建,打包和測試。
Android
該方法包含了所有的Android屬性,而唯一必須得屬性為compileSdkVersion和buildToolsVersion:
- compileSdkVersion:編譯該app時候,你想使用到的api版本。
- buildToolsVersion:構建工具的版本號。
構建工具包含了很多實用的命令列命令,例如aapt,zipalign,dx等,這些命令能夠被用來產生多種多樣的應用程式。你可以通過sdk manager來下載這些構建工具。
defaultConfig方法包含了該app的核心屬性,該屬性會重寫在AndroidManifest.xml中的對應屬性。
defaultConfig { applicationId "com.gradleforandroid.gettingstarted" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" }
第一個屬性是applicationId,該屬性複寫了AndroidManifest檔案中的包名package
name,但是關於applicationId和package
name有一些不同。在gradle被用來作為Android構建工具之前,package
name在AndroidManifest.xml有兩個作用:其作為一個app的唯一標示,並且其被用在了R資原始檔的包名。
Gradle能夠很輕鬆的構建不同版本的app,使用構建變種。舉個例子,其能夠很輕鬆的建立一個免費版本和付費版本的app。這兩個版本需要分隔的標示碼,所以他們能夠以不同的app出現在各大應用商店,當然他們也能夠同時安裝在一個手機中。資原始碼和R檔案必須擁有相同的包名,否則你的資原始碼將需要改變,這就是為什麼Android開發團隊要將package name的兩大功能拆分開。在AndroidManifest檔案中定義的package name依然被用來作為包名和R檔案的包名。而applicationid將被用在裝置和各大應用商店中作為唯一的標示。
接下來將是minSdkVersion和targetSdkVersion。這兩個和AndroidManifest中的<uses-sdk>很像。minSdkVersion定義為最小支援api。
versionCode將會作為版本號標示,而versionName毫無作用。
所有的屬性都是重寫了AndroidManifest檔案中的屬性,所以你沒必要在AndroidManifest中定義這些屬性了。
buildTypes方法定義瞭如何構建不同版本的app,我們將在下一篇部落格中有所介紹。
依賴包
依賴模組作為gradle預設的屬性之一(這也是為什麼其放在了Android的外面),為你的app定義了所有的依賴包。預設情況下,我們依賴了所有在libs檔案下的jar檔案,同時包含了AppCompat這個aar檔案。我們將會在下一篇部落格中討論依賴的問題。
讓我們開始tasks吧
如果你想知道你多少tasks可以用,直接執行gradlew tasks,其會為你展示所有可用的tasks。當你建立了一個Android工程,那麼將包含Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。
基本的tasks
android外掛依賴於Java外掛,而Java外掛依賴於base外掛。
base外掛有基本的tasks生命週期和一些通用的屬性。
base外掛定義了例如assemble和clean任務,Java外掛定義了check和build任務,這兩個任務不在base外掛中定義。
這些tasks的約定含義:
- assemble: 集合所有的output
- clean: 清除所有的output
- check: 執行所有的checks檢查,通常是unit測試和instrumentation測試
- build: 執行所有的assemble和check
Java外掛同時也新增了source sets的概念。
Android tasks
android外掛繼承了這些基本tasks,並且實現了他們自己的行為:
- assemble 針對每個版本建立一個apk
- clean 刪除所有的構建任務,包含apk檔案
- check 執行Lint檢查並且能夠在Lint檢測到錯誤後停止執行指令碼
- build 執行assemble和check
預設情況下assemble tasks定義了assembleDebug和assembleRelease,當然你還可以定義更多構建版本。除了這些tasks,android 外掛也提供了一些新的tasks:
- connectedCheck 在測試機上執行所有測試任務
- deviceCheck 執行所有的測試在遠端裝置上
- installDebug和installRelease 在裝置上安裝一個特殊的版本
- 所有的install task對應有uninstall 任務
build task依賴於check任務,但是不依賴於connectedCheck或者deviceCheck,執行check任務的使用Lint會產生一些相關檔案,這些報告可以在app/build/outputs中檢視:
android studio的tasks
你根本不必要去執行gradle指令碼在命令列中,Android studio有其對應的工具:
在這個介面,你要做的就是雙擊了。當然你也可以在Android studio中開啟命令列,執行相關命令,具體操作就不介紹了。
自定義構建
當你在Android studio中自定義了gradle檔案,需要更新project:
其實該按鈕,執行了generateDebugSources tasks,該任務會生成所有必要的classes檔案。
BuildConfig和resources
android { buildTypes { debug { buildConfigField "String", "API_URL", "/"http://test.example.com/api/"" buildConfigField "boolean", "LOG_HTTP_CALLS", "true" } release { buildConfigField "String", "API_URL", "/"http://example.com/api/"" buildConfigField "boolean", "LOG_HTTP_CALLS","false" } }
類似這些定義的常量,當定義了這些屬性後,你完全可以在程式碼中使用:BuildConfig.API_URL和BuildConfig.LOG_HTTP
最近,Android tools team也讓其裡面定義string變為可能:
android { buildTypes { debug { resValue "string", "app_name", "Example DEBUG" } release { resValue "string", "app_name", "Example" } } }
你可以在程式碼中使用這些string。其中“”不是必須得。
全域性設定
如果你有很多模組在一個工程下,你可以這麼定義你的project檔案。
allprojects { apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" } }
這隻會在你的所有模組都是Android app應用的時候有效。你需要新增Android 外掛才能訪問Android的tasks。更好的做法是你在全域性的gradle檔案中定義一些屬性,然後再模組中運用它們。比如你可以在根目錄下這麼定義:
ext { compileSdkVersion = 22 buildToolsVersion = "22.0.1" }
那麼你在子模組中就可以使用這些屬性了:
android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion }
Project properties檔案
上述方法是一種辦法,當然還有很多辦法:
- ext方法
- gradle.properties檔案
- -p引數
ext { local = 'Hello from build.gradle' } task printProperties << { println local // Local extra property println propertiesFile // Property from file if (project.hasProperty('cmd')) { println cmd // Command line property } }
當然你可以在gradle.properties中定義:
propertiesFile = Hello from gradle.properties
你也可以輸入命令列:
$ gradlew printProperties -Pcmd='Hello from the command line' :printProperties Hello from build.gradle Hello from gradle.properties Hello from the command line
總結
在這篇部落格中,我們細緻的檢視了Android studio生成的三個gradle檔案,現在你應該能夠自己去建立自己的gradle檔案,我們還學習了最基本的構建任務,學習了Android 外掛以及其tasks。
在接下來的幾年裡,Android開發生態將會爆炸性增長,很多有趣的依賴庫將會讓每個人去使用,在下一篇部落格裡面,我們將看看我們能有幾種方式新增我們的依賴庫,這樣我們才能夠避免造輪子。
相關文章
- Gradle for Android系列之二 build.gradle檔案GradleAndroidUI
- Android開發:build.gradle 配置指南AndroidUIGradle
- gradle的build.gradle詳解GradleUI
- Android Studio 編輯Build.gradle時很卡AndroidUIGradle
- build.gradle中正確地匯入RecyclerView依賴UIGradleView
- Android學習筆記之build.gradle檔案Android筆記UIGradle
- 《Android Gradle權威指南》之Gradle入門AndroidGradle
- Gradle for Android 第七篇( Groovy入門 )GradleAndroid
- Gradle核心思想(二)Gradle入門前奏Gradle
- Gradle入門系列(四)——初識Gradle TaskGradle
- AndroidStudio之app/build.gradle問題集錦AndroidAPPUIGradle
- 【安卓筆記】gradle入門安卓筆記Gradle
- Gradle入門系列(三)——初識Gradle與ProjectGradleProject
- Gradle入門系列(1):簡介Gradle
- Java執行緒入門第二篇Java執行緒
- build.gradle裡repositories的mavenCentral實現原理解析UIGradleMaven
- Gradle入門系列(五)——Gradle其它模組與Plugin外掛GradlePlugin
- 不得不學之「 Gradle」 ①入門Gradle
- Gradle入門系列(3):依賴管理Gradle
- Gradle外掛從入門到進階Gradle
- Android Studio NDK :一、基礎入門(基於gradle-experimental外掛)AndroidGradle
- Android入門教程 | RecyclerView使用入門AndroidView
- Gradle核心思想(三)Groovy快速入門指南Gradle
- Gradle入門系列(二)——groovy高階語法Gradle
- Gradle入門系列(一)——groovy基礎語法Gradle
- Gradle入門(翻譯自Graddle官網)Gradle
- Gradle入門(6):建立Web應用專案GradleWeb
- android 入門- 詞彙Android
- Android Bluetooth 入門Android
- Gradle入門及SpringBoot專案構建GradleSpring Boot
- Gradle入門系列(2):第一個Java專案GradleJava
- Gradle入門系列(5):建立多專案構建Gradle
- Android入門教程 | Kotlin協程入門AndroidKotlin
- MasaFramework入門第二篇,安裝MasaFramework瞭解各個模板Framework
- Gradle入門:建立 Spring Boot Web 應用專案GradleSpring BootWeb
- Android WorkManager使用入門Android
- Android新手入門1Android
- Android學習 - 入門Android