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