總結(jié)一下gradle在項(xiàng)目中的一些使用技巧
-
全局的配置信息
在project目錄下創(chuàng)建一個(gè)config.gradle
文件,將每個(gè)module相同的配置信息都可以在此文件中設(shè)置全局變量,例如:ext{ // gradle的全局屬性必須放在ext閉包中 android = [ compileSdkVersion: 25, buildToolsVersion: "26.0.0", minSdkVersion : 15, targetSdkVersion : 25, versionCode : 1, versionName : "1.0" ] dependencies = [ appcompatV7 : 'com.android.support:appcompat-v7:25.+', constraintLayout : 'com.android.support.constraint:constraint-layout:1.0.2', junit : 'junit:junit:4.12' ] }
然后需要在project目錄下的build.gradle
中通過apply from: 'config.gradle'
引入全局屬性文件config.gradle
。
在module中的build.gradle
調(diào)用如下:
dependencies {
compile rootProject.ext.dependencies.appcompatV7
compile rootProject.ext.dependencies.constraintLayout
testCompile rootProject.ext.dependencies.junit
}
-
調(diào)用
gradle.properties
文件中變量
類似簽名信息不應(yīng)該直接暴露在build.gradle
文件中,將它保存在gradle.properties
文件中是一種不錯(cuò)的做法。在gradle.properties
中添加:STORE_FILE = /xx/app_key.jks // 這邊不能打引號(hào) STORE_PWD = xxx KEY_ALIAS = xxx KEY_PWD = xxx
在module中的build.gradle
調(diào)用如下:
signingConfigs {
release {
storeFile file(STORE_FILE)
storePassword STORE_PWD
keyAlias KEY_ALIAS
keyPassword KEY_PWD
}
}
還可以將gradle.properties
文件設(shè)置的變量供java
文件以及`xml``文件調(diào)用却邓,比如:
buildTypes {
release {
minifyEnabled true
shrinkResources true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往release版本中BuildConfig里面設(shè)置值
resValue("string", "KEY_PWD", "${KEY_PWD}") // 往release版本資源文件中設(shè)置值
}
debug {
buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往debug版本BuildConfig里面設(shè)置值
resValue("string", "KEY_PWD", "${KEY_PWD}") // 往debug版本資源文件中設(shè)置值
}
}
// 然后就可以在java代碼中,通過BuildConfig.XXX進(jìn)行調(diào)用;在layout_xml中直接可以通過android:text="@string/KEY_PWD"進(jìn)行調(diào)用
// 其中院水,buildConfigField定義的方式是
// buildConfigField 類型腊徙,變量名,值
// resValue定義的方式是
// resValue XML中的類型檬某,變量名撬腾,值
// 對(duì)于類型的設(shè)置,buildConfigField必須跟java代碼中是相同的恢恼,比如String 就不能寫成string民傻,因?yàn)槭荢tring 類型,值需要打上雙引號(hào);同樣resValue也需要對(duì)應(yīng)
實(shí)際開發(fā)中厅瞎,debug版本和release版本的接口地址是不同饰潜,通過這種方式去設(shè)置,就不需要在每次打不同版本包的時(shí)候去注釋代碼了和簸。
-
調(diào)用
local.properties
文件中變量
local.properties
文件中一般存儲(chǔ)著本地的sdk彭雾、ndk的路徑信息,當(dāng)然在此文件中同樣可以配置變量锁保,比如簽名信息薯酝,只不過這是本地的半沽,一般不用push到遠(yuǎn)程倉庫中。
在local.properties
文件中添加變量跟gradle.properties
沒區(qū)別吴菠,區(qū)別在于讀日咛睢:Properties properties = new Properties(); properties.load(new FileInputStream(file("../local.properties"))) // 需要顯示指明文件路徑 // 并且當(dāng)前路徑是在app目錄下,所以獲取project目錄下的`local.properties`做葵,應(yīng)該是../local.properties buildTypes { debug { buildConfigField("String", "URL", "\"${properties['URL']}\"") resValue("string", "url", "${properties['URL']}") } }
其實(shí)也可以自定義
properties
文件占哟,訪問形式跟訪問local.properties
相同,只需要更改文件路徑就好酿矢。 -
替換AndroidManifest中的占位符
可以在AndroidManifest文件中設(shè)置一個(gè)占位符榨乎,類似${app_label}
<application android:name=".AppApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="${app_label}" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
然后在module下的build.gradle
文件中進(jìn)行設(shè)置,可以設(shè)置在defaultConfig閉包中瘫筐,也可以設(shè)置在buildTypes下不同版本的閉包中蜜暑,設(shè)置在不同版本的閉包中,那么就可以實(shí)現(xiàn)為不同版本的app設(shè)置不同的名稱了策肝,app log 同樣可以通過此種方式來進(jìn)行配置:
// defaultConfig中設(shè)置
defaultConfig {
// ... 省略其他配置
manifestPlaceholders = [app_label:"@string/app_name"]
}
// buildTypes中設(shè)置
buildTypes {
release {
// ... 省略其他配置
manifestPlaceholders = [app_label:"@string/app_name_release"]
}
debug {
// ... 省略其他配置
manifestPlaceholders = [app_label:"@string/app_name_debug"]
}
}
除了可以給不同版本app設(shè)置不同名稱已經(jīng)圖片之外肛捍,還有一種重要的用法就是打渠道包。
android {
productFlavors {
dev{
manifestPlaceholders = [channel:"dev"]
}
official{
manifestPlaceholders = [channel:"official"]
}
// ... ...
wandoujia{
manifestPlaceholders = [channel:"wandoujia"]
}
xiaomi{
manifestPlaceholders = [channel:"xiaomi"]
}
"360"{ // flavor名如果是數(shù)字開頭之众,必須用引號(hào)引起來拙毫。
manifestPlaceholders = [channel:"360"]
}
}
-
自定義導(dǎo)出apk名稱
android { applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File( output.outputFile.parent + "/${variant.buildType.name}", "xx-${variant.buildType.name}-${variant.versionName}-${variant.productFlavors[0].name}.apk".toLowerCase()) } } }