diff --git a/packages/cli/src/build/request.rs b/packages/cli/src/build/request.rs index ddc6286c3..dc07e31fc 100644 --- a/packages/cli/src/build/request.rs +++ b/packages/cli/src/build/request.rs @@ -733,7 +733,12 @@ impl BuildRequest { // If no custom linker is set, then android falls back to us as the linker if custom_linker.is_none() && bundle == BundleFormat::Android { - custom_linker = Some(workspace.android_tools()?.android_cc(&triple)); + let min_sdk_version = config.application.android_min_sdk_version.unwrap_or(24); + custom_linker = Some( + workspace + .android_tools()? + .android_cc(&triple, min_sdk_version), + ); } let target_dir = std::env::var("CARGO_TARGET_DIR") @@ -2568,9 +2573,10 @@ impl BuildRequest { let mut env_vars: Vec<(Cow<'static, str>, String)> = vec![]; + let min_sdk_version = self.min_sdk_version_or_default(); + let tools = self.workspace.android_tools()?; - let linker = tools.android_cc(&self.triple); - let min_sdk_version = tools.min_sdk_version(); + let linker = tools.android_cc(&self.triple, min_sdk_version); let ar_path = tools.ar_path(); let target_cc = tools.target_cc(); let target_cxx = tools.target_cxx(); @@ -4274,7 +4280,10 @@ __wbg_init({{module_or_path: "/{}/{wasm_path}"}}).then((wasm) => {{ /// will do its best to fill in the missing bits by exploring the sdk structure /// IE will attempt to use the Java installed from android studio if possible. async fn verify_android_tooling(&self) -> Result<()> { - let linker = self.workspace.android_tools()?.android_cc(&self.triple); + let linker = self + .workspace + .android_tools()? + .android_cc(&self.triple, self.min_sdk_version_or_default()); tracing::debug!("Verifying android linker: {linker:?}"); @@ -4564,6 +4573,14 @@ __wbg_init({{module_or_path: "/{}/{wasm_path}"}}).then((wasm) => {{ .into() } + /// Returns the min sdk version set in config. If not set 24 is returned as a default. + pub(crate) fn min_sdk_version_or_default(&self) -> u32 { + self.config + .application + .android_min_sdk_version + .unwrap_or(24) + } + pub(crate) async fn start_simulators(&self) -> Result<()> { if self.device { return Ok(()); diff --git a/packages/cli/src/build/tools.rs b/packages/cli/src/build/tools.rs index a38351cde..99a3765b1 100644 --- a/packages/cli/src/build/tools.rs +++ b/packages/cli/src/build/tools.rs @@ -157,19 +157,15 @@ impl AndroidTools { /// "~/Library/Android/sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld" /// /// However, for our purposes, we only go through the cc driver and not the linker directly. - pub(crate) fn android_cc(&self, triple: &Triple) -> PathBuf { + pub(crate) fn android_cc(&self, triple: &Triple, sdk_version: u32) -> PathBuf { let suffix = if cfg!(target_os = "windows") { ".cmd" } else { "" }; - self.android_tools_dir().join(format!( - "{}{}-clang{}", - triple, - self.min_sdk_version(), - suffix - )) + self.android_tools_dir() + .join(format!("{}{}-clang{}", triple, sdk_version, suffix)) } pub(crate) fn sysroot(&self) -> PathBuf { @@ -191,11 +187,6 @@ impl AndroidTools { self.sdk().join("emulator").join("emulator") } - // todo(jon): this should be configurable - pub(crate) fn min_sdk_version(&self) -> u32 { - 24 - } - pub(crate) fn clang_folder(&self) -> PathBuf { // The clang folder is usually located in the NDK under: // "~/Library/Android/sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/" diff --git a/packages/cli/src/config/app.rs b/packages/cli/src/config/app.rs index f0e78f002..4ffde0a68 100644 --- a/packages/cli/src/config/app.rs +++ b/packages/cli/src/config/app.rs @@ -38,4 +38,8 @@ pub(crate) struct ApplicationConfig { /// Use this file for the MainActivity.kt associated with the Android app. #[serde(default)] pub(crate) android_main_activity: Option, + + /// Specified minimum sdk version for gradle to build the app with. + #[serde(default)] + pub(crate) android_min_sdk_version: Option, } diff --git a/packages/cli/src/config/dioxus_config.rs b/packages/cli/src/config/dioxus_config.rs index ee804bbf4..30548d0b9 100644 --- a/packages/cli/src/config/dioxus_config.rs +++ b/packages/cli/src/config/dioxus_config.rs @@ -22,6 +22,7 @@ impl Default for DioxusConfig { ios_info_plist: None, android_manifest: None, android_main_activity: None, + android_min_sdk_version: None, macos_info_plist: None, ios_entitlements: None, macos_entitlements: None,