gradle深入理解以及在android studio中的使用

1.1 Gradle概念

? ? ? ? Gradle是一個基于Apache ant和Apache maven概念的項目自動化構建工具。它使用一種基于Groovy的特定領域語言來聲明項目設置,而不是傳統的xml,當前其支持的語言限于java、groovy和scala[3],計劃未來將支持更多的語言。


1.2 Gradle的優勢

1:自動處理包相依關系;

2:自動處理布署問題;

3:條件判斷寫法直覺;

過去 Java 開發者常用 Maven 和 Ant 等工具進行封裝布署的自動化,或是兩者兼用,不過這兩個包彼此有優缺點,如果頻繁改變相依包版本,使用 Ant 相當麻煩,如果瑣碎工作很多,Maven 功能不足,而且兩者都使用 XML 描述,相當不利于設計 if、switch 等判段式,即使寫了可讀性也不佳,而 Gradle 改良了過去 Maven、Ant 帶給開發者的問題,至今也成為 Android Studio 內置的封裝布署工具。


1.3 Gradle基礎

? ? 在gradle中最重要的兩個概念是項目任務,每一次構建都包括至少一個項目,每個項目又包括一個或者多個任務。每一個build.gradle文件就代表著一個項目,任務定義在項目的構建腳本里,當初始化構建過程時,gradle會基于build文件自動組裝項目和任務對象。一個任務對象包含一系列的動作對象,這些動作對象之后會按照順序執行。一個單獨的動作對象就是一個待執行的代碼塊。

1.3.1 構建生命周期

一個gradle的構建通常有如下三個階段

a:初始化-項目實例會在該階段被創建。

? ? ?如果一個項目有多個模塊,并且每一個模塊都有其對應得build.gradle文件,那么就會創建多個項目實例;

b:配置-在該階段,構建腳本會被執行,并為每個項目實例創建和配置任務;

c:執行-在該階段,gradle將決定哪個任務會被執行,哪些任務會被執行取決于開始該次構建的參數配置和該gradle文件的當前目錄;

1.3.2 構建配置文件

每一個基于gradle構建的項目,都會有一個build.gradle文件,android的構建文件中有一些是必需的:

apply plugin: 'com.android.application'

buildscript{

repositories{

jcenter()

dependencies{

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

}

1.3.3 項目結構

/src/main/java -- 應用的源代碼

/src/main/res -- 應用相關的資源文件

/libs --外部庫

/build -- 構建過程的輸出


1.4 Gradle wrapper入門

? ? ? ?gradle是一個不斷發展的工具,新版本可能會打破向后兼容性,而使用gradle wrapper可以避免這個問題,并能確保構建是可復用的;

我們打開android studio可以看見有一個gradle文件夾,如圖1所示


(圖1)

這里的gradle-wrapper.properties文件就是用來指定當前項目構建使用的gradle地址;

? ? ? ?當項目中使用的不是最新的Gradle版本時,android studio就會顯示一個提醒,提示并建議你自動更新gradle版本,原理是android studio修改了gradle-wrapper.properties的配置并觸發了一次構建,這樣最新的Gradle就會被下載;


1.5 基本自定義構建

1.5.1 理解gradle文件

當使用studio創建一個新項目時,會默認生成三個gradle文件。其中的兩個文件--setting.gradle和build.gradle文件位于項目的根目錄,另外一個build.gradle文件則在android app模塊內,下邊我們分別介紹這幾個gradle文件的用途;

a:setting.gradle -setting文件在gradle初始化階段被執行,并且定義了哪些模塊應該被包含在構建中,新建android項目時默認只有 app一個模塊,對于多模塊項目必須要有setting.gradle文件,否則,gradle不知道哪個模塊應該被包含在構建內;

b:根項目的build.gradle文件,默認情況下其包含如下兩個代碼塊

buildscript{

repositories{

jcenter()

}

dependencies{

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

}

}

allprojects{

repositories{

jcenter()

}

}

其中jcenter是一個很有名的maven庫,denpendenies代碼塊用于配置構建過程中的依賴包;

c:模塊的構建文件,包含以下文件

1:插件

apply plugin : 'com.android.application',

2: android腳本

android{

compileSdkVersion 22

buildToolsVersion "22.0.1"

defaultConfig{

applicationid "com.baidu.cn"

versionName "1.0"

versionCode 1

}

buildTypes {

release{

minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

3: ?依賴包

依賴包是標準gradle配置的一部分,其定義了一個應用或依賴項目的所有依賴包,默認情況下,一個新的android應用,在libs文件夾下對所有jar文件構成依賴。

1.5.2 任務講解

任務包括基礎任務(java基礎插件提供基礎服務支持)和android任務(android插件擴展了java基礎插件提供android任務支持);

基礎任務包括 :

assemble:集合項目的輸出;

clean :清理項目的輸出;

check:運行所有檢查,通常是單元測試和集成測試;

build:同時運行assemble和check;

android任務包括:

build:同時運行assemble和check任務,可以生成若干apk文件;

help:

install:安裝apk文件到移動設備或者模擬器;

other:

verification:

1.5.3 自定義構建

1.5.3.1 操控manifest文件

我們可以在項目的build.gradle文件下邊配置applicationid,minSdkVersion,targetSdkVersion,versionCode,versionName,signingConfig,proguardFile等任務。

在該文件下配置的選項默認會被構建進系統中,當沒有被配置時才會去manifest文件查找;

1.5.3.2 BuildConfig和資源文件

自android sdk升級到17以后,構建工具會自動生成一個BuildConfig的類,該類包含一個按照構建類型設置值的DEBUG常量,如果有些功能只需要在debugging時期運行,那么我們就可以根據此常量來區分,示例代碼如下:

android{

buildTypes{

debug{

buildConfigField "String", "api_uirl","\"http://com.example.com\api/""

buildConfigField "boolean", "LOG_HTTP_CALLS","true"

resValue "string","app_name","example debug" ? ?// (修改應用在桌面的現實名稱)

}

release{

buildConfigField "String", "api_uirl","\"http://com.example.com\api/""

buildConfigField "boolean", "LOG_HTTP_CALLS","true"

resValue "string","app_name","example" ? ? ?//(修改應用在桌面的現實名稱)

}

}}

1.5.3.3 項目屬性,ext代碼塊

ext {

supportVersion ='25.0.1'

frescoVersion ='0.14.1'

}

下邊我們就可以直接應用定義的屬性

dependencies {

compile"com.android.support:percent:${supportVersion}"

compile"com.android.support:recyclerview-v7:${supportVersion}"

compile"com.android.support:appcompat-v7:${supportVersion}"

compile"com.android.support:support-v4:${supportVersion}"

compile"com.android.support:design:${supportVersion}"

}

1.5.3.4 默認的任務

如果沒有指定任何任務而運行gradle的話,其會運行help任務,我們在頂層build.gradle文件中加入一行,可用來指定默認任務:

defaultTasks 'clean' ,'assembleDebug'

當你運行沒有任何參數的gradle wrapper時,他會運行clean和assembledebug任務;


1.6 創建構建Variant

構建variant是用來提供多渠道多版本apk的一種實現方式,影響它的因數有兩個:

1:Product Flavor (定制產品);

productFlavors {

memebox_pc_download {

buildConfigField"String","UMENG_CHANNEL_ID","\"com_flexable_cn\""

buildConfigField"String","TALK_CHANNEL_ID","\"com_flexable_cn\""

buildConfigField"String","CHANNEL_NAME","\"com_flexable_cn\""

applicationid "com.example.flavor1"

versionCode?20

versionName "3.40.7"

}

2:Build Types(構建類型);

buildTypes {

debug {

minifyEnabled false

debuggable true

signingConfig signingConfigs.release

}

release {

buildConfigField"boolean","LOG_DEBUG","false"

debuggable false

shrinkResources false

minifyEnabled true

zipAlignEnabled true

signingConfig signingConfigs.release

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

staging{

applicationIdSuffix ".staging"

versionName?

}

}

每一個渠道都會生成debug和release版本的包,當然也可以自定義你想要的任何構建類型;














最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容