1、gradle是什么:
Gradle是一個基于JVM的構(gòu)建工具,是一款通用靈活的構(gòu)建工具,支持maven, Ivy倉庫,支持傳遞性依賴管理,而不需要遠(yuǎn)程倉庫或者是pom.xml和ivy.xml配置文件,基于Groovy,build腳本使用Groovy編寫。
2、android項目中的gradle文件:
通常一個android項目會有project、module、settings這三個gradle文件,如下圖:Android項目gradle文件.png
3、Project gradle文件:
首先我們看一下Project gradle文件:
// Gradle中可以使用“//”或“/**/”來添加注釋,與Java類似。
// 根目錄下的build.gradle用于添加子工程或模塊共用的配置項。
// "buildscript"的類型為script block,而且是最上層的script block,用于配置Gradle的Project實例。其API文檔為https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:buildscript(groovy.lang.Closure)
// 其余的根script block有"allprojects", "dependencies", "configurations"等,更多的可見https://docs.gradle.org/current/dsl/的“Build script structure”一節(jié)。
// Script Block是一種method的調(diào)用,傳入的參數(shù)為configuration closure。執(zhí)行后會對Project的屬性進(jìn)行配置。
// 此處的"buildscript"用于配置Project的build script的classpath。
buildscript {
ext.kotlin_version = '1.1.2-4'
repositories {
// 從https://maven.google.com下載code reposities 同google()
maven { url 'https://maven.google.com' }
// 從https://jcenter.bintray.com/下載code reposities。
jcenter()
// 從https://dl.google.com/dl/android/maven2/下載code reposities
google()
}
// 定義classpath,gradle會從“repositories”中下載對應(yīng)版本的Gradle。如果使用gradle wrapper的話,感覺這個配置會被忽略。Wrapper會自己去下載所使用的gradle版本。
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
// 該配置會被應(yīng)用到所有的子工程。
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
maven { url "https://jitpack.io" }
mavenCentral()
}
}
// 運行g(shù)radle clean時,執(zhí)行此處定義的task。
// 該任務(wù)繼承自Delete,刪除根目錄中的build目錄。
// 相當(dāng)于執(zhí)行Delete.delete(rootProject.buildDir)。
// gradle使用groovy語言,調(diào)用method時可以不用加()。
task clean(type: Delete) {
delete rootProject.buildDir
}
這里首先要注意到buildscript與allprojects中都有repositories,他們的作用分別是什么?buildscript里是gradle腳本執(zhí)行所需依賴,分別是對應(yīng)的maven庫和插件,如果把里面的庫都注釋掉,你會發(fā)現(xiàn)下面的gradle:3.0.1版本和kotlin都沒辦法使用了。allprojects里是項目本身需要的依賴,如果你把這里的庫注釋掉,你會發(fā)現(xiàn)module project里面的依賴都無法使用了。
??下面接著說buildscript里面的repositories中的庫,maven { url 'https://maven.google.com' },這里它的作用其實是跟google()的功能是一樣的,都指向的google的maven庫,google()可以視作是它的快捷方式,google()是在Gradle4.x中引入的,國內(nèi)無法訪問https://maven.google.com,但是可以使用其替代庫https://dl.google.com/dl/android/maven2/也即google(),另外使用google()的條件是:Android3.0及以上版本,Gragdle4.0及以上版本。jcenter()是一個由bintray.com維護(hù)的Maven倉庫(這里是倉庫的內(nèi)容:https://oss.sonatype.org/content/repositories/releases/。在早期的android studio的版本中,還使用了mavenCenter()插件庫,但是后來被去掉了,這是因為jecenter相比于mavenCenter在以下幾個方面更有優(yōu)勢:1、在性能和占存儲大小方面比mavenCenter()更優(yōu)。2、jcenter通過CDN發(fā)送library,開發(fā)者可以享受到更快的下載體驗。3、jcenter是全世界最大的Java倉庫,因此在Maven Central 上有的,在jcenter上也極有可能有。換句話說jcenter是Maven Central的超集。4、上傳library到倉庫很簡單,不需要像在 Maven Central上做很多復(fù)雜的事情。一般情況下我們在新建一個項目的時候jecenter()、google()會自動的添加到項目中,除了這兩個標(biāo)準(zhǔn)的library以外我們還可以使用其他的或自定義的maven庫,這時候就需要我們在項目中自己申明了,比如:maven { url "https://jitpack.io" }。
4、Module gradle文件:
這里展示一個demo gradle文件
//指明這是一個類庫,這里指明這是一個android工程,也可以填com.android.library
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
//使用的編譯版本SDK28
compileSdkVersion 28
//buildtool版本 指定為28.0.3
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.saicfinance.androiddemo"
//最小SDK18
minSdkVersion 18
//目標(biāo)版本(也即程序運行時版本)28
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 打包簽名
signingConfigs {
//指定debug模式下使用的簽名文件
debug { storeFile file("debug.keystore") }
release {
//發(fā)布正式版本模式下的使用的簽名文件
storeFile file('release.keystore')
storePassword 'thisiskeystorepassword'
keyAlias 'nim_demo'
keyPassword 'thisiskeypassword'
}
}
//編譯時腳本運行環(huán)境
buildTypes {
// debug環(huán)境配置
debug {
// 指定簽名為debug
signingConfig signingConfigs.debug
// 設(shè)置使用第三方sdk注冊文件在debug環(huán)境下的配置key
manifestPlaceholders = [AMAP_KEY: "09fd4efd3e28e9bf1f449ecec7d34bfe"]
}
//正式版本環(huán)境配置
release {
// 是否混淆
minifyEnabled true
// 是否zip優(yōu)化
zipAlignEnabled true
// 刪除無效的文件
shrinkResources true
// 設(shè)置混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 指定簽名為release
signingConfig signingConfigs.release
// 設(shè)置使用第三方sdk注冊文件在release環(huán)境下的配置key
manifestPlaceholders = [AMAP_KEY: "ee20324fba1c7f4ad7a4a207e7f08e8d"]
}
}
}
// module項目依賴
dependencies {
//依賴文件夾下的所有文件
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}
上面就是一個基本的gradle文件的一些配置,當(dāng)然根據(jù)項目的情況不同,可能還需要加一些別的配置,這里就暫時不介紹了。下面介紹一些比較基礎(chǔ)的知識:
1)compileSdkVersion、targetSdkVersion、minSdkVersion作用和如何選擇關(guān)系。
compileSdkVersion:這個主要是我們編譯app時候用的sdk版本,就我們在AndroidStudio上面點擊運行時候的編譯時候的環(huán)境。記住這個只是在編譯時候選擇的版本,不涉及到運行時候的行為。由于androidStudio有預(yù)編譯的功能所以會提示一些警告,提前了解新的sdk api。修改compileSdkVersion并不會影響我們的我們生成的app在手機上運行的行為。例如在android6.0之前的系統(tǒng)是不需要動態(tài)申請權(quán)限的,在6.0之后的系統(tǒng)需要動態(tài)申請權(quán)限。這個和你的compileSdkVersion的版本選擇是完全沒有任何關(guān)系的。也就是說你app運行時需不需要動態(tài)申請權(quán)限和你complieSdk是否設(shè)置的6.0,沒有半毛錢關(guān)系,記住compileSDK只是關(guān)系到你編譯出來的包。不是運行的表現(xiàn)行為。所以修改compileSdkVersion是不會改變你app在手機上運行的表現(xiàn)行為的。但是我們一般情況,也是最理想的情況就是把compileSdkVersion設(shè)置到最高,因為使用新的編譯檢查可以獲得很多好處,可以避免棄用的API,并且為使用新的API做好準(zhǔn)備。
targetSdkVersion:這個是程序運行時指定的sdk版本,比如Android 9.0系統(tǒng)就對應(yīng)這sdk 28,如果設(shè)置了targetSdkVersion=28,那么程序運行的表現(xiàn)形式就要按照android 9.0的系統(tǒng)來,比如動態(tài)請求權(quán)限在sdk 23的時候有了,但是22的時候并沒有,這時候如果你設(shè)置的targetSdkVersion=22,那么程序在運行的時候并不會動態(tài)請求權(quán)限。它的作用主要有三個:1.提供向下兼容。2.確定app的表現(xiàn)行為。3.這允許你在適應(yīng)新的行為變化之前就可以使用新的 API。
minSdkVersion:這個就是程序運行的最低的要求的Sdk,就是給說如果我設(shè)置的minSdkVersion是15的話那么如果你系統(tǒng)低于這個SdkVersion是安裝不上的。還有一個好處就是。例如你設(shè)置miniSdk是3.0的話,你寫的方法只有在4.0后才有的方法,這個時候就會提示你在3.0的時候是沒有這個方法的。
總的來說,我們項目中設(shè)置這三個屬性的值的時候要這樣來設(shè)置:minSdkVersion<=targetSdkVersion<=compileSdkVersion
2)buildToolsVersion和sdkVesion之間的關(guān)系。
android構(gòu)建工具的版本,在SDK Manager中安裝選擇版本,buildToolsVersion的版本需要>=CompileSdkVersion; 高版本的build-tools 可以構(gòu)建低版本編譯的android程序;
3)manifestPlaceholders配置是干嘛的?配置了有什么好處?
manifestPlaceholders 可以替換androidmanifest文件中的標(biāo)簽,可作為快速渠道打包/多渠道打包(結(jié)合productFlavors)替換渠道名的一種方式,也可以自定義標(biāo)簽用來替換需要的文本,多作為不同環(huán)境不同key的修改。
那在這里配置相比于在注冊文件中配置有什么優(yōu)勢呢?可能你已經(jīng)注意到了在上面的demo gradle文件中我們配置了debug與release的key,這在注冊文件中是做不到的。點開的源碼它接受的參數(shù)是一個map:
public void setManifestPlaceholders(Map<String, Object> manifestPlaceholders) {
this.mManifestPlaceholders.clear();
this.mManifestPlaceholders.putAll(manifestPlaceholders);
}
4)buildTypes中關(guān)于文件混淆設(shè)置。
詳細(xì)請參考我的另外一篇文章:文件混淆
5)dependencies{}中的“implementation”
在android studio 3.0之前引入庫的時候你可以這樣寫:
compile 'com.android.support:appcompat-v7:28.0.0'
在3.0之后增加了implementation,它們的作用相同都是引入庫,區(qū)別在于如果模塊之間有依賴關(guān)系的話,compile引入的庫在模塊之間是可以使用的,而implementation引入的庫只能在當(dāng)前模塊中使用。例如,項目中有一個common module,如果Amodule依賴于common,那么common mudule中的依賴可以用“compile”,這樣A模塊中就可以直接引用這些依賴了。
4、Settings gradle文件:
Setting文件主要是為了引入子項目(Module)
include ':demo1app', ':demo2app'
Android Studio可以在一個工程(project)下管理多個module,一個project下只會有一個settings文件,其他的module需要在settings.gradle文件中引入。
5、gradle-wrapper.properties文件:
gradle-warpper.properties主要用來制定當(dāng)前使用的gradle版本從哪里獲取。以及一些其他的參數(shù)。
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
6、gradle.properties文件:
這個文件可用來配置全局鍵值對數(shù)據(jù)的,你在這個文件中設(shè)置的key值,可以直接在build.gradle文件中直接訪問到。
下面是一般項目中可能會配置的信息:
# 指定守護(hù)進(jìn)程的JVM參數(shù)
org.gradle.jvmargs=-Xmx1536m
# 設(shè)置代理
systemProp.http.proxyHost=10.116.x.xx
systemProp.http.proxyPort=80
systemProp.https.proxyHost=10.116.x.xx
systemProp.https.proxyPort=80
jvmargs:指定守護(hù)進(jìn)程的JVM參數(shù),這個設(shè)置對于調(diào)整內(nèi)存設(shè)置特別有用,可以用來加快gradle的編譯。
下面的是配置項目代理信息,一般在公司開發(fā)項目的時候,公司的網(wǎng)絡(luò)都需要通過代理上網(wǎng),那么你項目中就需要設(shè)置網(wǎng)絡(luò)的代理信息。
7、local.properties文件:
文件在Android Studio中是用來配置SDK目錄的,也可以在文件中配置一些本地化的變量。這個文件不會被提交到版本控制中。
如果你想上傳你的項目到github上,但是又怕一些隱私配置(比如打包信息)被泄露,你可以把隱私信息配置到local.properties文件中,然后在build.gradle文件中設(shè)置這些配置,如下:
sdk.dir=/Users/weicz/Library/Android/sdk
#配置keystore文件參數(shù)
KEY_ALIAS = demo
KEY_PASSWORD = thisiskeypassword
STORE_PASSWORD = thisiskeystorepassword
STORE_FILE_PATH = yourstorefilepath
然后在你的build.gradle文件中你可以這樣使用:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
storeFile file(properties.getProperties('STORE_FILE_PATH'))
storePassword file(properties.getProperties('STORE_PASSWORD'))
keyAlias file(properties.getProperties('KEY_ALIAS'))
keyPassword file(properties.getProperties('KEY_PASSWORD'))
}
}
文章參考:
Android Studio之maven Central,JCenter
compileSdkVersion,minSdkVersion,targetSdkVersion 的區(qū)別和比較
Android Gradle manifestPlaceholders 的妙用
