feat(cli): add bundle.android config to build and sign the apk file in release mode (#4062)

* feat(cli): add `bundle.android` config to build and sign the apk file in release mode

Add this to `Dioxus.toml`

```toml
[bundle.android]
jks_file = "path/to/jks file relative to Dioxus.toml"
jks_password = "jks_password "
key_alias = "key_alias"
key_password = "key_password "
```

When release flag is enabled and this configuration exists  at the same time, use `gradlew assembleRelease` build and sign apk file

* fix merge conflict

* only run assembleRelease when bundle exists

---------

Co-authored-by: Jonathan Kelley <jkelleyrtp@gmail.com>
This commit is contained in:
FontlosandJonathan Kelley authored and GitHub committed 2025-05-07 14:22:59 -07:00
1 parent ad63d529fd
commit 7d5bd44791
3 files changed
+34 -2

No files matched your search

@@ -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()
+10 -1
View File
@@ -2271,10 +2271,12 @@ session_cache_dir: {}"#,
struct AndroidHandlebarsObjects {
application_id: String,
app_name: String,
android_bundle: Option<crate::AndroidSettings>,
}
let hbs_data = AndroidHandlebarsObjects {
application_id: self.full_mobile_app_name(),
app_name: self.bundled_app_name(),
android_bundle: self.config.bundle.android.clone(),
};
let hbs = handlebars::Handlebars::new();
@@ -3164,8 +3166,15 @@ session_cache_dir: {}"#,
if let Platform::Android = self.platform {
ctx.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.release && self.config.bundle.android.is_some() {
"assembleRelease"
} else {
"assembleDebug"
};
let output = Command::new(self.gradle_exe()?)
.arg("assembleDebug")
.arg(build_type)
.current_dir(self.root_dir())
.output()
.await?;
+10
View File
@@ -16,6 +16,7 @@ pub(crate) struct BundleConfig {
pub(crate) deb: Option<DebianSettings>,
pub(crate) macos: Option<MacOsSettings>,
pub(crate) windows: Option<WindowsSettings>,
pub(crate) android: Option<AndroidSettings>,
}
#[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.