設(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ǔ)法