From a0b1b4b569a984c9e890b3d7c3fc22ac4364595a Mon Sep 17 00:00:00 2001 From: xfy Date: Wed, 20 May 2026 01:11:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E7=94=9F=E6=88=90=E4=B8=8E=E8=AF=BB?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.gradle.kts 根据 baseVersion + git hash + buildDate 生成 versionName - gradle.properties 添加 app.version.base=1.0.0 - 新增 expect/actual getAppVersion(),Android 从 PackageInfo 读取,iOS 从 NSBundle 读取 - AboutScreen 使用 getAppVersion() 替代硬编码 AppInfo.VERSION Co-Authored-By: Claude Opus 4.7 (1M context) --- androidApp/build.gradle.kts | 18 ++++++++++++++++- gradle.properties | 3 +++ .../plus/rua/project/Platform.android.kt | 20 +++++++++++++++++++ .../kotlin/plus/rua/project/Platform.kt | 3 +++ .../kotlin/plus/rua/project/ui/AboutScreen.kt | 3 ++- .../kotlin/plus/rua/project/Platform.ios.kt | 10 ++++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 25c2209..1f01952 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,9 +1,25 @@ +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeCompiler) } +val baseVersion = findProperty("app.version.base") as? String ?: "1.0.0" + +val gitHash = try { + providers.exec { + commandLine("git", "rev-parse", "--short=5", "HEAD") + }.standardOutput.asText.get().trim() +} catch (_: Exception) { + "unknown" +} + +val buildDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("ddMMyy")) +val appVersionName = "${baseVersion}_${gitHash}_${buildDate}" + android { namespace = "plus.rua.project" compileSdk = libs.versions.android.compileSdk.get().toInt() @@ -13,7 +29,7 @@ android { minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() versionCode = 1 - versionName = "1.0" + versionName = appVersionName ndk { abiFilters += listOf("arm64-v8a", "armeabi-v7a") diff --git a/gradle.properties b/gradle.properties index 4177846..6c17cf3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,9 @@ org.gradle.caching=true org.gradle.parallel=true org.gradle.daemon=true +#App +app.version.base=1.0.0 + #Android android.nonTransitiveRClass=true android.useAndroidX=true diff --git a/shared/src/androidMain/kotlin/plus/rua/project/Platform.android.kt b/shared/src/androidMain/kotlin/plus/rua/project/Platform.android.kt index d58e44d..0bf4bd6 100644 --- a/shared/src/androidMain/kotlin/plus/rua/project/Platform.android.kt +++ b/shared/src/androidMain/kotlin/plus/rua/project/Platform.android.kt @@ -5,6 +5,7 @@ import androidx.activity.BackEventCompat import androidx.activity.compose.BackHandler import androidx.activity.compose.PredictiveBackHandler import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.Flow @@ -18,6 +19,25 @@ actual fun getGifUri(gifFile: String): String = "file:///android_asset/gifs/$gif actual fun getAppIconUri(): String = "file:///android_asset/app_icon.png?v=2" +@Composable +actual fun getAppVersion(): String { + val context = LocalContext.current.applicationContext + return try { + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.packageManager.getPackageInfo( + context.packageName, + android.content.pm.PackageManager.PackageInfoFlags.of(0) + ) + } else { + @Suppress("DEPRECATION") + context.packageManager.getPackageInfo(context.packageName, 0) + } + packageInfo.versionName ?: "unknown" + } catch (_: Exception) { + "unknown" + } +} + @Composable actual fun PredictiveBackHandler( enabled: Boolean, diff --git a/shared/src/commonMain/kotlin/plus/rua/project/Platform.kt b/shared/src/commonMain/kotlin/plus/rua/project/Platform.kt index 116f9d3..67003ec 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/Platform.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/Platform.kt @@ -18,6 +18,9 @@ expect fun getGifUri(gifFile: String): String expect fun getAppIconUri(): String +@Composable +expect fun getAppVersion(): String + /** * 预测性返回手势处理器(Android 13+)。 * diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/AboutScreen.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/AboutScreen.kt index dcf18aa..593fe39 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/AboutScreen.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/AboutScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp import com.github.panpf.sketch.AsyncImage import plus.rua.project.AppInfo import plus.rua.project.getAppIconUri +import plus.rua.project.getAppVersion /** * 关于页面,展示应用图标、名称、版本号及开源许可入口。 @@ -100,7 +101,7 @@ fun AboutScreen( Spacer(modifier = Modifier.height(8.dp)) Text( - text = "版本:${AppInfo.VERSION}", + text = "版本:${getAppVersion()}", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/shared/src/iosMain/kotlin/plus/rua/project/Platform.ios.kt b/shared/src/iosMain/kotlin/plus/rua/project/Platform.ios.kt index a1647d0..e30d581 100644 --- a/shared/src/iosMain/kotlin/plus/rua/project/Platform.ios.kt +++ b/shared/src/iosMain/kotlin/plus/rua/project/Platform.ios.kt @@ -1,6 +1,7 @@ package plus.rua.project import androidx.compose.runtime.Composable +import platform.Foundation.NSBundle import platform.UIKit.UIDevice class IOSPlatform : Platform { @@ -14,6 +15,15 @@ actual fun getGifUri(gifFile: String): String = "compose.resource://files/$gifFi actual fun getAppIconUri(): String = "compose.resource://files/app_icon.png?v=2" +@Composable +actual fun getAppVersion(): String { + return try { + NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString") as? String ?: "unknown" + } catch (_: Throwable) { + "unknown" + } +} + @Composable actual fun PredictiveBackHandler( enabled: Boolean,