自動(dòng)簽名
signingConfigs {
release {
storeFile file("release.keystore.jks")
storePassword "xxxxx"
keyAlias "xxxxxx"
keyPassword "xxxx"
}
debug {
storeFile file("debud.keystore.jks")
storePassword "xxxx"
keyAlias "xxxx"
keyPassword "xxxx"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
....
}
debug {
signingConfig signingConfigs.debug
....
}
}
版本號(hào)遞增
一般版本號(hào)都會(huì)用 **major.minor.patch
** 表示,例如 **1.0.0
** 這樣的形式。第一個(gè)數(shù)字major表示主版本號(hào),第二個(gè)數(shù)字minor表示副版本號(hào),第三個(gè)數(shù)字patch表示小版本號(hào)或者叫補(bǔ)丁號(hào)。
這里的遞增主要針對(duì)versionCode,主要方式有本地文件和根據(jù)版本倉庫的commit次數(shù);而versionName的規(guī)則可以根據(jù)實(shí)際情況自定義的,這里我主要使用了本地文件的方式來實(shí)現(xiàn)的。
- 在
module目錄下新建文件version.properties,然后添加以下內(nèi)容:
tag=alpha // alpha、test、release...
build.patch=1
build.code=1 // 每次build后自增
release.code=1 // 每次打release包后自增
- 在
build.gradle文件中,定義getVersionCode和getVersionName方法
def getVersionCode() {
def runTasks = gradle.startParameter.taskNames
def versionFile = file('version.properties')
if (versionFile.exists()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionFile))
if ('assembleRelease' in runTasks || 'aR' in runTasks) {
def versionCode = versionProps['release.code'].toInteger()
return versionCode
} else {
def versionCode = versionProps['build.code'].toInteger()
return versionCode
}
}
}
def getVersionName() {
def File versionFile = file('version.properties')
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionFile))
def patch = versionProps['build.patch']
def tag = versionProps['tag']
if (patch != null) {
def name = patch.toString() + tag.toString()
return name
} else {
return "1.0.0"
}
}
- 打包時(shí)動(dòng)態(tài)修改
versionName和versionCode
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
def currentVersionCode = getVersionCode()
def currentVersionName = VERSION_NAME + getReleaseTag()
defaultConfig {
applicationId "com.lichfaker.test"
minSdkVersion 14
targetSdkVersion 23
versionCode currentVersionCode
versionName currentVersionName
...
}
applicationVariants.all { variant ->
def versionCode = getVersionCode()
def versionName = getReleaseTag()
variant.mergedFlavor.versionCode = versionCode
variant.mergedFlavor.versionName = versionName
}
}
- 更新版本號(hào)
def updateVersionCode() {
def runTasks = gradle.startParameter.taskNames
if (!('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks || 'aB' in runTasks)) {
return
}
def File versionFile = file('version.properties')
if (versionFile.exists()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionFile))
def patchs = versionProps['build.patch'].toInteger()
patchs++
versionProps['build.patch'] = patchs.toString()
if ('assembleRelease' in runTasks || 'assembleBeta' in runTasks || 'aR' in runTasks || 'aB' in runTasks) {
def versionCode = versionProps['release.code'].toInteger()
versionCode++
versionProps['release.code'] = versionCode.toString()
println('Updated version code to ' + versionCode.toString())
versionProps.store(versionFile.newWriter(), null)
} else if ('assembleDebug' in runTasks || 'aD' in runTasks) {
def versionCode = versionProps['build.code'].toInteger()
versionCode++
versionProps['build.code'] = versionCode.toString()
println('Updated version code to ' + versionCode.toString())
versionProps.store(versionFile.newWriter(), null)
}
} else {
throw new GradleException("Could not find version.properties!")
}
}
assembleRelease {}.doLast {
updateVersionCode()
}
assembleDebug {}.doLast {
updateVersionCode()
}
自動(dòng)關(guān)閉Log開關(guān)
通過BuildConfig類來關(guān)閉,在Gradle打包時(shí)指定boolean變量,在日志控制上使用Log(BuildConfig.LOG_DEBUG)
buildTypes {
release {
buildConfigField "boolean", "LOG_DEBUG", "false"
....
}
debug {
buildConfigField "boolean", "LOG_DEBUG", "true"
....
}
}
自定義apk輸出文件名
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
buildTypes {
release {
signingConfig signingConfigs.release
...
// 'release' 是productFlavors,根據(jù)情況調(diào)整
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk') && outputFile.name.contains('release')) {
def fileName = "globalvillage_v" + VERSION_NAME +"_${releaseTime()}_release.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
微信資源混淆及多渠道打包
參考:多渠道打包與AndResGuard的結(jié)合實(shí)踐
其中:project.afterEvaluate 中的內(nèi)容可在resguard{} .doLast中實(shí)現(xiàn), 效果一致