From 9a15520002226fd06335d27cfd08f40f801c092c Mon Sep 17 00:00:00 2001 From: Mariotaku Date: Thu, 23 May 2024 10:58:49 +0900 Subject: [PATCH] feat(android): versionName and versionCode support --- core/tauri-build/src/lib.rs | 2 +- core/tauri-build/src/mobile.rs | 21 ++++++++++++++++++- core/tauri-utils/src/config.rs | 4 ++++ .../templates/mobile/android/app/.gitignore | 3 ++- .../mobile/android/app/build.gradle.kts | 13 ++++++++++-- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/core/tauri-build/src/lib.rs b/core/tauri-build/src/lib.rs index 2c90b5b64ee0..5b6dd9a1184e 100644 --- a/core/tauri-build/src/lib.rs +++ b/core/tauri-build/src/lib.rs @@ -468,7 +468,7 @@ pub fn try_build(attributes: Attributes) -> Result<()> { println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_PREFIX={android_package_prefix}"); if let Some(project_dir) = var_os("TAURI_ANDROID_PROJECT_PATH").map(PathBuf::from) { - mobile::generate_gradle_files(project_dir)?; + mobile::generate_gradle_files(project_dir, &config)?; } cfg_alias("dev", dev()); diff --git a/core/tauri-build/src/mobile.rs b/core/tauri-build/src/mobile.rs index c12ac1e62029..0ed289e8cb89 100644 --- a/core/tauri-build/src/mobile.rs +++ b/core/tauri-build/src/mobile.rs @@ -5,10 +5,13 @@ use std::{fs::write, path::PathBuf}; use anyhow::{Context, Result}; +use semver::Version; +use tauri_utils::config::Config; -pub fn generate_gradle_files(project_dir: PathBuf) -> Result<()> { +pub fn generate_gradle_files(project_dir: PathBuf, config: &Config) -> Result<()> { let gradle_settings_path = project_dir.join("tauri.settings.gradle"); let app_build_gradle_path = project_dir.join("app").join("tauri.build.gradle.kts"); + let app_tauri_properties_path = project_dir.join("app").join("tauri.properties"); let mut gradle_settings = "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n".to_string(); @@ -16,6 +19,8 @@ pub fn generate_gradle_files(project_dir: PathBuf) -> Result<()> { val implementation by configurations dependencies {" .to_string(); + let mut app_tauri_properties = + "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n".to_string(); for (env, value) in std::env::vars_os() { let env = env.to_string_lossy(); @@ -48,13 +53,27 @@ dependencies {" app_build_gradle.push_str("\n}"); + if let Some(version) = config.version.as_ref() { + app_tauri_properties.push_str(&format!("tauri.android.versionName={}\n", version)); + if let Some(version_code) = config.bundle.android.version_code.as_ref() { + app_tauri_properties.push_str(&format!("tauri.android.versionCode={}\n", version_code)); + } else if let Ok(version) = Version::parse(version) { + let version_code = version.major * 1000000 + version.minor * 1000 + version.patch; + app_tauri_properties.push_str(&format!("tauri.android.versionCode={}\n", version_code)); + } + } + write(&gradle_settings_path, gradle_settings).context("failed to write tauri.settings.gradle")?; write(&app_build_gradle_path, app_build_gradle) .context("failed to write tauri.build.gradle.kts")?; + write(&app_tauri_properties_path, app_tauri_properties) + .context("failed to write tauri.properties")?; + println!("cargo:rerun-if-changed={}", gradle_settings_path.display()); println!("cargo:rerun-if-changed={}", app_build_gradle_path.display()); + println!("cargo:rerun-if-changed={}", app_tauri_properties_path.display()); Ok(()) } diff --git a/core/tauri-utils/src/config.rs b/core/tauri-utils/src/config.rs index 73acca8fc353..f9962aabab94 100644 --- a/core/tauri-utils/src/config.rs +++ b/core/tauri-utils/src/config.rs @@ -1770,12 +1770,16 @@ pub struct AndroidConfig { /// The Android system will prevent the user from installing the application if the system's API level is lower than the value specified. #[serde(alias = "min-sdk-version", default = "default_min_sdk_version")] pub min_sdk_version: u32, + + #[serde(alias = "version-code")] + pub version_code: Option, } impl Default for AndroidConfig { fn default() -> Self { Self { min_sdk_version: default_min_sdk_version(), + version_code: None, } } } diff --git a/tooling/cli/templates/mobile/android/app/.gitignore b/tooling/cli/templates/mobile/android/app/.gitignore index 532fcd9e0745..439b71f0e392 100644 --- a/tooling/cli/templates/mobile/android/app/.gitignore +++ b/tooling/cli/templates/mobile/android/app/.gitignore @@ -2,4 +2,5 @@ /src/main/jniLibs/**/*.so /src/main/assets/tauri.conf.json /tauri.build.gradle.kts -/proguard-tauri.pro \ No newline at end of file +/proguard-tauri.pro +/tauri.properties \ No newline at end of file diff --git a/tooling/cli/templates/mobile/android/app/build.gradle.kts b/tooling/cli/templates/mobile/android/app/build.gradle.kts index 06870f32d1f1..e6befa182cde 100644 --- a/tooling/cli/templates/mobile/android/app/build.gradle.kts +++ b/tooling/cli/templates/mobile/android/app/build.gradle.kts @@ -1,3 +1,5 @@ +import java.util.Properties + plugins { id("com.android.application") id("org.jetbrains.kotlin.android") @@ -6,6 +8,13 @@ plugins { id("{{this}}"){{/each}} } +val tauriProperties = Properties().apply { + val propFile = file("tauri.properties") + if (propFile.exists()) { + propFile.inputStream().use { load(it) } + } +} + android { compileSdk = 33 namespace = "{{reverse-domain app.domain}}.{{snake-case app.name}}" @@ -14,8 +23,8 @@ android { applicationId = "{{reverse-domain app.domain}}.{{snake-case app.name}}" minSdk = {{android.min-sdk-version}} targetSdk = 33 - versionCode = 1 - versionName = "1.0" + versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() + versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") } buildTypes { getByName("debug") {