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的構建文件中有一些是必需的:

aaply 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版本的包,當然也可以自定義你想要的任何構建類型;

 

來自:http://www.jianshu.com/p/1680700a974f

 

 本文由用戶 MerlinMZLO 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!