Android Studio 中的Gradle構(gòu)建系統(tǒng)示例
相信有很多像我一樣的朋友在使用Android Studio時(shí),對(duì) Gradle 和 Gradle Android 插件的版本號(hào)和作用不是很清楚,本篇文章的將對(duì)這些進(jìn)行解釋,最后通過(guò)一個(gè)實(shí)際的項(xiàng)目工程來(lái)說(shuō)明其中的配置塊的含義,并通過(guò)源代碼的角度去剖析腳本的結(jié)構(gòu)。
一.第一部分:Q&A
1.Gradle是什么?
Gradle 是一個(gè)JVM平臺(tái)上的自動(dòng)化的構(gòu)建工具,支持多項(xiàng)目構(gòu)建,強(qiáng)有力依賴管理(本地或者遠(yuǎn)程依賴),構(gòu)建腳本使用Groovy語(yǔ)言編寫(xiě)。
在Android Studio的 project 視圖下的 gradle/ wrapper/gradle-wrapper.properties 路徑下聲明了項(xiàng)目使用的Gradle版本號(hào),這里使用的是 3.3版本
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
2.Gradle Android Plugin 是什么?
在項(xiàng)目根目錄中的build.gradle文件中有如下設(shè)置:
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' }
這里聲明的是項(xiàng)目對(duì) Gradle Android Plugin 的依賴,其版本號(hào)為2.3.3。Gradle的Android插件提供了許多專為構(gòu)建Android的操作項(xiàng)。
classpath表明的是類路徑,該Android Plugin for Gradle 的對(duì)應(yīng)文件位置在Android Studio根目錄下的:gradle/m2repository/com/android/tools/build/gradle/對(duì)應(yīng)版本號(hào)/gradle-3.0.0.jar
附上我電腦上的路徑
可以看到,我們依賴的僅僅就是jar文件,build.gradle的腳本是使用Groovy語(yǔ)言編寫(xiě)的,Groovy編寫(xiě)的程序可以運(yùn)行在JVM虛擬機(jī)中。而Android Plugin for Gradle是專門(mén)為構(gòu)建Android項(xiàng)目提供庫(kù)文件。
平時(shí)我們經(jīng)常使用的比如 buildToolsVersion、compileSdkVersion,buildTypes{ }、sourceSets { }、defaultConfig{ }等方法函數(shù)(是的,就是方法,這是Groovy語(yǔ)言中的閉包和函數(shù)調(diào)用時(shí)的特性,現(xiàn)在無(wú)需關(guān)心,后面第三部分有講到這個(gè)),都是Gradle Android Plugin 這個(gè)庫(kù)提供的方法??刹灰詾镚radle僅僅是用來(lái)構(gòu)建Android項(xiàng)目。
3.Android Studio中的compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion這些配置項(xiàng)是什么?
- compileSdkVersion 26 :編譯項(xiàng)目使用的Android SDK的版本號(hào)為26,可以使用對(duì)應(yīng)版本號(hào)提供的API進(jìn)行編程
- minSdkVersion 14 :定義最小可以運(yùn)行app的android系統(tǒng)版本號(hào)為14
- targetSdkVersion 26 :指定測(cè)試app的android系統(tǒng)版本號(hào)為26
- buildToolsVersion "26.0.2" :指定Android Studio中 sdk 構(gòu)建工具的版本號(hào)、命令行工具等構(gòu)建工具,在使用Android plugin 3.0.0版本或以上時(shí),該屬性可以不用設(shè)置,插件會(huì)提供默認(rèn)版本號(hào)。
在導(dǎo)入github上面的工程時(shí),如果該工程所需要的Gradle版本、Android Plugin版本、buildToolsVersion版本,SDK 版本與你本地不符合時(shí),往往會(huì)卡死,所以在導(dǎo)入之前可以更改為你本地的版本,在進(jìn)行導(dǎo)入即可。
4. Gradle Wrapper是什么?
The Gradle Wrapper allows you to execute Gradle builds on machines where Gradle is not installed. This is useful for example for some continuous integration servers. It is also useful for an open source project to keep the barrier low for building it. The wrapper is also very interesting for the enterprise. It is a zero administration approach for the client machines. It also enforces the usage of a particular Gradle version thus minimizing support issues.
Gradle Wrapper 可以在沒(méi)有安裝Gradle的機(jī)器上執(zhí)行Gradle 構(gòu)建,經(jīng)常在持續(xù)性構(gòu)建平臺(tái)上所使用,例如jenkis。同時(shí)對(duì)于客戶端機(jī)器來(lái)說(shuō)零成本管理。
第二部分. 關(guān)于Android Studio 工程項(xiàng)目你需要知道的一些東西
- Android Studio項(xiàng)目工程包含一個(gè)Application module,包含若干個(gè)Library module。 Library module可以是Android library,也可以是java library。
- Android Library : 包含Android項(xiàng)目中的源代碼、資源文件、manifest文件,被編譯為AAR文件。AAR文件可做為Android 應(yīng)用模塊的依賴。
- java library : 僅包含java源文件,編譯的結(jié)果為JAR文件,可作為Android 應(yīng)用模塊的依賴或者java 項(xiàng)目的依賴。
- 每個(gè)module都可以被單獨(dú)的構(gòu)建,測(cè)試與調(diào)試,同時(shí)moudle可用來(lái)作為其他工程使用的library。
第三部分 .實(shí)際工程分析
通過(guò)github上的timber項(xiàng)目分析各模塊下的build.gradle配件文件的含義。可以直接到github上搜索找到該項(xiàng)目。
1.Timber項(xiàng)目結(jié)構(gòu)
根目錄的setting.gradle文件,告訴Gradle需要構(gòu)建的模塊包括那些
include ':timber',include ':timber-lint',include ':timber-sample'
a.其中timber-sample是Application 模塊,對(duì)應(yīng)聲明為
apply plugin: 'com.android.application'
b.timber是android library 模塊,對(duì)應(yīng)聲明為
apply plugin: 'com.android.library'
c.timber-lint是java library模塊,對(duì)應(yīng)聲明為
apply plugin: 'java-library'
2. build.gradle 文件中結(jié)構(gòu)解釋, 大招來(lái)了 :)
下面我將通過(guò)簡(jiǎn)單易懂的方式去讓使用者理解build腳本文件的結(jié)構(gòu)。
常見(jiàn)的模塊下build.gradle文件格式如下:
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "26.0.1" defaultConfig { } buildTypes { } } dependencies { }
2.1: “apply plugin: 'com.android.application'” 語(yǔ)句解釋:
Gradle是使用Groovy所寫(xiě),這里是調(diào)用了 apply方法,Groovy中方法調(diào)用時(shí)可以省略括號(hào),在你按住Control + 左鍵(mac為command+左鍵)時(shí),可以進(jìn)入到對(duì)應(yīng)的類中,之前上文也提到過(guò),Android Plugin 僅僅是Jar文件,讓我們進(jìn)入看看其中的對(duì)應(yīng)方法是什么?
public interface PluginAware { void apply(Map<String, ?> options); }
在Grovvy中 a.b() 這種格式可以寫(xiě)為a b
所以呢 compileSdkVersion ,apply 等語(yǔ)句都是在調(diào)用對(duì)應(yīng)的函數(shù)
2.2 xxx { } 格式到底是什么?
def debugClosure(int num, String str, Closure closure){ //dosomething } debugClosure(1, "groovy", { println"hello groovy!" })
首先"{ }" 在Groovy語(yǔ)言中是“閉包”,簡(jiǎn)單講閉包就是用“{ }”擴(kuò)起來(lái)的一段代碼段 ,在Groovy中有調(diào)用方法的時(shí)候有這樣一條規(guī)定:“在調(diào)用方法的時(shí)候,如果方法僅有一個(gè)參數(shù)是Closure類型(也就是閉包),調(diào)用的時(shí)候,可以把閉包中的執(zhí)行的代碼寫(xiě)到括號(hào)中,為xxx({ }),當(dāng)把括號(hào)省略之后就變成了 xxx{ } 格式”。
最前面代碼中的"android{ }"語(yǔ)句函數(shù)定義在Project類中,函數(shù)定義為:
AppExtension android(Closure configuration);
結(jié)論:build.gradle腳本文件在運(yùn)行的其實(shí)就是在執(zhí)行一系列的函數(shù)
3. 根目錄下build.gradle文件分析
該文件定義的是整個(gè)項(xiàng)目的構(gòu)建配置,該配置同樣生效于其他module
3.1 extra 屬性
我們可以在項(xiàng)目頂級(jí)build.gradle中聲明ext 塊,在其中定義的屬性可以在其他各個(gè)模塊中去使用,通過(guò)這種方式可以一次性更改項(xiàng)目的各個(gè)模塊的構(gòu)建配置。
ext { compileSdkVersion = 26、 supportLibVersion = "26.1.0" }
使用:在其他模塊通過(guò)rootProject.ext.compileSdkVersion去使用該屬性。
3.2 buildScript 塊
buildscript { repositories { jcenter() google() } dependencies { classpath deps.androidPlugin classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0' } }
其中repositories中聲明的是遠(yuǎn)程倉(cāng)庫(kù)的類別,平時(shí)我們?cè)赿ependencies塊中使用的類似compile 'io.reactivex:rxjava:1.0.0'語(yǔ)句,它在jcenter倉(cāng)庫(kù)中都是唯一存在,在構(gòu)建的時(shí)候,本地如果沒(méi)有的話,會(huì)到j(luò)center中去進(jìn)行下載對(duì)應(yīng)的版本。
4. 模塊下的build.gradle文件分析
1、defaultConfig 塊:定義的是APK各種構(gòu)建版本的默認(rèn)設(shè)置,這里面的一些屬性可在AndroidManifest.xml文件中重載配置
applicationId 'com.example.myapp' minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" }
productFlavors 塊: 可以配置多種產(chǎn)品類型,比如可以一個(gè)是free,另外一種類型是免費(fèi)
productFlavors { free { applicationId 'com.example.myapp.free' } paid { applicationId 'com.example.myapp.paid' } }
buildTypes 塊:可以配置多種構(gòu)建類型的相應(yīng)的配置項(xiàng),比如debug、relase版本。
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android PC端用ADB抓取指定應(yīng)用日志實(shí)現(xiàn)步驟
這篇文章主要介紹了Android PC端用ADB抓取指定應(yīng)用日志實(shí)現(xiàn)步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法,涉及Android針對(duì)按鈕元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-11-11Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android編程實(shí)現(xiàn)對(duì)話框Dialog背景透明功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)對(duì)話框Dialog背景透明功能,涉及Android對(duì)話框的布局、屬性及事件處理相關(guān)操作技巧,需要的朋友可以參考下2017-07-07Android定制RadioButton樣式三種實(shí)現(xiàn)方法
三種方法實(shí)現(xiàn)Android定制RadioButton樣式:使用XML文件進(jìn)行定義/在JAVA代碼中定義等等,感興趣的朋友可以參考下,希望可以幫助到你2013-02-02android webvie指定視頻播放器播放網(wǎng)站視頻
android webview過(guò)濾調(diào)用第三方瀏覽器,并且解析視頻網(wǎng)站播放地址,使用指定播放器2013-11-11