?
Android Studio 這么強(qiáng)大的工具,就算我們不懂 gradle, groovy, 也照樣能借助AS對(duì) Android 項(xiàng)目進(jìn)行編譯、調(diào)試、運(yùn)行、打包等操作。build.gradle 這個(gè)文件接觸這么久了,基本的項(xiàng)目配置也基本很熟悉了,畢竟每次自動(dòng)創(chuàng)建的 build.gradle 里的代碼就那么幾項(xiàng)配置,看一下那些英文單詞也基本猜到是什么配置。
但是,不知道你們會(huì)不會(huì)跟我一樣,在 github 上 clone 大神的項(xiàng)目后,總會(huì)發(fā)現(xiàn)他們的 build.gradle 里多了很多平常沒看見過的代碼,而且還看不懂代碼要做什么;
或者是比如當(dāng)需要進(jìn)行簽名時(shí),網(wǎng)上資料會(huì)讓你在 Android 標(biāo)簽內(nèi)加個(gè) signingConfigs, 然后在它里面進(jìn)行各種配置,比如 storeFile, keyAlias 等等之類的。還有其他類似這種情況,比如當(dāng)需要打包時(shí),在哪個(gè)地方加個(gè)什么標(biāo)簽再對(duì)它進(jìn)行各種配置之類的。不知道你們會(huì)不會(huì)也跟我一樣會(huì)有這樣的疑問,這個(gè)標(biāo)簽名怎么來的,為什么要放在這個(gè)位置,它里面有哪些屬性可以進(jìn)行配置?
疑惑久了,總想去了解下這是為什么,所以花了一段時(shí)間來學(xué)習(xí) gradle 的相關(guān)知識(shí),這次在這里記錄也分享一下,如果有錯(cuò)的地方,還望指點(diǎn)一下。
本次計(jì)劃是寫個(gè) gradle 系列博客,大概會(huì)有3-4篇,第一篇只是簡單的針對(duì)某個(gè)具體的 build.gradle 文件代碼進(jìn)行注釋解釋以及拋出一些疑問,當(dāng)然這個(gè) build.gradle 不會(huì)是AS自動(dòng)創(chuàng)建的那么簡單的代碼。然后再寫1-2篇介紹 gradle, groovy, 相關(guān)的資料網(wǎng)上很多,所以不會(huì)寫得很基礎(chǔ),大概是挑選一些我認(rèn)為比較重要的知識(shí)點(diǎn)進(jìn)行介紹。最后在前面的基礎(chǔ)上,對(duì) build.gradle 里面的代碼進(jìn)行分析講解,比如介紹說都有哪些標(biāo)簽,哪里去找這些標(biāo)簽等等。
好了,廢話就嘮叨到這,下面就開始正文。
系列索引
build.gradle系列一:看不懂的build.gradle代碼
build.gradle系列二:學(xué)點(diǎn)Groovy來理解build.gradle代碼
build.gradle系列三:如何用Adnroid Studio查看build.gradle源碼
...
build.Gradle
這個(gè) build.Gradle 文件來自 drakeet 大神的?Meizi?項(xiàng)目
我直接在代碼上加注釋,參照著注釋看代碼就行,是不是發(fā)現(xiàn)有很多代碼平時(shí)都沒看見過。
//Model都有各自的build.gradle,這里聲明該Model作為主項(xiàng)目,常見的還有另一個(gè)取值:
//apply plugin: 'com.android.library' 聲明該Model作為庫使用,當(dāng)然還有其他取值,后面博客會(huì)介紹
apply plugin: 'com.android.application'
//這里是在as里引入一個(gè)retrolambda插件,具體我也不大懂,可以看看這篇博客:
//http://blog.csdn.net/zhupumao/article/details/51934317?locationNum=12
apply plugin: 'me.tatarka.retrolambda'
//這里是groovy的代碼了,定義了一個(gè)獲取時(shí)間的方法,groovy是兼容java,它可以直接使用jdk里的方法
def releaseTime() {return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"
))
}//file()是Project.java里的一個(gè)方法,這里定義一個(gè)File類型的對(duì)象,Project后面博客會(huì)介紹到
def keyStore = file('meizhi.keystore'
)android {//這個(gè)大家應(yīng)該很熟悉了,有疑問的應(yīng)該是后面的代碼,這里表示獲取一些全局變量//這些變量的值在根目錄下的build.gradle中定義,具體可以看看這篇博客://http://blog.csdn.net/fwt336/article/details/54613419
compileSdkVersion rootProject.ext.android.compileSdkVersionbuildToolsVersion rootProject.ext.android.buildToolsVersion//同理,這里都是通過獲取全局設(shè)置的變量值來進(jìn)行相關(guān)配置,這樣做的好處在于當(dāng)//你的項(xiàng)目里有多個(gè)model時(shí),可以方便修改這些公共的配置,只需要修改一個(gè)地方就可以同步了
defaultConfig {applicationId rootProject.ext.android.applicationIdminSdkVersion rootProject.ext.android.minSdkVersiontargetSdkVersion rootProject.ext.android.targetSdkVersionversionCode rootProject.ext.android.versionCodeversionName rootProject.ext.android.versionName}//這里應(yīng)該是設(shè)置打包后的apk里的META-INF移除指定的文件吧
packagingOptions {exclude 'META-INF/DEPENDENCIES.txt'
//省略部分exclude 代碼...
}//關(guān)閉指定的lint檢查
lintOptions {disable 'MissingTranslation', 'ExtraTranslation'
}//lint檢查到錯(cuò)誤時(shí)不中斷編譯,好像是說lint檢查是為優(yōu)化代碼,發(fā)現(xiàn)的錯(cuò)誤其實(shí)并不會(huì)導(dǎo)致程序異常//所以有的時(shí)候及時(shí)發(fā)現(xiàn)Lint檢查錯(cuò)誤還是可以直接運(yùn)行查看效果
lintOptions {abortOnError false}//簽名的相關(guān)配置
signingConfigs {//這個(gè)標(biāo)簽名可以隨意命名,這里的作用大概類似于定義一個(gè)對(duì)象,該對(duì)象里設(shè)置好了簽名需要的各種配置//可以定義不止一種配置的簽名對(duì)象,例如常見的還有 debug{...}, release{...},然后在buildTypes{}里//通過 signingConfigs.app1 進(jìn)行調(diào)用
app1 {//簽名的相關(guān)配置,網(wǎng)上資料很多,STOREPASS, KEYALIAS, KEYPASS 這些常量是定義在//gradle.properties 文件里,如果沒有該文件手動(dòng)創(chuàng)建即可,這樣可以保證安全//只有定義在 gradle.properties 里的常量才可以直接通過常量名引用storeFile file('meizhi.keystore'
)storePassword project.hasProperty('STOREPASS') ? STOREPASS : ''
keyAlias project.hasProperty('KEYALIAS') ? KEYALIAS : ''
keyPassword project.hasProperty('KEYPASS') ? KEYPASS : ''
}}//編譯,打包的項(xiàng)目配置
buildTypes {debug {//在 BuildConfig 里自定義一個(gè) boolean 類型的常量//更多資料可以查看:http://stormzhang.com/android/2015/01/25/gradle-build-field/ buildConfigField "boolean", "LOG_DEBUG", "true"
debuggable trueapplicationIdSuffix ".debug"
}release {buildConfigField "boolean", "LOG_DEBUG", "false"
debuggable false//開啟混淆minifyEnabled
true//刪除無用的資源shrinkResources
true//混淆文件proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
if (keyStore.exists()) {println "Meizhi: using drakeet's key"
//根據(jù)在signingConfigs.app1里的簽名配置進(jìn)行簽名
signingConfig signingConfigs.app1} else {println "Meizhi: using default key"
}//這段代碼應(yīng)該會(huì)在大神的項(xiàng)目里挺常見的,我在很多項(xiàng)目里都看見過了//這也是groovy的代碼,這里的代碼作用是重命名最后打包出來的apk//根據(jù) def fileName 設(shè)置的格式來命名,${}表示的是某個(gè)變量的引用//例如根據(jù)設(shè)置的格式最后apk命名可能是: Meizhi_v1.0.0_2017-03-28_fir.apk//至于 applicationVariants 這些變量含義后面博客會(huì)介紹applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile =
output.outputFileif (outputFile !=
null && outputFile.name.endsWith('.apk'
)) {def fileName = "Meizhi_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile =
new File(outputFile.parent, fileName)}}}}//這里的作用跟 singingConfigs 差不多,只是為不同的 flavor 設(shè)置一些屬性//常見的設(shè)置比如設(shè)置不同的渠道編號(hào),設(shè)置不同的 api 服務(wù)器等等
productFlavors {fir {//這個(gè)的作用是將 AndroidManifest.xml 里的占位符 ¥{UMENG_CHANNEL_VALUE} 的值替換成firmanifestPlaceholders = [UMENG_CHANNEL_VALUE: "fir"
]}GooglePlay {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"
]}Umeng {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Umeng"
]}}}//設(shè)置JDK的版本通過compileOptions
compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}//lint的相關(guān)配置吧
lintOptions {disable "InvalidPackage"
lintConfig file("lint.xml"
)}
}//這里就不用說了
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'
])compile project(":libraries:headsupcompat"
)compile project(":libraries:smooth-app-bar-layout"
)//as默認(rèn)會(huì)去下載傳遞依賴,下面是指定不需要去下載傳遞依賴compile ('com.squareup.retrofit2:retrofit:2.1.0'
) {exclude module: 'okhttp'
}retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
//省略部分compile代碼...
}
?
疑問
1.apply plugin: 'com.android.application' 聽說這是調(diào)用一個(gè)方法?
2.rootProject.ext.android.compileSdkVersion, 不用 ext 來設(shè)置全局變量是否可以?
3.defaultConfig{}, packagingOptions{}, signingConfigs{}, buildTypes{} 等等這些,我怎么知道 Android{} 里都有哪些可以使用?
...
參考資料
·徐宜生寫的《Android群英傳:神兵利器》第4章:與Gradle的愛恨情仇
·retrolambda使用教程
·Gradle配置全局變量
·GRADLE自定義你的BUILDCONFIG
轉(zhuǎn)載于:https://www.cnblogs.com/Im-Victor/p/9549590.html
總結(jié)
以上是生活随笔為你收集整理的build.gradle代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。