轉(zhuǎn)載(未找到原始鏈接)
Gradle是一種構(gòu)建工具蔗衡,它拋棄了基于XML的構(gòu)建腳本,取而代之的是采用一種基于Groovy的內(nèi)部領(lǐng)域特定語言,建議可以先熟悉一下Groovy腳本。
在線文檔
Gradle命令:
常用命令:
gradle明明一般是./gradlew +參數(shù)
尘颓, gradlew
代表gradle wrapper
,意思是gradle的一層包裝晦譬,大家可以理解為在這個(gè)項(xiàng)目本地就封裝了gradle
疤苹,即gradle wrapper
, 在gradle/wrapper/gralde-wrapper.properties
文件中聲明了它指向的目錄和版本敛腌。只要下載成功即可用grdlew wrapper
的命令代替全局的gradle
命令卧土。
-
./gradlew -v
版本號 -
./gradlew clean
清除app目錄下的build文件夾 -
./gradlew build
檢查依賴并編譯打包
這里注意的是 ./gradlew build
命令把debug
、release
環(huán)境的包都打出來像樊,如果正式發(fā)布只需要打Release
的包尤莺,該怎么辦呢,下面介紹一個(gè)很有用的命令 assemble
生棍, 如:
-
./gradlew assembleDebug
編譯并打Debug包 -
./gradlew assembleRelease
編譯并打Release的包
除此之外颤霎,assemble
還可以和productFlavors
結(jié)合使用:
-
./gradlew installRelease
Release模式打包并安裝 -
./gradlew uninstallRelease
卸載Release模式包
加入自定義參數(shù):
比如我們想根據(jù)不同的參數(shù)來進(jìn)行不用的編譯配置,可以在./gradlew
中加入自定義參數(shù)。
./gradlew assembleDebug -Pcustom=true
就可以在build.gradle
中使用下面代碼來判斷:
if (project.hasProperty('custom')){
}
assemble結(jié)合
Build Variants來創(chuàng)建
task
assemble
還能和Product Flavor
結(jié)合創(chuàng)建新的任務(wù)友酱,其實(shí) assemble
是和 Build Variants
一起結(jié)合使用的晴音,而 Build Variants = Build Type + Product Flavor
,舉個(gè)例子大家就明白了: 如果我們想打包 wandoujia
渠道的release
版本缔杉,執(zhí)行如下命令就好了:
./gradlew assembleWandoujiaRelease
如果我們只打wandoujia渠道版本锤躁,則:
./gradlew assembleWandoujia
此命令會生成wandoujia渠道的Release
和Debug
版本 同理我想打全部Release版本:
./gradlew assembleRelease
這條命令會把Product Flavor下的所有渠道的Release
版本都打出來。 總之或详,assemble
命令創(chuàng)建task有如下用法:
-
assemble<Variant Name>:
允許直接構(gòu)建一個(gè)Variant版本系羞,例如assembleFlavor1Debug。 -
assemble<Build Type Name>:
允許構(gòu)建指定Build Type的所有APK霸琴,例如assembleDebug將會構(gòu)建Flavor1Debug和Flavor2Debug兩個(gè)Variant版本椒振。 -
assemble<Product Flavor Name>:
允許構(gòu)建指定flavor的所有APK,例如assembleFlavor1將會構(gòu)建Flavor1Debug和Flavor1Release兩個(gè)Variant版本梧乘。
Gradle配置:
- Gradle構(gòu)建腳本
build.gradle
- Gradle屬性文件
gradle.properties
- Gradle設(shè)置文件
settings.gradle
build.gradle
先看整個(gè)項(xiàng)目的gradle配置文件:
buildscript {
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
內(nèi)容主要包含了兩個(gè)方面:一個(gè)是聲明倉庫的源杠人,這里可以看到是指明的jcenter()
, 之前版本則是mavenCentral()
,jcenter
可以理解成是一個(gè)新的中央遠(yuǎn)程倉庫,兼容maven
中心倉庫宋下,而且性能更優(yōu)。
另一個(gè)是聲明了android gradle plugin
的版本辑莫,android studio 1.0 正式版必須要求支持gradle plugin 1.0的版本某個(gè)Moudle的gradle
配置文件:
buildscript
buildscript {
repositories {
maven { url 'http://*********' }
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
}
}
- buildscript{}設(shè)置腳本的運(yùn)行環(huán)境学歧。
*repositories{}
支持java依賴庫管理,用于項(xiàng)目依賴各吨。 -
dependencies{}
依賴包的定義枝笨。支持maven/ivy
,遠(yuǎn)程揭蜒,本地庫横浑,也支持單文件。如果前面定義了repositories{}maven 庫屉更,則使用maven的依賴庫徙融,使用時(shí)只需要按照用類似于com.android.tools.build:gradle:0.4
,gradle 就會自動的往遠(yuǎn)程庫下載相應(yīng)的依賴瑰谜。
apply
//聲明是Android程序
apply plugin: 'com.android.application'
*apply plugin:
聲明構(gòu)建的項(xiàng)目類型欺冀。如果是庫的話就加
apply plugin: 'com.android.library'
android
android {
// 編譯SDK的版本
compileSdkVersion 22
// build tools的版本
buildToolsVersion "23.0.1"
//aapt配置
aaptOptions {
//不用壓縮的文件
noCompress 'pak', 'dat', 'bin', 'notice'
//打包時(shí)候要忽略的文件
ignoreAssetsPattern "!.svn:!.git"
//分包
multiDexEnabled true
//--extra-packages是為資源文件設(shè)置別名:意思是通過該應(yīng)用包名+R,com.android.test1.R和com.android.test2.R都可以訪問到資源
additionalParameters '--extra-packages', 'com.android.test1','--extra-packages','com.android.test2'
}
//默認(rèn)配置
defaultConfig {
//應(yīng)用的包名
applicationId "com.example.heqiang.androiddemo"
minSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
//編譯配置
compileOptions {
// java版本
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
//源文件目錄設(shè)置
sourceSets {
main {
//jni lib的位置
jniLibs.srcDirs = jniLibs.srcDirs << 'src/jniLibs'
//定義多個(gè)資源文件夾,這種情況下萨脑,兩個(gè)資源文件夾具有相同優(yōu)先級隐轩,即如果一個(gè)資源在兩個(gè)文件夾都聲明了弯汰,合并會報(bào)錯(cuò)纽什。
res.srcDirs = ['src/main/res', 'src/main/res2']
}
}
//簽名配置
signingConfigs {
debug {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('keystore/debug.keystore')
storePassword 'android'
}
}
buildTypes {
//release版本配置
release {
debuggable false
// 是否進(jìn)行混淆
minifyEnabled true
//去除沒有用到的資源文件富腊,要求minifyEnabled為true才生效
shrinkResources true
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.debug
//ndk的一些相關(guān)配置常摧,也可以放到defaultConfig里面橡娄。
//指定要ndk需要兼容的架構(gòu)(這樣其他依賴包里mips,x86,arm-v8之類的so會被過濾掉)
ndk {
abiFilter "armeabi"
}
}
//debug版本配置
debug {
debuggable true
// 是否進(jìn)行混淆
minifyEnabled false
//去除沒有用到的資源文件,要求minifyEnabled為true才生效
shrinkResources true
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.debug
//ndk的一些相關(guān)配置术吗,也可以放到defaultConfig里面擒滑。
//指定要ndk需要兼容的架構(gòu)(這樣其他依賴包里mips,x86,arm-v8之類的so會被過濾掉)
ndk {
abiFilter "armeabi"
}
}
}
// lint配置
lintOptions {
//移除lint檢查的error
abortOnError false
//禁止掉某些lint檢查
disable 'NewApi'
}
}
android{}
設(shè)置編譯android項(xiàng)目的參數(shù),構(gòu)建android項(xiàng)目的所有配置都寫在這里称勋。 除了上面寫的胸哥,在android{}塊中可以包含以下直接配置項(xiàng):
*productFlavors{ }
產(chǎn)品風(fēng)格配置,ProductFlavor類型
-
testOptions{ }
測試配置赡鲜,TestOptions類型 -
dexOptions{ }
dex配置空厌,DexOptions類型 -
packagingOptions{ }
PackagingOptions類型
*jacoco{ }
JacocoExtension類型。 用于設(shè)定 jacoco版本 -
splits{ }
Splits類型银酬。
幾點(diǎn)說明:
- 文件開頭
apply plugin
是最新gradle版本的寫法嘲更,以前的寫法是apply plugin: 'android'
, 如果還是以前的寫法,請改正過來揩瞪。
*minifyEnabled
也是最新的語法赋朦,很早之前是runProguard,這個(gè)也需要更新下。 -
proguardFiles
這部分有兩段李破,前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件宠哄,該文件已經(jīng)包含了基本的混淆聲明,免去了我們很多事嗤攻,這個(gè)文件的目錄在 sdk目錄/tools/proguard/proguard-android.txt
, 后一部分是我們項(xiàng)目里的自定義的混淆文件毛嫉,目錄就在app/proguard-rules.txt
, 如果你用Studio 1.0創(chuàng)建的新項(xiàng)目默認(rèn)生成的文件名是proguard-rules.pro
, 這個(gè)名字沒關(guān)系,在這個(gè)文件里你可以聲明一些第三方依賴的一些混淆規(guī)則妇菱。最終混淆的結(jié)果是這兩部分文件共同作用的承粤。 -
aaptOptions
更多介紹 http://blog.csdn.net/heqiangflytosky/article/details/51009123
repositories
repositories {
flatDir {
//本地jar依賴包路徑
dirs '../../../../main/libs'
}
}
dependencies
dependencies {
compile files('libs/android-support-v4.jar')
//在flatDir.dirs下面找依賴的aar
compile (name:'ui', ext:'aar')
// 編譯extras目錄下的ShimmerAndroid模塊
compile project(':extras:ShimmerAndroid')
// 編譯CommonSDK模塊,但是去掉此模塊中對com.android.support的依賴闯团,防止重復(fù)依賴報(bào)錯(cuò)
compile (project(':CommonSDK')) { exclude group: "com.android.support" }
provided fileTree(dir: 'src/android5/libs', include: ['*.jar'])
provided 'com.android.support:support-v4:21.0.3'
provided project(':main-host')
}
- compile和provided
compile
表示編譯時(shí)提供并打包進(jìn)apk辛臊。
provided
表示只在編譯時(shí)提供,不打包進(jìn)apk房交。 - exclude防止重復(fù)依賴
- include
CommonSDK模塊的定義可以參考settings.gradle其他的介紹可以參考 依賴庫管理彻舰。
幾點(diǎn)說明
- 看到上面的兩個(gè)一模一樣的repositories和dependencies了嗎?他們的作用是不一樣的候味,在buildscript里面的那個(gè)是插件初始化環(huán)境用的淹遵,用于設(shè)定插件的下載倉庫,而外面的這個(gè)是設(shè)定工程依賴的一些模塊和遠(yuǎn)程library的下載倉庫的负溪。
settings.gradle
這個(gè)文件是全局的項(xiàng)目配置文件透揣,里面主要聲明一些需要加入gradle的module。 一般在setting.gradle中主要是調(diào)用include方法川抡,導(dǎo)入工程下的各個(gè)子模塊辐真。 那我們在setting.gradle
里面還能寫什么呢须尚?因?yàn)閟etting.gradle對應(yīng)的是gradle中的Settings
對象,那查下Settings的文檔(https://docs.gradle.org/current/dsl/org.gradle.api.initialization.Settings.html)侍咱,看下它都有哪些方法耐床,哪些屬性,就知道在setting.gradle能寫什么了楔脯;
include ':AndroidDemo'
include ':CommonSDK'
project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')
include調(diào)用后撩轰,生成了一個(gè)名為:CommonSDK的Project對象,project(':CommonSDK')
取出這個(gè)對象昧廷,設(shè)置Project的 projectDir屬性堪嫂。projectDir哪里來的?請看Project
類的文檔木柬。
依賴庫管理
本地依賴
dependencies {
//單文件依賴
compile files('libs/android-support-v4.jar')
//某個(gè)文件夾下面全部依賴
compile fileTree(dir: 'src/android6/libs', include: ['*.jar'])
compile (name:'ui', ext:'aar')
compile (project(':CommonSDK')) { exclude group: "com.android.support" }
provided fileTree(dir: 'src/android5/libs', include: ['*.jar'])
provided 'com.android.support:support-v4:21.0.3'
provided project(':main-host')
}
遠(yuǎn)程依賴
gradle
同時(shí)支持maven皆串,ivy
,以maven作為例子:
repositories {
//從中央庫里面獲取依賴
mavenCentral()
//或者使用指定的本地maven 庫
maven{
url "file://F:/githubrepo/releases"
}
//或者使用指定的遠(yuǎn)程maven庫
maven{
url "https://github.com/youxiachai/youxiachai-mvn-repo/raw/master/releases"
}
}
dependencies {
//應(yīng)用格式: packageName:artifactId:version
compile 'com.google.android:support-v4:r13'
}
項(xiàng)目依賴
對于項(xiàng)目依賴android library
的話眉枕,在這里需要使用gradle mulit projec
t機(jī)制恶复。Mulit project
設(shè)置是gradle約定的一種格式,如果需要編譯某個(gè)項(xiàng)目之前速挑,要先編譯另外一個(gè)項(xiàng)目的時(shí)候谤牡,就需要用到。結(jié)構(gòu)如下(來自于官方文檔):
MyProject/
| settings.gradle
+ app/
| build.gradle
+ libraries/
+ lib1/
| build.gradle
+ lib2/
| build.gradle
需要在workplace目錄下面創(chuàng)建settings.gradle
的文件姥宝,然后在里面寫上:
include ':app', ':libraries:lib1', ':libraries:lib2'
例如:
include ':AndroidDemo'
include ':CommonSDK'
project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')
如此拓哟,gradle mutil project
就設(shè)置完畢。
對于app project如果需要應(yīng)用libraries目錄下的lib1伶授,只需要在app project的build.gradle文件里的依賴中這么寫:
compile project(':libraries:lib1')
類似前面的
provided project(':main-host')
即可完成,寫完以后可以用gradle AndroidDependencies
可以檢查依賴狀況
多渠道打包:
主要借助
android {
productFlavors{
……
}
}
來實(shí)現(xiàn)流纹。
網(wǎng)上多是類似友盟的配置糜烹,copy過來:
http://blog.csdn.net/maosidiaoxian/article/details/42000913
https://segmentfault.com/a/1190000004050697
在AndroidManifest.xml里面寫上:
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />
里面的Channel_ID就是渠道標(biāo)示。我們的目標(biāo)就是在編譯的時(shí)候這個(gè)值能夠自動變化漱凝。
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
然后用 ./gradlew assembleRelease
這條命令會把Product Flavor下的所有渠道的Release版本都打出來疮蹦。 assemble<Product Flavor Name>:
允許構(gòu)建指定flavor的所有APK,例如assembleFlavor1將會構(gòu)建Flavor1Debug和Flavor1Release兩個(gè)Variant版本茸炒。
在上面當(dāng)中愕乎,我們也可以指定一個(gè)默認(rèn)的渠道名,如果需要的話壁公。指定默認(rèn)的值是在defaultConfig
節(jié)點(diǎn)當(dāng)中添加如下內(nèi)容:
manifestPlaceholders = [ CHANNEL_NAME:"Unspecified"]
這里的 Unspecified
換成你實(shí)際上的默認(rèn)的渠道名感论。 使用manifestPlaceholders
的這種配置,同樣適用于manifest的其他配置紊册。比如你需要在不同渠道發(fā)布的apk里面比肄,指定不同的啟動Activity
。比如在豌豆莢里面發(fā)布的,啟動的Activity
顯示的是豌豆莢首發(fā)的界面芳绩,應(yīng)用寶里面啟動的是應(yīng)用寶首發(fā)的界面(哈哈掀亥,有點(diǎn)壞),你就可以對你的activity的值使用 {activity_name}的方式妥色,然后在productFlavors里面配置這個(gè){activity_name}的值搪花。
Gradle依賴的統(tǒng)一管理
我們可以在項(xiàng)目的根目錄創(chuàng)建一個(gè)gradle配置文件config.gradle,內(nèi)容如下:
ext{
android=[
compileSdkVersion: 22,
buildToolsVersion: "23.0.1",
minSdkVersion: 21,
targetSdkVersion: 22,
versionCode: 1,
versionName: "1.0"
]
dependencies=[
compile:'com.android.support:support-v4:21.0.3',
compile: (project(':CommonSDK')) { exclude group: "com.android.support" },
provided: fileTree(dir: 'src/android5/libs', include: ['*.jar']),
provided: project(':main-host')
]
}
targetSdkVersion
的版本還有依賴庫的版本升級都在這里進(jìn)行統(tǒng)一管理嘹害,所有的 module 以及主項(xiàng)目都從這里同意讀取就可以了撮竿。 在build.gradle文件中加入:
apply from:"config.gradle"
意思是所有的子項(xiàng)目或者所有的modules都可以從這個(gè)配置文件中讀取內(nèi)容。 android節(jié)點(diǎn)讀取ext中android對應(yīng)項(xiàng)吼拥,dependencies
讀取dependencies
對應(yīng)項(xiàng)倚聚,如果配置有變化就可以只在config.gradle
中修改,是不是很方便進(jìn)行配置的管理的凿可。