Android 之 Gradle 深入淺出

一、什么是構(gòu)建

1.1 概述

構(gòu)建 也叫 build,就是根據(jù)輸入信息,然后經(jīng)過處理,最后得到目標(biāo)產(chǎn)物。最簡單的構(gòu)建工具就是 make 了,make 就是根據(jù) Makefile 文件中寫的規(guī)則,執(zhí)行對應(yīng)的命令,然后得到目標(biāo)產(chǎn)物。

日常生活中和構(gòu)建類似的一個場景就是做菜,輸入各種食材,然后按固定的工序,最后得到一盤菜。當(dāng)然,做同樣一道菜,由于需求不同,做出來的東西也不盡相同。比如:

宮保雞丁這道菜,有人要求不能放大油,口淡的要求少放鹽和各種油,辣不怕的男女漢子們可以要求多放辣子....總之,做菜包含固定的工序,但是對于不同條件或需求,需要做不同的處理。

Gradle 是就是這樣一個的構(gòu)建工具,基于 JVM ,支持 maven、Ivy 倉庫。它使用一種基于Groovy 的特定領(lǐng)域語言(DSL)來聲明項目設(shè)置,build 腳本使用 Groovy 編寫,拋棄了基于XML的各種繁瑣配置。

1.2 Android Gradle 中 Project、Task、Module之間的關(guān)系

Android Studio 中一個 Project 表示一個工程,可能會包含多個 Module。如下圖:

PermissionTest 表示一個 Project 工程,它的根目錄會有一個build.gradle文件,用來控制整個工程編譯,它里面有兩個 Module: appmylibrary,每個 Module 會對應(yīng)一個 build.gradle文件 ,可以單獨編譯。

根目錄還有一個Settings.gradle文件,它是用來描述此工程有幾個子module,例如PermissionTest工程中有兩個Module app?和?mylibrary,所以Settings.gradle中代碼如下:

include':app',':mylibrary'

介紹Task之前,我們先簡單介紹一下?插件,插件在項目構(gòu)建中可以做很多事情:

1. 添加任務(wù)到項目中,比如測試、編譯、打包;

2. 可以配置依賴,比如我們編譯的時候依賴的第三方庫;

3. 可以對項目進(jìn)行一些約束,比如應(yīng)用android插件后,約定/app/src/main/java目錄下時源碼存放的位置,編譯的時候也是編譯此目錄下的文件。

比如上面說到的兩個module都使用相應(yīng)的插件來構(gòu)建,app的插件就是我們最常見的:

apply plugin:'com.android.application'

而mylibrary插件為:

apply plugin: 'com.android.library'

Task是Gradle構(gòu)建中的最小執(zhí)行單元,一個Task代表一個構(gòu)建工作的原子操作,每個Task都會對應(yīng)一組動作,例如編譯 Classes 或者生成 Javadoc。上面說到的插件就是包含一組Task,不同的插件作用不一樣,例如apply plugin:'com.android.application' 會包含以下插件:

一般插件會包含Java源碼編譯Task、資源編譯Task、JNI編譯Task、lint檢查Task、打包生成APK的Task、簽名Task、install和uninstall Task等。

二、配置文件介紹

2.1 app中的 build.gradle介紹

三個gradle文件

Android Studio新建一個工程,一般都會有上圖的三個gradle文件,首先介紹app中的build.gradle:

如上圖,app中的build.gradle分為三部分:

第一部分:apply plugin:'com.android.application' 上面已經(jīng)說過,時Android Studio用來構(gòu)建app的插件,就不詳細(xì)說明了。

第二部分:android{},Android Gradle 工程的配置的唯一入口。通過它,可以對Android Gradle工程進(jìn)行自定義的配置。

第三部分:dependencies {},依賴配置,引用的三方庫都在這里配置。

2.1.1 compileSdkVersion、minSdkVersion、targetSdkVersion的區(qū)別

defaultConfig {}?默認(rèn)配置,它是一個ProductFlavor,ProductFlavor允許我們根據(jù)不同的情況生成多個不同的APK包,比如多渠道打包。如果沒有單獨配置ProductFlavor的話,默認(rèn)會使用defaultConfig的配置。

compileSdkVersion : 是配置編譯Android 工程的SDK,28表示API Level,表示編譯的時候,會采用該api的規(guī)范進(jìn)行代碼檢查和警告,但是并不會編譯進(jìn)apk中。

minSdkVersion:定義應(yīng)用程序支持的最低API版本,最低版本設(shè)置為API 27,目標(biāo)版本設(shè)置為API 28,那么應(yīng)用程序調(diào)用使用API 28提供的方法時,Android Studio將提醒開發(fā)者引用一個未定義的方法,使用該方法需要將minSdkVersion設(shè)置為API 28以上。

targetSdkVersion:目標(biāo)軟件開發(fā)版本,表示創(chuàng)建的Android項目使用哪個API版本,編譯的時候會將該版本的API編譯進(jìn)apk中,高版本API可以兼容低版本API,反之則不行。

buildToolsVersion?"25.0.2":表示使用Android構(gòu)建工具的版本,它是一個工具包,包括aapt、dex等工具。

所以版本號的大小關(guān)系就是:compileSdkVersion>targetSdkVersion>minSdkVersion

2.1.2 編譯源文件配置

項目中遇到不同的版本使用不同AndroidManifest.xml文件場景,可以通過配置sourceSets解決,sourceSets的功能還有很多,還可以指定編譯哪些java文件,不編譯哪些類和資源。

2.1.3 buildTypes 配置

用來配置release和debug版本,是否要開啟代碼混淆,混淆的級別。

2.2?依賴配置

開發(fā)中會經(jīng)常用到第三方開源庫,之前我們的做法就是下載對應(yīng)的jar包導(dǎo)入到我們項目中去,但是如果用到三方庫很多,而且每個庫都有很多版本,這時靠人工去下載管理就很麻煩,Gradle幫我們解決這個難題,通過配置依賴,也就是告訴Gradle去哪里查找我們使用的jar包,Gradle會自動幫我們下載導(dǎo)入項目中。

根目錄下的build.gradle文件:

根目錄下的build.gradle文件

1、buildscript里是gradle腳本執(zhí)行所需依賴,分別是對應(yīng)的maven庫和插件

2、allprojects里是項目本身需要的依賴,比如我現(xiàn)在要依賴自己maven庫的toastutils庫,那么我應(yīng)該將maven {url 'https://dl.bintray.com/calvinning/maven'}寫在這里,而不是buildscript中,不然找不到。

配置項目中依賴哪些庫文件,就時在 app 中build.gralde文件的第三部分:

2.3 集成簽名配置

Gradle可以用來對apk的簽名,通過signingConfigs可指定使用哪個簽名證書簽名,

signingConfigs {

??? release {

??????? keyAlias “myreleaseKey”

??????? keyPassword 'android'

??????? storeFile file('myrelease.keystore')

??????? storePassword 'android'

??? }

}

三、Gradle 拓展

1. 閉包的概念

2. Gradlew

3. 全局變量的定義和使用?


參考:

GRADLE構(gòu)建最佳實踐

《Android Gradle 權(quán)威指南》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容