Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,目前也增長了基於Kotlin語言的kotlin-based DSL,拋棄了基於XML的各類繁瑣配置,面向Java應用爲主。當前其支持的語言限於Java、Groovy、Kotlin和Scala,計劃將來將支持更多的語言。 AndroidStudio使用Gradle做爲基礎的構建工具,因此咱們須要對Gradle作進一步的瞭解,這就提到了Groovy語言。javascript
Groovy是一種基於JVM(Java虛擬機)的敏捷開發語言,它結合了Python、Ruby和Smalltalk的許多強大的特性,Groovy 代碼可以與 Java 代碼很好地結合,也能用於擴展示有代碼。因爲其運行在JVM上的特性,Groovy也可使用其餘非Java語言編寫的庫。Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既能夠用於面向對象編程,又能夠用做純粹的腳本語言。使用該種語言沒必要編寫過多的代碼,同時又具備閉包和動態語言中的其餘特性。java
在項目中,有可能出現多個module的狀況,不少moudle都擁有相同的依賴,好比V7包,若是想作V7包版本的變更,極可能形成版本的不兼容。因此對依賴進行統一的管理對於有多個moudle的狀況很是方便。 那麼如何進行統一管理呢?android
在主項目根目錄下創建 config.gradlegit
編寫以下代碼,對須要用到的版本號和庫進行聲明。github
ext {
android = [
minSdkVersion : 16,
compileSdkVersion: 26,
targetSdkVersion : 26,
buildToolsVersion: "26.0.2",
supportVersion : "26.1.0",
versionCode : 1,
versionName : "1.0",
resConfigs : "zh"
]
plug = [
mainVersion : 1,
mainVersionName : '1.0.0',
libBaseVersion : 1,
libBaseVersionName : '1.0.0',
libStyleVersion : 1,
libStyleVersionName: '1.0.0',
libUtilVersion : 1,
libUtilVersionName : '1.0.0'
]
def supportVersion = "26.1.0"
def constraintSupportVersion = "1.1.3"
def cardViewVersion = '25.3.0'
dependencies = [
// Android support library
SupportDesign : "com.android.support:design:$supportVersion",
SupportAppcompatV7 : "com.android.support:appcompat-v7:$supportVersion",
SupportConstraint : "com.android.support.constraint:constraint-layout:$constraintSupportVersion",
CardView : "com.android.support:cardview-v7:$cardViewVersion",
]
}
複製代碼
打開項目的build.gradle,在其最上方添加代碼編程
apply from: "config.gradle
複製代碼
對版本號作統一管理:微信
//實例化統一版本管理器
def app = rootProject.ext.android
compileSdkVersion app.compileSdkVersion
efaultConfig {
applicationId "com.tianzi.chuji"
minSdkVersion app.minSdkVersion
targetSdkVersion app.targetSdkVersion
versionCode app.versionCode
versionName app.versionName
multiDexEnabled true
ndk {}
}
複製代碼
對第三方庫作統一管理:閉包
dependencies {
def app = rootProject.ext.dependencies compile fileTree(dir: 'libs', include: ['*.jar']) compile app.SupportAppcompatV7 compile app.SupportDesign compile app.CardView compile app.Gson compile app.Okttp compile app.OkHttpLoggingInterceptor compile app.Retrofit compile app.RetrofitConverterGson compile app.RetrofitAdapterRxJava compile app.RxJava compile app.RxAndroid compile app.EventBus compile app.SmartRefreshLayout compile app.SmartRefreshHeader compile app.AndroidAnnotations compile app.RxKit compile app.RxUi } 複製代碼
咱們在打包apk時,會有一些項目配置,好比是否混淆、是否壓縮、是否消除冗餘資源引用。若是都都寫在gradle中是難以管理的,最好進行統一的管理。app
在打包的moudle根目錄下創建gradle-build.properties文件。編程語言
#是否發佈
deliver=true
#發佈位置
appReleaseDir=C:/Users/xxhdp/Desktop/release/release
#簽名信息
keyAlias=xxxxxx
keyPassword=xxxxxx
storeFile=xxxxxx
storePassword=xxxxxx
#打包配置
############################## release ###################
#Log開關 上線版本設置爲「false」
release_LOG_DEBUG=true
#上線版本設置爲「false」
release_isDev=false
release_versionNameSuffix="-release"
#是否混淆
release_minifyEnabled=false
#是否資源優化
release_zipAlignEnabled=true
#是否刪除無效資源
release_shrinkResources=false
############################## debug ######################
#Log開關 上線版本設置爲「false」
debug_LOG_DEBUG=true
#是不是線下版本 上線版本設置爲「false」
debug_isDev=true
debug_versionNameSuffix="-debug"
#是否混淆
debug_minifyEnabled=false
#是否資源優化
debug_zipAlignEnabled=true
#是否刪除無效資源
debug_shrinkResources=false
複製代碼
使用Groovy語法定義兩個變量,其實只須要一個就夠了,我這裏本身增長了一條打包路徑
ext.buildProperty = null
ext.appReleaseDir = ''
def loadProperties() {
def proFile = file("gradle-build.properties")
Properties p = new Properties()
proFile.withInputStream { stream ->
p.load(stream)
}
buildProperty = p
appReleaseDir = p.appReleaseDir
}
loadProperties()//調用方法
複製代碼
signingConfigs {
debug {
keyAlias buildProperty.keyAlias
keyPassword buildProperty.keyPassword storeFile file(buildProperty.storeFile) storePassword buildProperty.storePassword } release {
keyAlias buildProperty.keyAlias
keyPassword buildProperty.keyPassword storeFile file(buildProperty.storeFile) storePassword buildProperty.storePassword } } 複製代碼
buildTypes {
debug {
buildConfigField "boolean", "LOG_DEBUG", buildProperty.debug_LOG_DEBUG
buildConfigField "boolean", "isDev", buildProperty.debug_isDev
buildConfigField "String", "versionNameSuffix", buildProperty.debug_versionNameSuffix
minifyEnabled Boolean.parseBoolean(buildProperty.debug_minifyEnabled)
zipAlignEnabled Boolean.parseBoolean(buildProperty.debug_zipAlignEnabled)
shrinkResources Boolean.parseBoolean(buildProperty.debug_shrinkResources)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug } release {
buildConfigField "boolean", "LOG_DEBUG", buildProperty.release_LOG_DEBUG
buildConfigField "boolean", "isDev", buildProperty.release_isDev
buildConfigField "String", "versionNameSuffix", buildProperty.release_versionNameSuffix
minifyEnabled Boolean.parseBoolean(buildProperty.release_minifyEnabled)
zipAlignEnabled Boolean.parseBoolean(buildProperty.release_zipAlignEnabled)
shrinkResources Boolean.parseBoolean(buildProperty.release_shrinkResources)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "ChuJi_v${app.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
if (Boolean.parseBoolean(buildProperty.deliver)) {//是否正式發佈,須要配置發佈版打包位置
output.outputFile = new File(appReleaseDir + '/' + releaseTime(), fileName)
}
}
}
}
}
}
複製代碼
只須要在productFlavors裏面添加須要的渠道名便可
productFlavors {//配置渠道包或者版本包
'ChuJi' {
}
'BaiDu' {
}
}
productFlavors.all { flavors ->
flavors.manifestPlaceholders = [channelValue: name]
}
複製代碼
在buildTypes中有這段代碼,在打開release模式的狀況下,會按照以下方式在gradle-build.properties聲明的位置生成fileName格式的apk包。
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "ChuJi_v${app.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
if (Boolean.parseBoolean(buildProperty.deliver)) {//是否正式發佈,須要配置發佈版打包位置
output.outputFile = new File(appReleaseDir + '/' + releaseTime(), fileName)
}
}
}
}
複製代碼
經過gradle方式進行打包,點擊項目右側gradle標籤,展開項目下須要打包的moudle,點擊Task展開列表,再展開build列表。點擊assembleRelease便可打包。打包成功後經過樂固進行apk加固。
長路漫漫,菜不是原罪,墮落纔是原罪。
個人CSDN:blog.csdn.net/wuyangyang_…
個人簡書:www.jianshu.com/u/20c2f2c35…
個人掘金:juejin.im/user/58009b…
個人GitHub:github.com/wuyang2000
我的網站:www.xiyangkeji.cn
我的app(茜茜)蒲公英鏈接:www.pgyer.com/KMdT
個人微信公衆號:茜洋 (按期推送優質技術文章,歡迎關注)
Android技術交流羣:691174792
以上文章都可轉載,轉載請註明原創。