Eclipse轉Android studio最大的變化就是多了gradle的配置,那麼gradle是什麼?gradle有哪些優點呢?gradle又是如何使用的呢?
gradle是什麼?
官方介紹是:Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。當前其支持的語言限於Java、Groovy和Scala,計劃未來將支持更多的語言。
通過我的使用對gradle的概括就是:Gradle是一種構建工具,它可以幫你管理項目中的差異,依賴,編譯,打包,部署......,你可以定義滿足自己需要的構建邏輯,寫入到build.gradle中供日後開發使用.
gradle有哪些優點呢?
gradle的加入使as除了一些優化配置外,還有其他優點,例如分分鐘多渠道上線包;打發布包,給測試人員打測試包,以及分包,對開源庫文件的一鍵引入等。
gradle又是如何使用的呢?
1:默認配置
聲明是要使用服務框架
apply plugin: 'com.android.application'
依賴的框架,有的jcenter倉庫裏面的,有的可能是maven裏面的。
dependencies {
compile 'com.zzti.fengyongge:imagepicker:1.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.alibaba:fastjson:1.1.52.android'
}
repositories {
maven {
url "https://jitpack.io"
}}
解決方法數超過65k
multiDexEnabled true
MultiDex的一些相關配置,這樣配置可以讓你的編譯速度更快
dexOptions {
preDexLibraries = false
incremental true
//開啓incremental dexing,優化編譯效率,這個功能android studio默認是關閉的。
javaMaxHeapSize "4g" //增加java堆內存大小
}
2:buildTypes就是發佈類型,可以定義不同的發佈類型,例如正式,內側,公測,開發版本等,而且可以在內部定義不同版本的名稱、包名、甚至icon,其中發佈不同版本的簽名所需的別名、別名密碼、簽名文件地址和簽名密碼通過signingConfigs去配置,當然如果你感覺這樣不安全,可以將signingConfigs 常量放gradle.properties裏面,不提交到後臺。
signingConfigs {
release {
keyAlias 'gradle'
keyPassword '123456'
storeFile file('demo.debug.jks')
storePassword '123456'
}
debug {
keyAlias 'gradle'
keyPassword '123456'
storeFile file('demo.release.jks')
storePassword '123456'
}
}
buildTypes {
release {
manifestPlaceholders += [APP_NAME: 'release版']
manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo']
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
manifestPlaceholders += [APP_NAME: 'Bate版']
manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo.test']
applicationIdSuffix '.test'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
3:compileOptions對java版本的配置,以便使用java的新特性
compileOptions {
}
4:指定資源目錄,對資源文件可以進行分包處理
sourceSets {
main {
assets.srcDirs = ['assets'] //資源文件
jni.srcDirs 'src/main/jni' //jni文件
jniLibs.srcDir 'src/main/jniLibs' //jni庫
}
}
5:程序在buid的時候,會執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,我們可以將其關掉。
lintOptions {
abortOnError false
//即使報錯也不會停止打包
checkReleaseBuilds false
//打包release版本的時候進行檢測
}
6:多渠道打包,有時需要數據統計各平臺的使用情況,例如友盟統計,需要不同渠道的安裝包。
productFlavors {
yingyongbao{}
baidu {}
google {}
wandoujia {}
xiaomi {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_ID: flavor.name]
}
而且你可以設置多渠道包的名字,一般是版本名稱+版本號+日期+渠道名稱
applicationVariants.all { variant ->
variant.outputs.each { output ->
// 重命名產出的apk文件
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
if (variant.buildType.name == "release") {
fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
} else {
fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
}
output.outputFile = new File(outputDirectory, fileName)
}
}
}
最後上一個完整的 build. gradle 配置
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.zzti.fengyongge.gradledemo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
compileOptions {
}
sourceSets {
main {
assets.srcDirs = ['assets'] //資源文件
jni.srcDirs 'src/main/jni' //jni文件
jniLibs.srcDir 'src/main/jniLibs' //jni庫
}
}
lintOptions {
abortOnError false
//即使報錯也不會停止打包
checkReleaseBuilds false
//打包release版本的時候進行檢測
}
signingConfigs {
release {
keyAlias 'gradle'
keyPassword '123456'
storeFile file('demo.debug.jks')
storePassword '123456'
}
debug {
keyAlias 'gradle'
keyPassword '123456'
storeFile file('demo.release.jks')
storePassword '123456'
}
}
buildTypes {
release {
manifestPlaceholders += [APP_NAME: 'release版']
manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo']
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
manifestPlaceholders += [APP_NAME: 'Bate版']
manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo.test']
applicationIdSuffix '.test'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
productFlavors {
yingyongbao{}
baidu {}
google {}
wandoujia {}
xiaomi {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_ID: flavor.name]
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
// 重命名產出的apk文件
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
if (variant.buildType.name == "release") {
fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
} else {
fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
}
output.outputFile = new File(outputDirectory, fileName)
}
}
}
repositories {
maven {
url "https://jitpack.io"
}
}
dexOptions {
preDexLibraries = false //讓它不要對Lib做preDexing
incremental true //開啓incremental dexing,優化編譯效率,這個功能android studio默認是關閉的。
javaMaxHeapSize "4g" //增加java堆內存大小
}
}
def packageTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.alibaba:fastjson:1.1.52.android'
compile 'com.zzti.fengyongge:imagepicker:1.0'
testCompile 'junit:junit:4.12'
}
多渠道批量生成apk文件如圖所示:
多渠道打包截圖