Selaa lähdekoodia

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>
Fontlos 1 kuukausi sitten
vanhempi
commit
7d5bd44791

+ 14 - 1
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()

+ 10 - 1
packages/cli/src/build/request.rs

@@ -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 - 0
packages/cli/src/config/bundle.rs

@@ -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.