Gradle for Android 第一篇( Build.gradle入門 )

理解Gradle腳本

當(dāng)然我們現(xiàn)在討論的所有內(nèi)容都是基于Android studio的,所以請先行下載相關(guān)工具。當(dāng)我們創(chuàng)建一個(gè)新的工程,Android studio會(huì)默認(rèn)為我們創(chuàng)建三個(gè)gradle文件,兩個(gè)build.gradle,一個(gè)settings.gradle,build.gradle分別放在了根目錄和moudle目錄下,下面是gradle文件的構(gòu)成圖:

MyApp

├── build.gradle

├── settings.gradle

└── app

└── build.gradle

setting.gradle解析

當(dāng)你的app只有一個(gè)模塊的時(shí)候,你的setting.gradle將會(huì)是這樣子的:

include ':app'

setting.gradle文件將會(huì)在初始化時(shí)期執(zhí)行,關(guān)于初始化時(shí)期,可以查看上一篇博客,并且定義了哪一個(gè)模塊將會(huì)被構(gòu)建。舉個(gè)例子,上述setting.gradle包含了app模塊,setting.gradle是針對(duì)多模塊操作的,所以單獨(dú)的模塊工程完全可以刪除掉該文件。在這之后,Gradle會(huì)為我們創(chuàng)建一個(gè)Setting對(duì)象,并為其包含必要的方法,你不必知道Settings類的詳細(xì)細(xì)節(jié),但是你最好能夠知道這個(gè)概念。

根目錄的build.gradle

該gradle文件是定義在這個(gè)工程下的所有模塊的公共屬性,它默認(rèn)包含二個(gè)方法:

buildscript {

repositories {

jcenter()

}

dependencies {

classpath 'com.android.tools.build:gradle:1.2.3'

}

}

allprojects {

repositories {

jcenter()

}

}

buildscript方法是定義了全局的相關(guān)屬性,repositories定義了jcenter作為倉庫。一個(gè)倉庫代表著你的依賴包的來源,例如maven倉庫。dependencies用來定義構(gòu)建過程。這意味著你不應(yīng)該在該方法體內(nèi)定義子模塊的依賴包,你僅僅需要定義默認(rèn)的Android插件就可以了,因?yàn)樵摬寮梢宰屇銏?zhí)行相關(guān)Android的tasks。

allprojects方法可以用來定義各個(gè)模塊的默認(rèn)屬性,你可以不僅僅局限于默認(rèn)的配置,未來你可以自己創(chuàng)造tasks在allprojects方法體內(nèi),這些tasks將會(huì)在所有模塊中可見。

模塊內(nèi)的build.gradle

模塊內(nèi)的gradle文件只對(duì)該模塊起作用,而且其可以重寫任何的參數(shù)來自于根目錄下的gradle文件。該模塊文件應(yīng)該是這樣:

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應(yīng)用插件,該插件我們在上一篇博客已經(jīng)介紹過,其是google的Android開發(fā)團(tuán)隊(duì)編寫的插件,能夠提供所有關(guān)于Android應(yīng)用和依賴庫的構(gòu)建,打包和測試。

Android

該方法包含了所有的Android屬性,而唯一必須得屬性為compileSdkVersion和buildToolsVersion:

compileSdkVersion:編譯該app時(shí)候,你想使用到的api版本。

buildToolsVersion:構(gòu)建工具的版本號(hào)。

構(gòu)建工具包含了很多實(shí)用的命令行命令,例如aapt,zipalign,dx等,這些命令能夠被用來產(chǎn)生多種多樣的應(yīng)用程序。你可以通過sdk manager來下載這些構(gòu)建工具。

defaultConfig方法包含了該app的核心屬性,該屬性會(huì)重寫在AndroidManifest.xml中的對(duì)應(yīng)屬性。

defaultConfig {

applicationId "com.gradleforandroid.gettingstarted"

minSdkVersion 14

targetSdkVersion 22

versionCode 1

versionName "1.0"

}

第一個(gè)屬性是applicationId,該屬性復(fù)寫了AndroidManifest文件中的包名package

name,但是關(guān)于applicationId和package

name有一些不同。在gradle被用來作為Android構(gòu)建工具之前,package

name在AndroidManifest.xml有兩個(gè)作用:其作為一個(gè)app的唯一標(biāo)示,并且其被用在了R資源文件的包名。

Gradle能夠很輕松的構(gòu)建不同版本的app,使用構(gòu)建變種。舉個(gè)例子,其能夠很輕松的創(chuàng)建一個(gè)免費(fèi)版本和付費(fèi)版本的app。這兩個(gè)版本需要分隔的標(biāo)示碼,所以他們能夠以不同的app出現(xiàn)在各大應(yīng)用商店,當(dāng)然他們也能夠同時(shí)安裝在一個(gè)手機(jī)中。資源代碼和R文件必須擁有相同的包名,否則你的資源代碼將需要改變,這就是為什么Android開發(fā)團(tuán)隊(duì)要將package name的兩大功能拆分開。在AndroidManifest文件中定義的package name依然被用來作為包名和R文件的包名。而applicationid將被用在設(shè)備和各大應(yīng)用商店中作為唯一的標(biāo)示。

接下來將是minSdkVersion和targetSdkVersion。這兩個(gè)和AndroidManifest中的很像。minSdkVersion定義為最小支持api。

versionCode將會(huì)作為版本號(hào)標(biāo)示,而versionName毫無作用。

所有的屬性都是重寫了AndroidManifest文件中的屬性,所以你沒必要在AndroidManifest中定義這些屬性了。

buildTypes方法定義了如何構(gòu)建不同版本的app,我們將在下一篇博客中有所介紹。

依賴包

依賴模塊作為gradle默認(rèn)的屬性之一(這也是為什么其放在了Android的外面),為你的app定義了所有的依賴包。默認(rèn)情況下,我們依賴了所有在libs文件下的jar文件,同時(shí)包含了AppCompat這個(gè)aar文件。我們將會(huì)在下一篇博客中討論依賴的問題。

讓我們開始tasks吧

如果你想知道你多少tasks可以用,直接運(yùn)行g(shù)radlew tasks,其會(huì)為你展示所有可用的tasks。當(dāng)你創(chuàng)建了一個(gè)Android工程,那么將包含Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。

基本的tasks

android插件依賴于Java插件,而Java插件依賴于base插件。

base插件有基本的tasks生命周期和一些通用的屬性。

base插件定義了例如assemble和clean任務(wù),Java插件定義了check和build任務(wù),這兩個(gè)任務(wù)不在base插件中定義。

這些tasks的約定含義:

assemble: 集合所有的output

clean: 清除所有的output

check: 執(zhí)行所有的checks檢查,通常是unit測試和instrumentation測試

build: 執(zhí)行所有的assemble和check

Java插件同時(shí)也添加了source sets的概念。

Android tasks

android插件繼承了這些基本tasks,并且實(shí)現(xiàn)了他們自己的行為:

assemble 針對(duì)每個(gè)版本創(chuàng)建一個(gè)apk

clean 刪除所有的構(gòu)建任務(wù),包含apk文件

check 執(zhí)行Lint檢查并且能夠在Lint檢測到錯(cuò)誤后停止執(zhí)行腳本

build 執(zhí)行assemble和check

默認(rèn)情況下assemble tasks定義了assembleDebug和assembleRelease,當(dāng)然你還可以定義更多構(gòu)建版本。除了這些tasks,android 插件也提供了一些新的tasks:

connectedCheck 在測試機(jī)上執(zhí)行所有測試任務(wù)

deviceCheck 執(zhí)行所有的測試在遠(yuǎn)程設(shè)備上

installDebug和installRelease 在設(shè)備上安裝一個(gè)特殊的版本

所有的install task對(duì)應(yīng)有uninstall 任務(wù)

build task依賴于check任務(wù),但是不依賴于connectedCheck或者deviceCheck,執(zhí)行check任務(wù)的使用Lint會(huì)產(chǎn)生一些相關(guān)文件,這些報(bào)告可以在app/build/outputs中查看:

android studio的tasks

你根本不必要去執(zhí)行g(shù)radle腳本在命令行中,Android studio有其對(duì)應(yīng)的工具:

在這個(gè)界面,你要做的就是雙擊了。當(dāng)然你也可以在Android studio中打開命令行,執(zhí)行相關(guān)命令,具體操作就不介紹了。

自定義構(gòu)建

當(dāng)你在Android studio中自定義了gradle文件,需要更新project:

其實(shí)該按鈕,執(zhí)行了generateDebugSources tasks,該任務(wù)會(huì)生成所有必要的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"

}

}

類似這些定義的常量,當(dāng)定義了這些屬性后,你完全可以在代碼中使用:BuildConfig.API_URL和BuildConfig.LOG_HTTP

最近,Android tools team也讓其里面定義string變?yōu)榭赡埽?/p>

android {

buildTypes {

debug {

resValue "string", "app_name", "Example DEBUG"

}

release {

resValue "string", "app_name", "Example"

}

}

}

你可以在代碼中使用這些string。其中“”不是必須得。

全局設(shè)置

如果你有很多模塊在一個(gè)工程下,你可以這么定義你的project文件。

allprojects {

apply plugin: 'com.android.application'

android {

compileSdkVersion 22

buildToolsVersion "22.0.1"

}

}

這只會(huì)在你的所有模塊都是Android app應(yīng)用的時(shí)候有效。你需要添加Android 插件才能訪問Android的tasks。更好的做法是你在全局的gradle文件中定義一些屬性,然后再模塊中運(yùn)用它們。比如你可以在根目錄下這么定義:

ext {

compileSdkVersion = 22

buildToolsVersion = "22.0.1"

}

那么你在子模塊中就可以使用這些屬性了:

android {

compileSdkVersion rootProject.ext.compileSdkVersion

buildToolsVersion rootProject.ext.buildToolsVersion

}

Project properties文件

上述方法是一種辦法,當(dāng)然還有很多辦法:

ext方法

gradle.properties文件

-p參數(shù)

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

}

}

當(dāng)然你可以在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

總結(jié)

在這篇博客中,我們細(xì)致的查看了Android studio生成的三個(gè)gradle文件,現(xiàn)在你應(yīng)該能夠自己去創(chuàng)建自己的gradle文件,我們還學(xué)習(xí)了最基本的構(gòu)建任務(wù),學(xué)習(xí)了Android 插件以及其tasks。

在接下來的幾年里,Android開發(fā)生態(tài)將會(huì)爆炸性增長,很多有趣的依賴庫將會(huì)讓每個(gè)人去使用,在下一篇博客里面,我們將看看我們能有幾種方式添加我們的依賴庫,這樣我們才能夠避免造輪子。

轉(zhuǎn)載:Android開發(fā)中文站?Gradle for Android 第二篇( Build.gradle入門 )

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

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,147評(píng)論 25 708
  • 上一章我們學(xué)習(xí)了Gralde的使用,創(chuàng)建和轉(zhuǎn)換Android工程。本章我們將深入了解構(gòu)建文件,學(xué)習(xí)一些有用的tas...
    sollian閱讀 1,405評(píng)論 0 3
  • 第二篇( Build.gradle入門 ) 在這一章,我們將學(xué)習(xí)以下內(nèi)容: 理解Gradle文件 編寫簡單的構(gòu)建任...
    一劍飛鴻閱讀 205評(píng)論 0 0
  • 轉(zhuǎn)載注明出處:http://www.itdecent.cn/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,747評(píng)論 0 4
  • 深夜給男神發(fā)消息 無果。 斷斷續(xù)續(xù)看手機(jī)生怕錯(cuò)過回復(fù)斷了聯(lián)系。 后來睡著了 醒來的時(shí)候陽光灑滿整個(gè)屋子 太刺眼 吵...
    內(nèi)心是參天大樹的小豆芽閱讀 263評(píng)論 0 2

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