gradle構(gòu)建工具讓工程有了無限可能和組合惊畏。
gradle核心是基于groovy腳本語言,groovy腳本基于java且擴(kuò)展了java。因此gradle需要依賴JDK和Groovy庫。
和ant涂炎、maven構(gòu)建有區(qū)別,gradle是一種編程思想焰盗。
打印第一句:
println('hello gradle')
println 'hello gradle'
在Sync后會看到打印出來hello gradle.
配置整個(gè)項(xiàng)目用
在根目錄下璧尸,建立一個(gè)config.gradle文件咒林。
//同時(shí)添加多個(gè)自定義屬性熬拒,可以通過ext代碼塊
ext{
username = "hujun"
}
然后在項(xiàng)目的build.gradle里引入該配置文件:
//根目錄下的build.gradle最上面,加入自定義的gradle文件
//相當(dāng)于layout布局中加入include語法
apply from:'config.gradle'
在所有的gradle里就可以調(diào)用config.gradle里的自定義屬性了垫竞。
//groovy是弱類型語言澎粟,可以將變量賦值其他類型
rootProject.ext.username = 123
//可以直接寫屬性名,也可以用rootProject來獲取屬性名
println "${username}"
println "${rootProject.ext.username}"
除了定義屬性欢瞪,還可以定義map活烙。
appId = [
app : "com.hujun.androidmodulize",
module: "com.hujun.androidmodulize.module"
]
//建立Map存儲,對象名遣鼓、key都可以自定義
androidId = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
minSdkVersion : 21,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
//生成環(huán)境啸盏、開發(fā)環(huán)境需要不同屬性
url = [
"debug" : "https://www.baidu.com",
"release": "https://www.google.com"
]
//統(tǒng)一依賴庫
supportLibrary = '1.1.0'
//第三方庫
support = [
"appcompat" : "androidx.appcompat:appcompat:${supportLibrary}",
"constraintlayout": "androidx.constraintlayout:constraintlayout:1.1.3"
]
map的使用
//賦值與引用
def androidId=rootProject.ext.androidId
def appId=rootProject.ext.appId
def support=rootProject.ext.support
dependencies {
//依賴的簡寫
implementation 'androidx.appcompat:appcompat:1.1.0'
//依賴的完整寫法
// implementation group:'androidx.appcompat',name:'appcompat',version:'1.1.0'
implementation support.appcompat
implementation support.constraintlayout
}
最簡化的一次性引用整個(gè)map的方法:
dependencies {
//遍歷整個(gè)map,引入依賴
support.each{k,v -> implementation v}
}
完整的build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//賦值與引用
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
def testSupport = rootProject.ext.testSupport
def androidTestSupport = rootProject.ext.androidTestSupport
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
applicationId appId.app
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
support.each { k, v -> implementation v }
testSupport.each { k, v -> testImplementation v }
androidTestSupport.each { k, v -> androidTestImplementation v }
}
BuildConfig的使用
在項(xiàng)目build之后骑祟,會自動生成一個(gè)BuildConfig類回懦,其中放了一些靜態(tài)全局變量气笙。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.hujun.androidmodulize";
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";
}
如何在其中添加我們自定義的變量呢?
在build.gradle中添加即可:
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
}
}
其中url是我們在config.gradle中定義的map怯晕。
由此潜圃,當(dāng)我們可以在項(xiàng)目中引用BuildConfig.url,這個(gè)變量會根據(jù)是debug還是release工程來自動取值舟茶。
gradle常見配置
在defaultConfig中的配置
//開啟分包
multiDexEnabled true
//設(shè)置分包配置谭期,在熱修復(fù)中使用過
multiDexKeepFile file('multidex-config.txt')
//將svg圖片生成指定維度的png圖片
vectorDrawables.generatedDensities('xhdpi','xxhdpi')
//使用support-v7兼容(5.0版本以上)
vectorDrawables.useSupportLibrary = true
//只保留指定和默認(rèn)資源
resConfig('zh-rCN')
//配置so庫的CPU架構(gòu)
ndk{
abiFilters('armeabi-v7a')
}
//源集,設(shè)置源集的屬性吧凉,更改源集的各種目錄位置
sourceSets{
main{
if (!isRelease){
//如果是組件化模式隧出,需要單獨(dú)運(yùn)行時(shí)
manifest.srcFile 'src/main/AndroidManifest.xml'
}else{
//集成模式,整個(gè)項(xiàng)目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
//構(gòu)建簽名信息
signingConfigs{
release{
//簽名證書文件位置
storeFile file("/Users/junhu/git/AndroidModulize/key")
//簽名證書的類型
storeType "hujun"
//簽名證書的密碼
storePassword "123123"
//簽名證書中密鑰別名
keyAlias "key0"
//簽名證書中該密鑰的密碼
keyPassword "123123"
//是否開啟V2打包
v2SigningEnabled true
}
}
配置偶估計(jì)參數(shù)buildTypes
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
signingConfig signingConfigs.release
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
完整的build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
println("$username")
//賦值與引用
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
//def url = rootProject.ext.url
def testSupport = rootProject.ext.testSupport
def androidTestSupport = rootProject.ext.androidTestSupport
def isRelease = rootProject.ext.isRelease
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
applicationId appId.app
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//開啟分包
multiDexEnabled true
//設(shè)置分包配置阀捅,在熱修復(fù)中使用過
multiDexKeepFile file('multidex-config.txt')
//將svg圖片生成指定維度的png圖片
vectorDrawables.generatedDensities('xhdpi','xxhdpi')
//使用support-v7兼容(5.0版本以上)
vectorDrawables.useSupportLibrary = true
//只保留指定和默認(rèn)資源
resConfig('zh-rCN')
//配置so庫的CPU架構(gòu)
ndk{
abiFilters('armeabi-v7a')
}
//源集鸳劳,設(shè)置源集的屬性,更改源集的各種目錄位置
sourceSets{
main{
if (!isRelease){
//如果是組件化模式也搓,需要單獨(dú)運(yùn)行時(shí)
manifest.srcFile 'src/main/AndroidManifest.xml'
}else{
//集成模式赏廓,整個(gè)項(xiàng)目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
//構(gòu)建簽名信息
signingConfigs{
release{
//簽名證書文件位置
storeFile file("/Users/junhu/git/AndroidModulize/key")
//簽名證書的類型
storeType "hujun"
//簽名證書的密碼
storePassword "123123"
//簽名證書中密鑰別名
keyAlias "key0"
//簽名證書中該密鑰的密碼
keyPassword "123123"
//是否開啟V2打包
v2SigningEnabled true
}
}
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
signingConfig signingConfigs.release
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
support.each { k, v -> implementation v }
testSupport.each { k, v -> testImplementation v }
androidTestSupport.each { k, v -> androidTestImplementation v }
}
其他配置
在android{}里面有一些其他不常用的配置。
//adbOptions可以對adb操作添加配置
adbOptions{
//配置操作超時(shí)時(shí)間
timeOutInMs = 5 * 1000
//adb install 命令的選項(xiàng)配置
installOptions '-r','-s'
}
//對dx操作的配置傍妒,接受一個(gè)DexOptions類型的閉包幔摸,配置由DexOptions提供
dexOptions{
//配置執(zhí)行dx命令時(shí)為其分配的最大堆內(nèi)存
javaMaxHeapSize "4g"
//配置是否預(yù)執(zhí)行dex Libraries工程,開啟后悔提高增量構(gòu)建速度颤练,不過會影響clean構(gòu)建速度既忆,默認(rèn)true
preDexLibraries = false
//配置是否開啟jumbo模式,代碼方法數(shù)超過65535時(shí)嗦玖,需要強(qiáng)制開啟才能構(gòu)建成功
jumboMode true
//配置gradle 運(yùn)行dx命令時(shí)使用的線程數(shù)量
threadCount 8
//配置multidex參數(shù)
additionalParameters=[
'--multi-dex',//多dex分包
'--set-max-idx-number=50000',//每個(gè)包內(nèi)方法數(shù)上限
'--minimal-main-dex'
]
}
//執(zhí)行g(shù)radle lint命令即可運(yùn)行l(wèi)int檢查患雇,默認(rèn)生成的報(bào)告在outputs/lint-results.html中
lintOptions{
//遇到lint檢查錯(cuò)誤會終止構(gòu)建,默認(rèn)為false
abortOnError false
//將警告當(dāng)做錯(cuò)誤來處理
warningsAsErrors false
//檢查新API
check 'NewApi'
}