1.? 什么是Gradle综芥?
Gradle 是一個基于Ant和Maven概念的項目自動化建構(gòu)工具蹈集。
2.? Gradle 基本概念
下圖是很基本的Android Gradle工程谐岁,目錄結(jié)構(gòu)也是正常的Gradle工程的樣式趴久。下載地址
2.1 ?StudyGradle/build.gradle(圖標(biāo)1)
這個文件是整個項目的gradle基礎(chǔ)配置文件:
buildscript {// 腳步運行環(huán)境
repositories {// 用于項目依賴
// 中央遠程倉庫
jcenter()
}
dependencies {
// gradle版本
classpath'com.android.tools.build:gradle:1.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
這里主要描述了兩個方面:
1. gradle 版本
2. 倉庫的源地址
2.2 ?StudyGradle/app/build.gradle(圖標(biāo)2)
這個文件是Module名稱為app的gradle的配置文件运提,在此項目中是主要的gradle配置文件苍在。
//聲明插件類型,這里聲明的是Android程序
apply plugin:'com.android.application'
android {
//編譯SDK的版本
compileSdkVersion22
//build tools 的版本 對應(yīng)Android SDK Build-tools
buildToolsVersion"21.1.2"
defaultConfig {
//應(yīng)用包名
applicationId"com.example.dpt.studygradledemo"
minSdkVersion21
targetSdkVersion22
versionCode1
versionName"1.0"
}
buildTypes {//構(gòu)建類型晃虫,常用的有release和debug兩種皆撩,可以在這里面啟用混淆,啟用zipAlign以及配置簽名信息等
release {
//是否進行混淆
minifyEnabled false
//混淆文件位置
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
// 移除lint檢查的error
lintOptions {
abortOnError false
}
}
dependencies {
// 編譯依賴libs目錄下的所有jar包
compile fileTree(dir:'libs', include: ['*.jar'])
// //應(yīng)用格式: packageName:artifactId:version
// 依賴 support-v4
compile'com.android.support:support-v4:22.2.0'
// 依賴 card view
compile'com.android.support:cardview-v7:22.2.0'
// 依賴 library module
compile project(':demolibrary')
compile'com.android.support:palette-v7:22.2.0'
}
ps:
1. 開頭第一行apply plugin: ‘com.android.application’哲银,這表示該module是一個app module扛吞,應(yīng)用了com.android.application插件,如果是一個android library荆责,那么這里的是apply plugin: ‘com.android.library’滥比。'com.android.application'是較新的寫法,但不是最新的寫法做院。
2. buildToolsVersion 對應(yīng)Android SDK Build-tools的版本盲泛,如圖
2.2.1 ?buildTypes{}
buildTypes是構(gòu)建類型濒持,常用的有release和debug兩種,可以在這里面啟用混淆寺滚,啟用zipAlign以及配置簽名信息等柑营。
2.2.2 ?defaultConfig{}
這里描述的是一些項目基礎(chǔ)默認(rèn)配置
常用的屬性有:versionCode,versionName,minSdkVersion,targetSdkVersion,applicationId等
2.2.3 ?dependencies{}
dependencies就不屬于Android專有的配置了,它定義了該module需要依賴的jar村视,aar官套,jcenter庫信息。
1. compile fileTree(dir: 'libs', include: ['*.jar']) 編譯依賴libs目錄下的所有jar包
2. compile 'com.android.support:support-v4:22.2.0' 依賴 support-v4
3. compile project(':demolibrary') 依賴其他module
ps:
其中依賴開源組件的格式為:packageName:artifactId:version 例如蓖议,compile 'com.android.support:support-v4:22.2.0'
StudyGradle/demolibrary/build.gradle(圖標(biāo)2)
這個是一個依賴庫的module配置文件
//聲明Android library
apply plugin:'com.android.library'
android {
//編譯SDK版本
compileSdkVersion22
//build tools 的版本 對應(yīng)Android SDK Build-tools
buildToolsVersion"21.1.2"
defaultConfig {
minSdkVersion21
targetSdkVersion22
versionCode1
versionName"1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir:'libs', include: ['*.jar'])
}
ps:
1. 這里需要注意的是apply plugin 這里聲明為Android library
2.3 ?StudyGradle/build.gradle(圖標(biāo)3)
這個文件是全局的項目配置文件虏杰,里面主要聲明一些需要加入gradle的module
include':app',':demolibrary'
2.4 ?Gradle Wrapper(圖標(biāo)4)
android studio希望你能在電腦上不安裝gradle的情況下,依然使用gradle管理android項目勒虾,因此通過AS創(chuàng)建的每個項目都會內(nèi)嵌一個gradle wrapper纺阔,作用是檢查你當(dāng)前的共工作環(huán)境是否安裝了創(chuàng)建本項目時所用的gradle版本。
如果沒有修然,它會自動下載相應(yīng)的gradle放在~/.gradle/wrapper.目錄下笛钝。這樣當(dāng)你在你的項目里使用gradle時,可以通過gradlw命令使用當(dāng)前項目環(huán)境的gradle版本愕宋,而不受環(huán)境變量的影響玻靡。
很多人會遇到一個項目build很久,很大一部分原因就是因為這個中贝,他會去下載自帶的gradle wrapper囤捻,50多M,大部分情況下需要翻墻
如果不能翻墻邻寿,也可以更改**gradle-wrapper.properties**的配置
1
2
3
4
5distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
3. 打包
3.1 Gradle Flavor
寫項目的時候經(jīng)常會遇到以下的情況:
1. 需要生成測試版本和正式版本的apk
2. 測試版本和正式版本的URL是不一樣的
3. 測試版本和正式版本的包名需要不一致蝎土,這樣才能安裝到同一部手機上面。
4. 不同apk需要應(yīng)用名不同绣否,圖標(biāo)不同誊涯,某些常量不同....
>通過Productflavor你可以配置此flavor對應(yīng)的包名,簽名信息蒜撮,版本名暴构, 版本號等,具體可配置項可以到這里[查看](http://apdr.qiniudn.com/com.android.build.gradle.internal.dsl.ProductFlavor.html)段磨。
productFlavors{
max1 {
applicationId"com.example.dpt.gradle.max1"
}
x1 {
applicationId"com.example.dpt.gradle.x1"
}
}
輸出所有apk
1
./gradlewassemble
輸出任意flavor
1
./gradlewassembleX1
> 生成的apk在StudyGradle/app/build/outputs/apk/目錄下
3.2 簡單使用場景
3.2.1 使用不同包名
國內(nèi)應(yīng)用市場取逾、渠道眾多,更換包名是最簡單的需求了
productFlavors{
max1 {
applicationId"com.example.dpt.gradle.max1"
}
x1 {
applicationId"com.example.dpt.gradle.x1"
}
}
3.2.2 buildConfig(控制變量)
Gradle會在產(chǎn)生源碼階段為flavor生成一個BuildConfig.java文件薇溃。BuildConfig類默認(rèn)提供了一些常量字段菌赖,比如應(yīng)用的版本名(VERSION_NAME),應(yīng)用的包名(PACKAGE_NAME)等沐序。更強大的是琉用,開發(fā)者還可以添加自定義的一些字段。
android {
defaultConfig {
//自定義boolean型常量
buildConfigField ('boolean','AUTO_UPLOAD','false')
//自定義String型常量
buildConfigField('String','SERVER_URI','"默認(rèn) uri"')
}
productFlavors{
max1 {
applicationId"com.example.dpt.gradle.max1"
//自定義boolean型常量
buildConfigField ('boolean','AUTO_UPLOAD','true')
//自定義String型常量
buildConfigField('String','SERVER_URI','"Max uri"')
//自定義res常量
resValue('string','app_name','MAX')
}
x1 {
applicationId"com.example.dpt.gradle.x1"
//自定義String型常量
buildConfigField('String','SERVER_URI','"X1 uri"')
//自定義res常量
resValue('string','app_name','X1')
}
}
}
3.2.3 這還遠遠不夠
>如果我們想更換大量文案策幼,圖標(biāo)邑时,布局,甚至是不同版本使用有差異的控件怎么辦特姐?
可在**src**文件夾下創(chuàng)建同**Flavor**晶丘,在里面可以對各種不同的Flavor,編寫不同的需求唐含。
在Demo中浅浮,兩個不同的Flavor在詳情頁,使用了不同的布局和控件捷枯。
![enter image description here](http://7d9pic.com1.z0.glb.clouddn.com/gradle_flavor.png)
具體代碼在Demo中的part2滚秩,分支