Android Studio Gradle构建APK 自动化命名
我们在构建APK的时候,通常会有release和debug版本。
如果你直接构建,需要自己命名。
那可以自动命名吗?并且每次都版本号自动+1
gradle文件
定义两个变量
def currentVersionCode = getVersionCode()
def currentVersionName = releaseTime()
版本号和版本名用这两个变量
versionCode currentVersionCode
versionName "${currentVersionName}"
注意前面是两个方法来的getVersionCode
def getVersionCode() {
def versionCodeFile = file('version_code.properties')
if (versionCodeFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(versionCodeFile))
def versionCode = properties['VERSION_CODE'].toInteger()//读取version_code.properties文件存放的版本号。
def runTasks = gradle.startParameter.taskNames
def task = ':app:assembleRelease'
if (task in runTasks) {
properties['VERSION_CODE'] = (++versionCode).toString()
properties.store(versionCodeFile.newWriter(), null)
}
return versionCode
} else {
throw new GradleException("无法读取version_code.properties文件!")
}
}
发布时间的方法releaseTime
def releaseTime() {
return new Date().format("yyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
}
输出名字的构成
android.applicationVariants.all { variant ->
variant.outputs.all {
if (variant.buildType.name == "release") {
outputFileName = "${getApkBaseName()}_V${currentVersionCode}_${currentVersionName}_release.apk"
} else {
outputFileName = "${getApkBaseName()}_V${currentVersionCode}_${currentVersionName}_debug.apk"
}
}
}
apk的名称
// APK 名称
static def getApkBaseName() {
return "SobLauncher"
}
整体的文件如下:
plugins {
id 'com.android.application'
}
android {
compileSdk 33
def currentVersionCode = getVersionCode()
def currentVersionName = releaseTime()
defaultConfig {
applicationId "com.digitalwonder.launcher"
minSdk 29
targetSdk 33
versionCode currentVersionCode
versionName "${currentVersionName}"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {
//签名依赖jdk 11
config {
storeFile file("../sign.jks")
keyAlias = "123456"
keyPassword = "123456"
storePassword = "123456"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
android.applicationVariants.all { variant ->
variant.outputs.all {
if (variant.buildType.name == "release") {
outputFileName = "${getApkBaseName()}_V${currentVersionCode}_${currentVersionName}_release.apk"
} else {
outputFileName = "${getApkBaseName()}_V${currentVersionCode}_${currentVersionName}_debug.apk"
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
// APK 名称
static def getApkBaseName() {
return "DWLauncher"
}
def getVersionCode() {
def versionCodeFile = file('version_code.properties')
if (versionCodeFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(versionCodeFile))
def versionCode = properties['VERSION_CODE'].toInteger()//读取version_code.properties文件存放的版本号。
def runTasks = gradle.startParameter.taskNames
def task = ':app:assembleRelease'
if (task in runTasks) {
properties['VERSION_CODE'] = (++versionCode).toString()
properties.store(versionCodeFile.newWriter(), null)
}
return versionCode
} else {
throw new GradleException("无法读取version_code.properties文件!")
}
}
def releaseTime() {
return new Date().format("yyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
}
注意,别漏了这个文件version_code.properties
用于记录版本号的
比如说我编译一个debug的版本
这样子输出的文件, 就是特定命名的了。