นี่คือความทันสมัยของคำตอบก่อนหน้านี้ซึ่งสามารถดูได้ด้านล่าง หนึ่งนี้จะทำงานด้วยGradle 4.4และAndroid 3.1.1
สิ่งที่สคริปต์นี้ทำ:
- สร้างไฟล์version.propertiesหากไม่มีอยู่ (โหวตคำตอบของ Paul Cantrell ด้านล่างซึ่งเป็นที่ที่ฉันได้แนวคิดมาหากคุณชอบคำตอบนี้)
- สำหรับแต่ละรุ่นแก้ไขข้อบกพร่องหรือเมื่อใดก็ตามที่คุณกดปุ่มเรียกใช้ใน Android Studio จำนวน VERSION_BUILD จะเพิ่มขึ้น
- ทุกครั้งที่คุณรวบรวมรุ่น Android versionCodeสำหรับ play store จะเพิ่มขึ้นและจำนวนแพตช์ของคุณจะเพิ่มขึ้น
- โบนัส: หลังจากสร้างเสร็จแล้วให้คัดลอก apk ของคุณ
projectDir/apk
เพื่อให้สามารถเข้าถึงได้มากขึ้น
สคริปต์นี้จะสร้างหมายเลขรุ่นซึ่งมีลักษณะเหมือนv1.3.4 (123)
และสร้างไฟล์ APK เช่นAppName-v1.3.4.apk
Major version ⌄ ⌄ Build version
v1.3.4 (123)
Minor version ⌃|⌃ Patch version
เวอร์ชันหลัก:ต้องเปลี่ยนแปลงด้วยตนเองเพื่อการเปลี่ยนแปลงที่ใหญ่ขึ้น
รุ่นรอง:ต้องเปลี่ยนด้วยตนเองสำหรับการเปลี่ยนแปลงที่ใหญ่น้อยกว่าเล็กน้อย
เวอร์ชันแพตช์:เพิ่มขึ้นเมื่อทำงานgradle assembleRelease
สร้างเวอร์ชัน:เพิ่มทุก
หมายเลขเวอร์ชัน:เหมือนกับเวอร์ชันแพทช์ซึ่งเป็นรหัสเวอร์ชันที่ Play Store ต้องเพิ่มขึ้นสำหรับการอัปโหลด apk ใหม่แต่ละครั้ง
เพียงแค่เปลี่ยนเนื้อหาในความคิดเห็นที่มีข้อความ 1 - 3 ด้านล่างแล้วสคริปต์ก็ควรดำเนินการที่เหลือ :)
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
def versionPropsFile = file('version.properties')
def value = 0
Properties versionProps = new Properties()
if (!versionPropsFile.exists()) {
versionProps['VERSION_PATCH'] = "0"
versionProps['VERSION_NUMBER'] = "0"
versionProps['VERSION_BUILD'] = "-1" // I set it to minus one so the first build is 0 which isn't super important.
versionProps.store(versionPropsFile.newWriter(), null)
}
def runTasks = gradle.startParameter.taskNames
if ('assembleRelease' in runTasks) {
value = 1
}
def mVersionName = ""
def mFileName = ""
if (versionPropsFile.canRead()) {
versionProps.load(new FileInputStream(versionPropsFile))
versionProps['VERSION_PATCH'] = (versionProps['VERSION_PATCH'].toInteger() + value).toString()
versionProps['VERSION_NUMBER'] = (versionProps['VERSION_NUMBER'].toInteger() + value).toString()
versionProps['VERSION_BUILD'] = (versionProps['VERSION_BUILD'].toInteger() + 1).toString()
versionProps.store(versionPropsFile.newWriter(), null)
// 1: change major and minor version here
mVersionName = "v1.0.${versionProps['VERSION_PATCH']}"
// 2: change AppName for your app name
mFileName = "AppName-${mVersionName}.apk"
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
applicationId "com.example.appname" // 3: change to your package name
versionCode versionProps['VERSION_NUMBER'].toInteger()
versionName "${mVersionName} Build: ${versionProps['VERSION_BUILD']}"
}
} else {
throw new FileNotFoundException("Could not read version.properties!")
}
if ('assembleRelease' in runTasks) {
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
outputFileName = mFileName
}
}
}
}
task copyApkFiles(type: Copy){
from 'build/outputs/apk/release'
into '../apk'
include mFileName
}
afterEvaluate {
assembleRelease.doLast {
tasks.copyApkFiles.execute()
}
}
signingConfigs {
...
}
buildTypes {
...
}
}
================================================== ==
คำตอบเริ่มต้น:
ฉันต้องการให้ versionName เพิ่มขึ้นโดยอัตโนมัติเช่นกัน นี่เป็นเพียงส่วนเสริมของคำตอบของ CommonsWare ซึ่งทำงานได้ดีสำหรับฉัน นี่คือสิ่งที่เหมาะกับฉัน
defaultConfig {
versionCode code
versionName "1.1." + code
minSdkVersion 14
targetSdkVersion 18
}
แก้ไข:
เนื่องจากฉันขี้เกียจเล็กน้อยฉันจึงต้องการให้เวอร์ชันของฉันทำงานโดยอัตโนมัติที่สุด สิ่งที่ฉันต้องการคือมีเวอร์ชันบิวด์ที่เพิ่มขึ้นในแต่ละบิลด์ในขณะที่หมายเลขเวอร์ชันและชื่อเวอร์ชันจะเพิ่มขึ้นก็ต่อเมื่อฉันสร้างเวอร์ชันสร้าง
นี่คือสิ่งที่ฉันใช้มาตลอดปีที่ผ่านมาโดยพื้นฐานมาจากคำตอบของ CommonsWare และคำตอบก่อนหน้าของฉันและอีกบางส่วน สิ่งนี้ส่งผลให้เกิดการกำหนดเวอร์ชันต่อไปนี้:
ชื่อเวอร์ชัน: 1.0.5 (123) -> Major.Minor.Patch (Build), Major และ Minor จะถูกเปลี่ยนด้วยตนเอง
ใน build.gradle:
...
android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
def versionPropsFile = file('version.properties')
if (versionPropsFile.canRead()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def value = 0
def runTasks = gradle.startParameter.taskNames
if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) {
value = 1;
}
def versionMajor = 1
def versionMinor = 0
def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
def versionNumber = versionProps['VERSION_NUMBER'].toInteger() + value
versionProps['VERSION_PATCH'] = versionPatch.toString()
versionProps['VERSION_BUILD'] = versionBuild.toString()
versionProps['VERSION_NUMBER'] = versionNumber.toString()
versionProps.store(versionPropsFile.newWriter(), null)
defaultConfig {
versionCode versionNumber
versionName "${versionMajor}.${versionMinor}.${versionPatch} (${versionBuild}) Release"
minSdkVersion 14
targetSdkVersion 23
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileNaming = "apk/RELEASES"
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
output.outputFile = new File(getProject().getRootDir(), "${fileNaming}-${versionMajor}.${versionMinor}.${versionPatch}-${outputFile.name}")
}
}
}
}
} else {
throw new GradleException("Could not read version.properties!")
}
...
}
...
Patch และ versionCode จะเพิ่มขึ้นหากคุณประกอบโปรเจ็กต์ของคุณผ่านเทอร์มินัลด้วย'Assemble' , 'AssembleRelease'หรือ'aR'ซึ่งจะสร้างโฟลเดอร์ใหม่ในรูทโปรเจ็กต์ของคุณที่เรียกว่า apk / RELEASE ดังนั้นคุณจึงไม่ต้องมองผ่าน build / outputs / เพิ่มเติม / เพิ่มเติม / อื่น ๆ เพื่อค้นหา apk ของคุณ
คุณสมบัติเวอร์ชันของคุณจะต้องมีลักษณะดังนี้:
VERSION_NUMBER=1
VERSION_BUILD=645
VERSION_PATCH=1
เห็นได้ชัดว่าเริ่มต้นด้วย 0 :)