diff --git a/packages/cli/assets/android/gen/app/build.gradle.kts.hbs b/packages/cli/assets/android/gen/app/build.gradle.kts.hbs index 74ac217077..882e4ff85c 100644 --- a/packages/cli/assets/android/gen/app/build.gradle.kts.hbs +++ b/packages/cli/assets/android/gen/app/build.gradle.kts.hbs @@ -13,6 +13,16 @@ android { versionCode = 1 versionName = "1.0" } + {{#if android_bundle}} + signingConfigs { + create("release") { + storeFile = file("../../../../../../../{{ android_bundle.jks_file }}") + storePassword = "{{ android_bundle.jks_password }}" + keyAlias = "{{ android_bundle.key_alias }}" + keyPassword = "{{ android_bundle.key_password }}" + } + } + {{/if}} buildTypes { getByName("debug") { isDebuggable = true @@ -27,7 +37,10 @@ android { } getByName("release") { isMinifyEnabled = true - proguardFiles( + {{#if android_bundle}} + signingConfig = signingConfigs.getByName("release") + {{/if}} + proguardFiles( *fileTree(".") { include("**/*.pro") } .plus(getDefaultProguardFile("proguard-android-optimize.txt")) .toList().toTypedArray() diff --git a/packages/cli/src/build/bundle.rs b/packages/cli/src/build/bundle.rs index e2b769f9d2..57dab4f908 100644 --- a/packages/cli/src/build/bundle.rs +++ b/packages/cli/src/build/bundle.rs @@ -859,8 +859,16 @@ impl AppBundle { if let Platform::Android = self.build.build.platform() { self.build.status_running_gradle(); + // When the build mode is set to release and there is an Android signature configuration, use assembleRelease + let build_type = + if self.build.build.release && self.build.krate.config.bundle.android.is_some() { + "assembleRelease" + } else { + "assembleDebug" + }; + let output = Command::new(self.gradle_exe()?) - .arg("assembleDebug") + .arg(build_type) .current_dir(self.build.root_dir()) .stderr(std::process::Stdio::piped()) .stdout(std::process::Stdio::piped()) diff --git a/packages/cli/src/build/request.rs b/packages/cli/src/build/request.rs index 77d9464dbf..563af6288d 100644 --- a/packages/cli/src/build/request.rs +++ b/packages/cli/src/build/request.rs @@ -810,10 +810,12 @@ impl BuildRequest { struct HbsTypes { application_id: String, app_name: String, + android_bundle: Option, } let hbs_data = HbsTypes { application_id: self.krate.full_mobile_app_name(), app_name: self.krate.bundled_app_name(), + android_bundle: self.krate.config.bundle.android.clone(), }; // Top-level gradle config diff --git a/packages/cli/src/config/bundle.rs b/packages/cli/src/config/bundle.rs index 042dd20224..8d3eafd0cb 100644 --- a/packages/cli/src/config/bundle.rs +++ b/packages/cli/src/config/bundle.rs @@ -16,6 +16,7 @@ pub(crate) struct BundleConfig { pub(crate) deb: Option, pub(crate) macos: Option, pub(crate) windows: Option, + pub(crate) android: Option, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] @@ -185,6 +186,15 @@ impl Default for WebviewInstallMode { } } +/// Because all four fields must appear at the same time, there is no need for an Option +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(crate) struct AndroidSettings { + pub(crate) jks_file: PathBuf, + pub(crate) jks_password: String, + pub(crate) key_alias: String, + pub(crate) key_password: String, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CustomSignCommandSettings { /// The command to run to sign the binary.