Android Studio Gradle進(jìn)階配置

設(shè)置 Java 版本

在根目錄下的build.gradle文件下添加 ext{ .... } 中的內(nèi)容:

ext{
kotlin_version = '1.1.51'
rxandroid = '2.0.1'
anko_version = '0.8.2'
support_version = '26.1.0'
target_sdk_version = 26
compile_sdk_version = 26
min_sdk_version = 15
}

使用規(guī)則源譬,字符串需使用“$rootProject.”,整形直接用rootProject.孕似。ext可加可不加

android {
compileSdkVersion rootProject.compile_sdk_version
defaultConfig {
applicationId "com.xxx.xxxx"
minSdkVersion rootProject.ext.min_sdk_version
targetSdkVersion rootProject.ext.target_sdk_version
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$rootProject.ext.kotlin_version"
implementation "com.android.support:appcompat-v7:$rootProject.support_version"
implementation "io.reactivex.rxjava2:rxandroid:$rootProject.rxandroid"
compile "org.jetbrains.anko:anko-common:$rootProject.anko_version"
compile "com.android.support:recyclerview-v7:$rootProject.support_version"
}

參考:http://www.reibang.com/p/abb5bbb99142

全局設(shè)定編碼

allprojects {
repositories {
jcenter()
}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
}

定義全局變量

先在 project 根目錄下的 build.gradle 定義全局變量:

ext {
minSdkVersion = 16
targetSdkVersion = 24
}

然后在各 module 的 build.gradle 中可以通過rootProject.ext來(lái)引用:

android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
}

定義局部變量

有時(shí)候一個(gè)庫(kù)會(huì)被引用多次踩娘,或者一個(gè)庫(kù)有多個(gè)依賴,但這些依賴的版本都是統(tǒng)一的喉祭。我們通過ext來(lái)定義一些變量养渴,這樣在用到的時(shí)候就可以統(tǒng)一使用了。

ext {
leakcanaryVersion = '1.3.1'
scalpelVersion = "1.1.2" // other param
}

debugCompile "com.squareup.leakcanary:leakcanary-android:$leakcanaryVersion"
releaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanaryVersion"

exlude關(guān)鍵字

我們經(jīng)常會(huì)遇到庫(kù)沖突的問題泛烙,這個(gè)在多個(gè)部門協(xié)作的大公司會(huì)更常見到厚脉。將沖突的庫(kù)通過exclude來(lái)做剔除是一個(gè)好方法。
1.剔除整個(gè)組織的庫(kù)

compile ('com.facebook.fresco:animated-webp:0.13.0') {
exclude group: 'com.android.support' // 僅僅寫組織名稱
}

2.剔除某個(gè)庫(kù)

compile('com.android.support:appcompat-v7:23.2.0') {
exclude group: 'com.android.support', module: 'support-annotations' // 寫全稱
exclude group: 'com.android.support', module: 'support-compat'
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'support-vector-drawable'
}

引用本地aar

1.把a(bǔ)ar文件放在某目錄內(nèi)胶惰,比如就放在某個(gè) module 的 libs 目錄內(nèi)
2.在這個(gè) module 的 build.gradle 文件中添加:

repositories {
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}

3.之后在其他項(xiàng)目中添加下面的代碼后就引用了該 aar

dependencies {
compile(name:'aar的名字(不用加后綴)', ext:'aar')
}

如果你希望把 aar 放在項(xiàng)目的根目錄中傻工,也可以參考上面的配置方案。在根目錄的build.gradle中寫上:

allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}

依賴項(xiàng)目中的 module 和 jar

依賴項(xiàng)目中的 module 和 jar

dependencies {
compile project(':mylibraryModule')
compile files('libs/sdk-1.1.jar')
}

配置獨(dú)立的簽名信息

通常我們可以直接把簽名的明文信息寫在 gradle 配置文件中孵滞,但是在開源代碼的時(shí)候不是很方便中捆,前者可能存放簽名文件的位置需要修改,后者則希望隱藏簽名信息坊饶,在看不少開源項(xiàng)目的時(shí)候泄伪,發(fā)現(xiàn)很多是這樣做的 signingConfigs 位置, android 的下一級(jí)

signingConfigs {
release_key{
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release_key
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release_key
}
}

在對(duì)應(yīng)位置引用常量匿级,在 properties 中再進(jìn)行具體賦值蟋滴,這樣不會(huì)直接暴露簽名信息,也方便配置
在 gradle.properties 中

RELEASE_KEY_PASSWORD=xxxx
RELEASE_KEY_ALIAS=xxx
RELEASE_STORE_PASSWORD=xxx
RELEASE_STORE_FILE=../.keystore/xxx.jks

多渠道打包

在 product flavor 下定義不同類型, 把 AndroiManifest 中的 channel 替換
ductFlavors 位置: android 的下一級(jí)

android {
productFlavors {
fir {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fir"]
}
GooglePlay {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"]
}
Umeng {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Umeng"]
}
}
}

替換 AndroiManifest 中的字段

<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>

減少編譯錯(cuò)誤和忽略 lint 檢查

packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
}
lintOptions {
abortOnError false
}

生成自定義 App 名稱,在Android標(biāo)簽添加如下代碼

applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 輸出apk名稱為ForWatch_v1.1(2)2016-09-28_15-54-35.apk
def version = "v${versionName}-${versionCode}"
def endIndex = outputFile.name.indexOf('.apk')
def apkName = outputFile.name.substring(0, endIndex);
def fileName = "${apkName}
${version}${buildTime()}${revision()}.apk"
//output.outputFile = new File(outputFile.parent, fileName)
outputFileName = fileName
}
}
}

自定義apk的生成目錄(含有自定義app名稱的代碼)

android {
……//省略部分代碼
applicationVariants.all {
//判斷是release還是debug版本
def buildType = it.buildType.name
def fileName
//下面的channel是獲取渠道號(hào)痘绎,你獲取渠道號(hào)不一定會(huì)和我的代碼一樣津函,因?yàn)橛锌赡苣愕那烂Q的規(guī)則和我的不一樣,我的規(guī)則是${渠道名}-${applicationId},所以我是這樣取的孤页。
def channel = it.productFlavors[0].name.split("-")[0]
//獲取當(dāng)前時(shí)間的"YYYY-MM-dd"格式尔苦。
def createTime = new Date().format("YYYY-MM-dd", TimeZone.getTimeZone("GMT+08:00"))
//只對(duì)Release包起作用,如果不是Release包則不變更輸出路徑,否則可能導(dǎo)致AS無(wú)法自動(dòng)安裝debug包允坚。
if (buildType == "release") {
it.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/apks/${it.productFlavors[0].applicationId}/${createTime}")
}
it.outputs.each {
//只對(duì)Release包起作用魂那,如果不是Release包則不變更名稱。
if (buildType == "release") {
//我此處的命名規(guī)則是:渠道名項(xiàng)目名版本名創(chuàng)建時(shí)間構(gòu)建類型.apk
fileName = "${channel}_項(xiàng)目名稱v${defaultConfig.versionName}${createTime}-${buildType}.apk"
//將名字打印出來(lái)稠项,以便及時(shí)查看是否滿意涯雅。
println "文件名:-----------------${fileName}"
//重新對(duì)apk命名。(適用于Gradle4.0以下版本)
//it.outputFile = new File(it.outputFile.parent, fileName)
//重新對(duì)apk命名展运。(適用于Gradle4.0(含)以上版本)如果你Gradle版本是4.0以下版本則將上面的一行代碼放開并注釋下面的這一行活逆。
it.outputFileName = fileName
}
}
}
……//省略部分代碼
}

參考:https://blog.csdn.net/kelin410/article/details/75500821

指定資源目錄

自定義 java 代碼和 res 資源的目錄,更加靈活

android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
if (!IS_USE_DATABINDING) { // 如果用了databinding
jniLibs.srcDirs = ['libs']
res.srcDirs = ['res', 'res-vm'] // 多加了databinding的資源目錄
} else {
res.srcDirs = ['res']
}
}
test {
java.srcDirs = ['test']
}
androidTest {
java.srcDirs = ['androidTest']
}
}
}

在 BuildConfig.class 中增加靜態(tài)變量

有時(shí)候我們想根據(jù)不同的版本乐疆,設(shè)置相同變量不同的值划乖,最常見的使用場(chǎng)景就是 Log 工具類贬养,通過設(shè)置 isDubug 不同值挤土,只有 debug 版本的 app 會(huì)產(chǎn)生 log 日志,設(shè)置過程如下:

buildTypes {
release {
buildConfigField("boolean", "isDebug", "false") // 定義 isdubug 的值
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
buildConfigField("boolean", "isDebug", "true")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

在 sync 后BuildConfig中就有你定義的這個(gè)變量(isDebug)误算。

public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.hiwhitley.himei";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final boolean isDebug = true;
}

如果有帶引號(hào)的 string仰美,要記得轉(zhuǎn)義:

buildConfigField "String", "URL_ENDPOINT", ""http://your.development.endpoint.com/""

參考:

Gradle配置最佳實(shí)踐
Android Studio 中 gradle 的一些玩法
Gradle 語(yǔ)法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市儿礼,隨后出現(xiàn)的幾起案子咖杂,更是在濱河造成了極大的恐慌,老刑警劉巖蚊夫,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诉字,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡知纷,警方通過查閱死者的電腦和手機(jī)壤圃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琅轧,“玉大人伍绳,你說(shuō)我怎么就攤上這事≌Ч穑” “怎么了冲杀?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睹酌。 經(jīng)常有香客問我权谁,道長(zhǎng),這世上最難降的妖魔是什么憋沿? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任闯传,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甥绿。我一直安慰自己字币,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布共缕。 她就那樣靜靜地躺著洗出,像睡著了一般。 火紅的嫁衣襯著肌膚如雪图谷。 梳的紋絲不亂的頭發(fā)上翩活,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音便贵,去河邊找鬼菠镇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛承璃,可吹牛的內(nèi)容都是我干的利耍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼盔粹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隘梨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舷嗡,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴猎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后进萄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捻脖,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年中鼠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了可婶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兜蠕,死狀恐怖扰肌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熊杨,我是刑警寧澤曙旭,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站晶府,受9級(jí)特大地震影響桂躏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜川陆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一剂习、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦鳞绕、人聲如沸失仁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萄焦。三九已至,卻和暖如春冤竹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹦蠕。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工冒签, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萧恕。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓廊鸥,卻偏偏與公主長(zhǎng)得像磨德,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子典挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Gradle配置最佳實(shí)踐 本文會(huì)不定期更新您觉,推薦watch下項(xiàng)目拙寡。如果喜歡請(qǐng)star,如果覺得有紕漏請(qǐng)?zhí)峤籭ssu...
    Solang閱讀 1,629評(píng)論 0 4
  • 說(shuō)明 本文主要介紹和Gradle關(guān)系密切琳水、相對(duì)不容易理解的配置肆糕,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,597評(píng)論 1 62
  • 參考 中文官網(wǎng)構(gòu)建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,319評(píng)論 0 16
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評(píng)論 25 707
  • 最近中毒太深在孝,每天一拿手機(jī)就刷頭條诚啃,不是看新聞八卦,而是看各種小戶型裝修私沮,幾近瘋狂始赎。 控制不住腦袋里...
    滟昕閱讀 332評(píng)論 4 3