Gradle是一種項目自動化構建工具,基於Groovy語言來聲明項目設置,同時支持kotlin文件xxx.gradle.kts做爲DSL(Domain Specified Language)。
html
對與最直接的比較就是Gradle和Maven的比較,還有Ant,不過目前基本沒有什麼基於Ant構建的項目這裏就不提了。
首先Gradle的簡易性比Maven要好的多。Groovy語法的書寫和可讀性要比Maven中的Xml方便不少。
其次,Gradle中自定義功能要比Maven中方便不少。在Gradle中自定義Task便可,在Maven要寫插件來實現。
java
安裝、配置環境變量、測試安裝結果。具體參考Gradle官網gradle.org/install/android
新建build.gradle文件,進入該目錄命令行執行gradle build
即可生成.gradle隱藏文件。這就是基本的gradle項目。
git
gradle wrapper
生成以下結構,該命令是同統一不一樣開發者使用相同的Gradle構建版本進行構建。
這裏須要一點。在android studio中,Gradle和Android獨立運行,這意味着Android的構建並不依賴與IDE,能夠配合Gradle單獨完成項目的構建。android studio只不過是幫助咱們生成了一個目錄結構並界面化的處理Gradle中的任務。
咱們先看一下新建andorid項目的目錄結構
api
該文件爲gradle設置文件,位於項目根目錄,配置項目的多模塊構建,include ':app', ':example_module'
表示使用同級目錄中的app模塊、example_module模塊。也能夠具體制定模塊路徑。以下使用
瀏覽器
include ':app'
include ':example_module'
project(':example_module').projectDir = new File(rootDir,'example/example_module')
複製代碼
該文件爲項目屬性文件,可用於保存key-value資源供項目使用。
gradle.properties中android studio會自動幫咱們建立org.gradle.jvmargs=-Xmx1536m
該屬性爲Gradle後臺進程的最大堆大小,最小爲1536m,咱們也能夠自定義修改該值org.gradle.jvmargs = -Xmx2048m
。
咱們也能夠配置其餘屬性,如org.gradle.caching=true
讓gralde配置使用緩存,減小少編譯時間。
其實還有不少屬性能夠配置具體能夠看Gradle官網中的Build Environmentdocs.gradle.org/current/use…
local.properties中會填寫本地的SDK、NDK路徑,多人開發通常要加入.gitignore。
緩存
項目級build.gradle 文件位於項目根目錄,用於定義適用於項目中全部模塊的構建配置。
bash
/**
* buildscript{}聲明工程所須要的依賴,如在module中須要引用的插件
* 好比要在module中引用 apply :'com.android.application',
* 須要在這裏加入依賴 classpath 'com.android.tools.build:gradle:3.1.4'
*/
buildscript {
/**
* repositories{}聲明瞭工程所須要的依賴庫,供下面dependencies下載
* 低版本gradle須要將google()改成
* maven { url 'https://maven.google.com/' }
*/
repositories {
google()
jcenter()
}
/**
* dependencies{}聲明瞭具體的依賴,使用[group]:[name]:[version]形式
*/
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
}
}
/**
* allprojects{}定義了項目中全部module的配置
* 此處全部module的遠程倉庫都添加了google()和jcenter()
*/
allprojects {
repositories {
google()
jcenter()
}
}
/**
* 此處就是gradle中的一個task,名稱爲clean,
* 使用Groovy語言實現,徹底兼容java,
* 能夠跟進delete方法,內部就是一個用java實現的遞歸刪除方法
*/
task clean(type: Delete) {
delete rootProject.buildDir
}
複製代碼
模塊級build.gradle文件位於每一個module文件夾中,用於配置適用於其所在模塊的構建設置,如自定義打包設置、引入模塊內的依賴等。
微信
/**
* 引入所需插件 此處使用‘com.android.application’
* 提供了android {} 配置的可用性,用戶構建android項目
*/
apply plugin: 'com.android.application'
/**
* android{}部分是根據com.android.application來配置的屬性,
* 包含了android項目配置的必要信息
*/
android {
/**
* compileSdkVersion 是gradle中用於構建使用的版本,
* 可使用該版本及如下的API特性
*
* buildToolsVersion 使用android SDK build tools的版本
*/
compileSdkVersion 26
buildToolsVersion "28.0.3"
/**
* 基本配置,某些配置會覆蓋manifest中的配置
*/
defaultConfig {
/**
* applicationId ,編譯打包時會將該處配置覆蓋到manifest中
*/
applicationId 'com.example.myapp'
// 定義最小運行的android版本
minSdkVersion 15
// 指定應用程序的API級別用來測試。
targetSdkVersion 26
// app的版本號,某些手機上安裝應用會進行校驗,不能降級安裝
versionCode 1
// app的版本名稱,通常使用三位數控制「1.1.0」
versionName "1.0"
}
/**
* buildTypes {} 聲明瞭構建類型,默認包含了debug,release
* 也能夠增長自定義的構建類型
*/
buildTypes {
/**
* 配置當構建類型爲release時的選項,如是否開啓混淆,及混淆規則文件
* 也能夠增長構建配置,如增長簽名文件的相關配置
*/
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* productFlavors {}聲明瞭不一樣的特點版本。
* 這裏的配置能夠覆蓋defaultConfig {}中的配置
* 好比說這裏的例子配置了一個付費的版本和一個免費的版本
* 使用了不一樣的applicationId使兩個項目能夠同時運行在一個手機上
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* 多APK構建,根據屏幕的dpi或者系統的ABI來進行生成不一樣的apk
* 使用很少,這裏不作重點介紹
*/
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"
}
}
}
/**
* dependencies {} 聲明的module級別的依賴來實現對其餘項目的調用
*/
dependencies {
implementation project(":lib")
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
複製代碼
Google tools team一直致力於提升android studio的編譯速度,使用最新的gradle插件能夠搞編譯速度 在Android Gradle Plugin 3.0.0後,google推出了新的依賴方式,並強制要求廢棄老的依賴方式,將原有的compile閉包方法,拆分紅implementation,api以明確項目的依賴關係。
其中implementation僅對當前module依賴有效,api同compile,存在依賴的傳遞性。錯誤的使用則會致使依賴被加載兩次,增長編譯時間。
更多3.0.0以後的特性能夠參考官方文檔中的Dependency configurations部分developer.android.com/studio/buil…網絡
- compile 'com.android.support:appcompat-v7:27.1.1'
+ implementation 'com.android.support:appcompat-v7:27.1.1'
複製代碼
當minSdkVersion爲21如下的時候的時候(不包含21),則編譯時間會大大增長。咱們能夠經過定製開發版本編譯minSdkVersion爲21來提升開發效率,具體配置以下:
android {
defaultConfig {
...
multiDexEnabled true
}
productFlavors {
dev {
minSdkVersion 21
}
prod {
minSdkVersion your_minSDKVersion
}
}
...
}
複製代碼
當須要針對不一樣的ABI或dpi作支持,使用spilts{}對工程生成不一樣apk時可使用該方法。
在開發調試的時候,關閉splits功能,具體配置以下:
android {
...
if (project.hasProperty(‘devBuild’)){
splits.abi.enable = false
splits.density.enable = false
}
...
}
複製代碼
使用命令行構建時使用這個命令:
./gradlew assembleDevelopmentDebug -PdevBuild
// gradlew assembleDevelopmentDebug -PdevBuild
複製代碼
當使用Android Studio構建可作如下配置:
打開Preferences -> Build, Execution, Deployment -> Compiler,再Command-line選項後填寫-PdevBuild,以下圖所示:
在咱們進行開發調試的時候,沒有必要對全部的資源文件進行編譯,一般只選擇一種能夠減小編譯時間,具體配置以下:
android{
...
productFlavors {
development {
minSdkVersion 21
//only package english translations, and xxhdpi resources
resConfigs (「en」, 「xxhdpi」)
}
}
...
}
複製代碼
android構建的時候默認開啓了PNG壓縮,在開發調試時,能夠將PNG壓縮關閉,具體配置以下:
android {
...
if (project.hasProperty(‘devBuild’)){
aaptOptions.cruncherEnabled = false
}
...
}
複製代碼
andorid studio 3.0以後對instant run進行了很大的優化,以前的版本出現過更新的代碼沒有運行到手機上,因此一直關閉着。如今能夠嘗試使用。
在開發調試的狀況下,不要使用動態定義
// def buildDateTime = new Date().format(‘yyMMddHHmm’).toInteger()
def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
defaultConfig {
versionCode buildDateTime
}
}
複製代碼
項目在構建的過程當中具備不肯定性,可能由於網絡問題致使編譯時間過長或編譯失敗。而且Gradle會每24小時檢查一次新的依賴版本從而增長依賴解析時間。
不要使用下面的依賴方式
// 錯誤的示範
implementation 'com.appadhoc:abtest:latest'
implementation 'com.android.support:appcompat-v7:27+'
複製代碼
分配更大的內存可能會對大的項目的構建有時間上的減小,具體還要看電腦的配置等其餘因素,具體能夠參考gradle官網 Configuring JVM memory:docs.gradle.org/current/use…
新版本配置時在gradle.properties中配置
org.gradle.jvmargs=-Xmx1536m
複製代碼
不要在使用老版本的在build.gradle中配置
dexOptions {
javaMaxHeapSize = ‘4g’
}
複製代碼
Gradle緩存是Gradle 3.5的新特性,當緩存開啓時,Gradle將緩存並重用以前構建的結果。具體在gradle.properties中增長以下配置:
org.gradle.caching=true
複製代碼
以上幾點出自google 2017 I/O大會,具體可參看會議視頻 www.youtube.com/watch?v=7ll…
針對每一個項目的構建呢,具體的優化也不會相同,咱們能夠將咱們項目的具體構建時間輸出成文檔,具體分析哪塊的構建時間過長,來針對性的優化。具體命令以下:
gradlew --profile --recompile-scripts --offline --rerun-tasks assembleFlavorDebug
複製代碼
經過上面的文章,咱們就已經瞭解瞭如何配置gradle來對android項目進行構建,以及對項目構建進行部分優化,可是咱們對於原理部分還所知甚少,好比爲何能夠在build.gradle中定義android{}這部分代碼,爲何這裏就能夠實現對項目的配置,本着知其然,知其因此然的態度,咱們要繼續對gradle進行探索,瞭解groovy語法,瞭解gradle中的task,及使用自定義構建功能。
相關鏈接
Android中的Gradle之玩轉自定義功能
參考文檔: andorid官方文檔——配置構建 developer.android.com/studio/buil…
gradle官方文檔——Building Android Apps guides.gradle.org/building-an…
Google I/O中提到的提升Android studio的編譯速度的幾個建議 blog.csdn.net/sd19871122/…