Gradle 作為Android studio指定的自動化管理構建程序的工具,每個Android 程序員都應該對其有最基本的了解,但是平時Android studio 已經幫我們完成了大多數Gradle的配置,所以大多數人對Gradle理解的并不多,接下來就讓我們進入Gradle的世界。
構建流程(摘自https://developer.android.com/studio/build/)
如圖 所示,典型 Android 應用模塊的構建流程通常依循下列步驟:
- 編譯器將您的源代碼轉換成 DEX(Dalvik Executable) 文件(其中包括運行在 Android 設備上的字節(jié)碼),將所有其他內容轉換成已編譯資源。
- APK 打包器將 DEX 文件和已編譯資源合并成單個 APK。不過,必須先簽署 APK,才能將應用安裝并部署到 Android 設備上。
- APK 打包器使用調試或發(fā)布密鑰庫簽署您的 APK:
- 如果您構建的是調試版本的應用(即專用于測試和分析的應用),打包器會使用調試密鑰庫簽署您的應用。Android Studio 自動使用調試密鑰庫配置新項目。
- 如果您構建的是打算向外發(fā)布的發(fā)布版本應用,打包器會使用發(fā)布密鑰庫簽署您的應用。要創(chuàng)建發(fā)布密鑰庫,請閱讀在 Android Studio 中簽署您的應用。
- 在生成最終 APK 之前,打包器會使用 zipalign 工具對應用進行優(yōu)化,減少其在設備上運行時的內存占用。
構建流程結束時,您將獲得可用來進行部署、測試的調試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK。
目錄結構
Android項目中最重要的就是 build.gradle, setting.gradle
setting.gradle
setting.gradle 是Gradle 的設置文件,位于項目的根目錄,用于指示 Gradle 在構建應用時應將哪些模塊包括在內。對大多數項目而言,該文件很簡單,只包括以下內容:
include ':app'
如果有多個module項目的話
include ':app', ':app2'
頂級根目錄build.gradle
頂級 build.gradle 文件位于項目根目錄,用于定義適用于項目中所有模塊的構建配置。默認情況下,這個頂級構建文件使用 buildscript {} 代碼塊來定義項目中所有模塊共用的 Gradle 存儲區(qū)和依賴項。
/**
buildscript{}是基礎配置,構建開始的時候,所有子模塊都會讀取這個里面的內容
*/
buildscript {
repositories { // 告訴Gradle 下載第三方庫的地址
jcenter() // 代表 https://bintray.com/bintray/jcenter
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
//配置所有模塊的共同使用內容
allprojects {
repositories {
jcenter() //讓所有子模塊都從jcenter 獲取第三方包
}
}
Gradle 插件和Gradle版本的關系
如上圖所示我們設置的是Gradle插件的版本號,并不是Gradle的版本,最后的序號就是插件的版本號,注意插件不是gradle,插件是根據gradle特性編寫為完成需求的jar包,插件依賴于gradle,下圖是插件和Gradle版本對應的關系,也就是說,如果我們用3.1.0的插件,就必須使用Gradle4.4以上的版本。
https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
在該文件里可以查看Gradle的版本信息
模塊級 build.gradle
build.gradle 文件位于每個 <project>/<module>/ 目錄,用于配置適用于其所在模塊的構建設置。您可以通過配置這些構建設置來提供自定義打包選項(例如附加構建類型和產品風味),以及替換 main/ 應用清單或頂級 build.gradle 文件中的設置。
以下這個示例 Android 應用模塊 build.gradle 文件概述了您應該了解的部分基本 DSL 元素和設置。google提供的dsl查詢手冊
/**
告訴Gradle這個module的構建類型,application 或者library
*/
apply plugin: 'com.android.application'
/**
Android 構建的參數
*/
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 15
// Specifies the API level used to test the app.
targetSdkVersion 28
// Defies the version number of your app.
versionCode 1
// Defines a user-friendly version name for your app.
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
splits {
// Screen density split settings
density {
// Enable or disable the density split mechanism
enable false
// Exclude these densities from splits
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
/**
* The dependencies {} block in the module-level build configuration file
* only specifies dependencies required to build the module itself.
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:28.0.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Gradle 還包括兩個屬性文件,位于項目根目錄,可用于指定適用于 Gradle 構建工具包本身的設置:
gradle.properties
您可以在其中配置項目范圍 Gradle 設置,例如 Gradle 后臺進程的最大堆大小。如需了解詳細信息,請參閱構建環(huán)境
local.properties
為構建系統配置本地環(huán)境屬性,例如 SDK 安裝路徑。由于該文件的內容由 Android Studio 自動生成并且專用于本地開發(fā)者環(huán)境,因此您不應手動修改該文件,或將其納入您的版本控制系統。
Gradle 在執(zhí)行的時候大概進行了如下幾步操作:
1 初始化構建
2 配置構建
3 執(zhí)行構建
4 完成構建或者失敗
在項目初始化構建的時候,去讀取項目的setting.gradle,判斷需要構建的項目,并在初始化的時候生成一個Gradle對象,我們可以在官網查到這個對象的的api和屬性。
初始化完成后,Gradle讀取到需要構建的各個項目,便開始配置構建工作,去讀取每個項目的build.gradle,并生成一個project對象,這個project對象對應這個這個build.gradle。project的文檔,我們可以在build.gradle 文件里調用project對象。
每個項目也就是build.gradle里都有一個個task,執(zhí)行構建的工作就是執(zhí)行這些task,在執(zhí)行這些task的過程,Gradle會把這個task任務的依賴任務也一個個執(zhí)行。我們可以在Android studio的Gradle 視圖里看到這些task
Android studio的安裝應用按鈕,clean其實都是在幫我們執(zhí)行這些相應的task 命令。