Skip to content

Commit

Permalink
feat(android): aware of version info from tauri config (#9856)
Browse files Browse the repository at this point in the history
* feat(android): versionName and versionCode support

* formatted code and updated schema

* fix config, cleanup generation

* update docs

* mention default version for android

---------

Co-authored-by: Lucas Nogueira <lucas@tauri.studio>
  • Loading branch information
mariotaku and lucasfernog committed May 24, 2024
1 parent d6d3efb commit fd2d7cf
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 7 deletions.
2 changes: 1 addition & 1 deletion core/tauri-build/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ pub fn try_build(attributes: Attributes) -> Result<()> {
println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_NAME_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());
Expand Down
33 changes: 32 additions & 1 deletion core/tauri-build/src/mobile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,21 @@
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();
let mut app_build_gradle = "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
val implementation by configurations
dependencies {"
.to_string();
let mut app_tauri_properties = Vec::new();

for (env, value) in std::env::vars_os() {
let env = env.to_string_lossy();
Expand Down Expand Up @@ -48,13 +52,40 @@ dependencies {"

app_build_gradle.push_str("\n}");

if let Some(version) = config.version.as_ref() {
app_tauri_properties.push(format!("tauri.android.versionName={}", version));
if let Some(version_code) = config.bundle.android.version_code.as_ref() {
app_tauri_properties.push(format!("tauri.android.versionCode={}", 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(format!("tauri.android.versionCode={}", 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")?;

if !app_tauri_properties.is_empty() {
write(
&app_tauri_properties_path,
format!(
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n{}",
app_tauri_properties.join("\n")
),
)
.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());
if !app_tauri_properties.is_empty() {
println!(
"cargo:rerun-if-changed={}",
app_tauri_properties_path.display()
);
}

Ok(())
}
12 changes: 11 additions & 1 deletion core/tauri-config-schema/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"pattern": "^[^/\\:*?\"<>|]+$"
},
"version": {
"description": "App version. It is a semver version number or a path to a `package.json` file containing the `version` field. If removed the version number from `Cargo.toml` is used.",
"description": "App version. It is a semver version number or a path to a `package.json` file containing the `version` field. If removed the version number from `Cargo.toml` is used.\n\nBy default version 1.0 is used on Android.",
"type": [
"string",
"null"
Expand Down Expand Up @@ -2844,6 +2844,16 @@
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"versionCode": {
"description": "The version code of the application. It is limited to 2,100,000,000 as per Google Play Store requirements.\n\nBy default we use your configured version and perform the following math: versionCode = version.major * 1000000 + version.minor * 1000 + version.patch",
"type": [
"integer",
"null"
],
"format": "uint32",
"maximum": 2100000000.0,
"minimum": 1.0
}
},
"additionalProperties": false
Expand Down
12 changes: 12 additions & 0 deletions core/tauri-utils/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1780,12 +1780,22 @@ 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,

/// The version code of the application.
/// It is limited to 2,100,000,000 as per Google Play Store requirements.
///
/// By default we use your configured version and perform the following math:
/// versionCode = version.major * 1000000 + version.minor * 1000 + version.patch
#[serde(alias = "version-code")]
#[cfg_attr(feature = "schema", validate(range(min = 1, max = 2_100_000_000)))]
pub version_code: Option<u32>,
}

impl Default for AndroidConfig {
fn default() -> Self {
Self {
min_sdk_version: default_min_sdk_version(),
version_code: None,
}
}
}
Expand Down Expand Up @@ -2045,6 +2055,8 @@ pub struct Config {
#[cfg_attr(feature = "schema", validate(regex(pattern = "^[^/\\:*?\"<>|]+$")))]
pub product_name: Option<String>,
/// App version. It is a semver version number or a path to a `package.json` file containing the `version` field. If removed the version number from `Cargo.toml` is used.
///
/// By default version 1.0 is used on Android.
#[serde(deserialize_with = "version_deserializer", default)]
pub version: Option<String>,
/// The application identifier in reverse domain name notation (e.g. `com.tauri.example`).
Expand Down
12 changes: 11 additions & 1 deletion tooling/cli/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"pattern": "^[^/\\:*?\"<>|]+$"
},
"version": {
"description": "App version. It is a semver version number or a path to a `package.json` file containing the `version` field. If removed the version number from `Cargo.toml` is used.",
"description": "App version. It is a semver version number or a path to a `package.json` file containing the `version` field. If removed the version number from `Cargo.toml` is used.\n\nBy default version 1.0 is used on Android.",
"type": [
"string",
"null"
Expand Down Expand Up @@ -2844,6 +2844,16 @@
"type": "integer",
"format": "uint32",
"minimum": 0.0
},
"versionCode": {
"description": "The version code of the application. It is limited to 2,100,000,000 as per Google Play Store requirements.\n\nBy default we use your configured version and perform the following math: versionCode = version.major * 1000000 + version.minor * 1000 + version.patch",
"type": [
"integer",
"null"
],
"format": "uint32",
"maximum": 2100000000.0,
"minimum": 1.0
}
},
"additionalProperties": false
Expand Down
3 changes: 2 additions & 1 deletion tooling/cli/templates/mobile/android/app/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
/src/main/jniLibs/**/*.so
/src/main/assets/tauri.conf.json
/tauri.build.gradle.kts
/proguard-tauri.pro
/proguard-tauri.pro
/tauri.properties
13 changes: 11 additions & 2 deletions tooling/cli/templates/mobile/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import java.util.Properties

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
Expand All @@ -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.identifier}}"
Expand All @@ -14,8 +23,8 @@ android {
applicationId = "{{reverse-domain app.identifier}}"
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") {
Expand Down

0 comments on commit fd2d7cf

Please sign in to comment.