文 | 莫若吻
一蚀腿、gradle簡介
gradle是基于groovy語言的纷妆。
Android Studio是采用Gradle來構(gòu)建項(xiàng)目的亦镶。Gradle是一個非常先進(jìn)的項(xiàng)目構(gòu)建工具,使用了一種基于Groovy的領(lǐng)域特定語言(DSL)來聲明項(xiàng)目設(shè)置灼狰,摒棄了XML(如Ant和Maven)的各種煩瑣配置宛瞄。
Note:若只是用它構(gòu)建普通的工程,可以不去學(xué)groovy語言交胚;若想深入的做一下自定義的構(gòu)建插件咽扇,可以考慮學(xué)groovy辟犀,因?yàn)間roovy語言是基于java語言的,所以有java基礎(chǔ)的同學(xué)學(xué)習(xí)groovy語言不會很難。
二绊袋、build.gradle文件
1.Android項(xiàng)目中的gradle文件位置:
在一個android項(xiàng)目中一般會出現(xiàn)至少2個build.gradle文件椎扬,一個是project的gradle文件轮听,一個是module的gradle文件笋鄙。
Note:如果項(xiàng)目目錄結(jié)構(gòu)切換到Android模式下則全部gradle在Gradle Scripts下。
2.gradle文件內(nèi)的常用代碼釋義:
1)jcenter():
代碼托管庫互拾,設(shè)置后可以在項(xiàng)目中引用jcenter上的開源項(xiàng)目歪今。聲明在repositories閉包中。
很多的Android開源項(xiàng)目都會選擇將代碼托管到j(luò)center上颜矿,聲明了此行配置后寄猩,就可以在項(xiàng)目中輕松使用jcenter上的任何開源項(xiàng)目。
2)聲明gradle插件及版本號
classpath 'com.android.tools.build:gradle:2.3.3'
3)apply plugin:
代表著應(yīng)用一個插件或衡。
eg:
//表示一個應(yīng)用程序模塊焦影。
apply plugin: 'com.android.application'
// 表示是一個庫模塊
apply plugin: 'com.android.library'
Note:
com.android.application 是代表可以直接運(yùn)行的應(yīng)用程序车遂;
com.android.library 是只能作為代碼依附在別的應(yīng)用程序模塊來運(yùn)行。所以在引入一些Model為自己的應(yīng)用程序所用時(shí)斯辰,build.gradle文件的第一行就是apply plugin:'com.android.library'舶担。
4)android閉包:
compileSdkVersion: 用于指定項(xiàng)目的編譯版本。
buildToolsVersion: 用于指定項(xiàng)目的構(gòu)建工具的版本彬呻。
applicationId: 用于指定項(xiàng)目的包名衣陶,在創(chuàng)建項(xiàng)目的時(shí)候已經(jīng)指定了包名,當(dāng)要修改整個項(xiàng)目的包名時(shí)可以在此更改闸氮。
minSdkVersion: 項(xiàng)目最低的兼容版本剪况。后面的數(shù)字(eg:15)表示兼容到API 15
targetSdkVersion:
表示你在該目標(biāo)版本上已經(jīng)做過了充分的測試,系統(tǒng)將為你的應(yīng)用開啟一些最新的功能和特性蒲跨。
假如targetSdkVersion 為23或者更高译断,那么在Android6.0中運(yùn)行這個應(yīng)用時(shí)會開啟新的功能和特性;若設(shè)置成了22或悲,只能說明你的應(yīng)用程序在Android5.1系統(tǒng)上做過了充分的測試孙咪,Android6.0的新功能就不會啟用。
versionCode: 項(xiàng)目的版本號巡语。
versionName: 項(xiàng)目版本號的版本名翎蹈。
Note:
在以前eclipse開發(fā)中設(shè)置上述代碼都是在AndroidManifest.xml文件中設(shè)置的。
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
而在使用Android Studio開發(fā)時(shí)男公,即使在AndroidManifest.xml設(shè)置也無作用荤堪,運(yùn)行時(shí)只對build.gradle下的設(shè)置有效。
5)android閉包中的buildTypes閉包:
一般其中會有兩個閉包枢赔,一個是debug澄阳,一個release;當(dāng)然也可以有其他閉包糠爬。用于安裝文件的環(huán)境變量的配置寇荧。
debug閉包用于生成測試版安裝文件的配置,release閉包用于生成正式版安裝文件的配置执隧。可以只設(shè)置一個release閉包户侥。
minifyEnabled:用于設(shè)置是否對項(xiàng)目的代碼進(jìn)行混淆镀琉。true代表開啟,false代表關(guān)閉蕊唐。
proguardFiles:指定混淆時(shí)使用的文件屋摔。
proguard-android.txt:在Android SDK 目錄下的,里面是所有項(xiàng)目通用的混淆規(guī)則替梨。
proguard-rules.pro:是在當(dāng)前項(xiàng)目根目錄下的钓试,里面編寫當(dāng)前項(xiàng)目特有的混淆規(guī)則装黑。
6)dependencies閉包:
可以在其中指定當(dāng)前項(xiàng)目所有的依賴關(guān)系。
一般Android Studio 項(xiàng)目中一共有三種依賴方式:本地依賴弓熏、庫依賴和遠(yuǎn)程依賴恋谭。
本地依賴可以對本地的Jar包或目錄添加依賴關(guān)系
庫依賴可以對項(xiàng)目中的庫模塊添加依賴關(guān)系。
遠(yuǎn)程依賴則可以對jcenter庫上的開源項(xiàng)目添加依賴關(guān)系挽鞠。
庫依賴的基本格式為 compile project疚颊,后面加上依賴庫的庫名稱。
遠(yuǎn)程依賴的基本格式為 compile 信认,后面加上遠(yuǎn)程依賴庫的庫名稱材义;Gradle在構(gòu)建項(xiàng)目的時(shí)候會檢查一下本地倉庫是否已經(jīng)緩存了指定內(nèi)容,若沒有會自動聯(lián)網(wǎng)下載嫁赏,然后再添加到項(xiàng)目的構(gòu)建路徑中去其掂。
遠(yuǎn)程依賴時(shí)每次都要檢查是否有這個緩存,所以使編譯變的很慢潦蝇】畎荆可以設(shè)置成離線的Gradle模式。
eg:
//本地依賴聲明
compile fileTree(include: ['*.jar'], dir: 'libs')
//庫依賴聲明
compile project(':library_pulltorefresh')
//遠(yuǎn)程依賴聲明
compile 'com.android.support:appcompat-v7:25.3.1'
Note:
Android Studio 3.0以上的開發(fā)工具版本护蝶,api 替代了 compile华烟。
eg:
//本地依賴聲明
api fileTree(include: ['*.jar'], dir: 'libs')
//庫依賴聲明
api project(':library_pulltorefresh')
//遠(yuǎn)程依賴聲明
api 'com.android.support:appcompat-v7:25.3.1'
3.示例代碼:
(注:下面的代碼只是部分的示例代碼,要根據(jù)項(xiàng)目開發(fā)實(shí)際情況選擇性地使用代碼)
project的build.gradle文件:
eg:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {//閉包
jcenter()//代碼托管庫持灰,設(shè)置后可以在項(xiàng)目中引用jcenter上的開源項(xiàng)目
}
dependencies {
//聲明gradle插件及版本號
classpath 'com.android.tools.build:gradle:2.3.3'
//butterknife的新版插件必須在此處作配置
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
module的build.gradle文件:
eg:
apply plugin: 'com.android.application'//默認(rèn)的應(yīng)用程序模塊(插件)
apply plugin: 'com.jakewharton.butterknife'//butterkinfe插件
android {
compileSdkVersion cfg.compileVersion //編譯版本
buildToolsVersion cfg.buildToolsVersion //構(gòu)建工具版本
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig {
applicationId "com.zrmx.athenaapp" //包名
minSdkVersion cfg.minSdk //最低兼容版本
targetSdkVersion cfg.targetSdk //(目標(biāo)版本:充分測試過版本(建議版本))大于22需要考慮存儲權(quán)限問題盔夜,由于默認(rèn)權(quán)限是關(guān)閉的,啟動時(shí)下載廣告圖片緩存不了
versionCode project.VERSION_CODE as int //版本號
versionName project.VERSION_NAME //版本名稱
jackOptions {
enabled true
}
}
lintOptions {//設(shè)置編譯的lint開關(guān)堤魁,程序在buid的時(shí)候喂链,會執(zhí)行l(wèi)int檢查,有任何的錯誤或者警告提示妥泉,都會終止構(gòu)建
abortOnError false
}
buildTypes {
release {
minifyEnabled false //是否混淆(true為混淆)
//Android SDK通用的混淆規(guī)則椭微; 后面的為開發(fā)者編寫的項(xiàng)目混淆規(guī)則
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("int", "SERVICE_TYPE", "4")//線上環(huán)境
signingConfig signingConfigs.release
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk') && !outputFile.name.contains("debug")) {
output.outputFile = new File(APK_OUT_PATH + "/${variant.buildType.name}", "${releaseTime()}_v${defaultConfig.versionName}_c${defaultConfig.versionCode}.apk")
}
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
//本地依賴聲明
compile fileTree(include: ['*.jar'], dir: 'libs')
//庫依賴聲明
compile project(':library_pulltorefresh')
//遠(yuǎn)程依賴聲明
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.google.code.gson:gson:2.5'
compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//android 6.0 新增加了運(yùn)行時(shí)的動態(tài)添加權(quán)限
compile 'com.lovedise:permissiongen:0.0.6'
}
三、Gradle 解析大全
具體Gradle 原理及相關(guān)語法詳解請參考文章:
《Android:Gradle 解析》
版權(quán)聲明:本文為博主原創(chuàng)文章盲链,轉(zhuǎn)載請注明出處蝇率,謝謝!