From 0cd5c58ecb29a6e80d55e02b17323c18657362b6 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 3 Mar 2026 09:09:13 -0800 Subject: [PATCH] =?UTF-8?q?feat(android):=20APK=20versionCode=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=80=92=E5=A2=9E=20=E2=80=94=20=E6=AF=8F=E6=AC=A1?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E8=87=AA=E5=A2=9E=EF=BC=8C=E5=90=84=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E7=8B=AC=E7=AB=8B=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 参考 rwadurian mobile-app 的 version.properties 方案,为 genex-mobile 和 admin-app 添加 build 时 versionCode 自动 +1 逻辑: - build.gradle.kts: calculateNextVersionCode() 读取 version.properties, 自增后写回;versionName 格式 "pubspec版本.buildNumber"(如 1.0.0.42) - .gitignore: 排除 /android/app/version.properties,每个构建环境 (本机、CI、服务器)各自维护独立计数器,互不干扰 - 首次编译从 1 开始,后续跨日期持续递增,保证 APK 版本始终唯一 Co-Authored-By: Claude Opus 4.6 --- frontend/admin-app/.gitignore | 3 ++ .../admin-app/android/app/build.gradle.kts | 29 +++++++++++++++++-- frontend/genex-mobile/.gitignore | 3 ++ .../genex-mobile/android/app/build.gradle.kts | 29 +++++++++++++++++-- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/frontend/admin-app/.gitignore b/frontend/admin-app/.gitignore index 96352b9..69d0ae1 100644 --- a/frontend/admin-app/.gitignore +++ b/frontend/admin-app/.gitignore @@ -44,6 +44,9 @@ app.*.map.json /android/app/profile /android/app/release +# Auto-generated version code (each build environment maintains its own counter) +/android/app/version.properties + # Signing keys (do NOT commit to public repos) android/key.properties android/app/keystore/ diff --git a/frontend/admin-app/android/app/build.gradle.kts b/frontend/admin-app/android/app/build.gradle.kts index 1b71d78..c20b7e6 100644 --- a/frontend/admin-app/android/app/build.gradle.kts +++ b/frontend/admin-app/android/app/build.gradle.kts @@ -1,5 +1,6 @@ import java.util.Properties import java.io.FileInputStream +import java.io.FileOutputStream plugins { id("com.android.application") @@ -14,6 +15,30 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(FileInputStream(keystorePropertiesFile)) } +// ============================================ +// Auto-increment version code on each build +// ============================================ +val versionPropertiesFile = rootProject.file("app/version.properties") +val versionProperties = Properties() + +fun calculateNextVersionCode(): Int { + if (versionPropertiesFile.exists()) { + versionProperties.load(FileInputStream(versionPropertiesFile)) + } + val currentCode = versionProperties.getProperty("VERSION_CODE", "0").toInt() + val newCode = currentCode + 1 + versionProperties.setProperty("VERSION_CODE", newCode.toString()) + versionProperties.store(FileOutputStream(versionPropertiesFile), "Auto-generated version code - DO NOT EDIT MANUALLY") + return newCode +} + +val autoVersionCode = calculateNextVersionCode() + +fun getAutoVersionName(): String { + val flutterVersionName = flutter.versionName + return "$flutterVersionName.$autoVersionCode" +} + android { namespace = "cn.gogenex.genex_issuer" compileSdk = flutter.compileSdkVersion @@ -32,8 +57,8 @@ android { applicationId = "cn.gogenex.issuer" minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName + versionCode = autoVersionCode + versionName = getAutoVersionName() } signingConfigs { diff --git a/frontend/genex-mobile/.gitignore b/frontend/genex-mobile/.gitignore index 96352b9..69d0ae1 100644 --- a/frontend/genex-mobile/.gitignore +++ b/frontend/genex-mobile/.gitignore @@ -44,6 +44,9 @@ app.*.map.json /android/app/profile /android/app/release +# Auto-generated version code (each build environment maintains its own counter) +/android/app/version.properties + # Signing keys (do NOT commit to public repos) android/key.properties android/app/keystore/ diff --git a/frontend/genex-mobile/android/app/build.gradle.kts b/frontend/genex-mobile/android/app/build.gradle.kts index 5245765..a8c16cc 100644 --- a/frontend/genex-mobile/android/app/build.gradle.kts +++ b/frontend/genex-mobile/android/app/build.gradle.kts @@ -1,5 +1,6 @@ import java.util.Properties import java.io.FileInputStream +import java.io.FileOutputStream plugins { id("com.android.application") @@ -14,6 +15,30 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(FileInputStream(keystorePropertiesFile)) } +// ============================================ +// Auto-increment version code on each build +// ============================================ +val versionPropertiesFile = rootProject.file("app/version.properties") +val versionProperties = Properties() + +fun calculateNextVersionCode(): Int { + if (versionPropertiesFile.exists()) { + versionProperties.load(FileInputStream(versionPropertiesFile)) + } + val currentCode = versionProperties.getProperty("VERSION_CODE", "0").toInt() + val newCode = currentCode + 1 + versionProperties.setProperty("VERSION_CODE", newCode.toString()) + versionProperties.store(FileOutputStream(versionPropertiesFile), "Auto-generated version code - DO NOT EDIT MANUALLY") + return newCode +} + +val autoVersionCode = calculateNextVersionCode() + +fun getAutoVersionName(): String { + val flutterVersionName = flutter.versionName + return "$flutterVersionName.$autoVersionCode" +} + android { namespace = "cn.gogenex.genex_consumer" compileSdk = flutter.compileSdkVersion @@ -33,8 +58,8 @@ android { applicationId = "cn.gogenex.consumer" minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName + versionCode = autoVersionCode + versionName = getAutoVersionName() } signingConfigs {