From 259fbe9eae50a4b34059cff5764a1fc24a77b11c Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 2 Oct 2025 16:51:49 +0200 Subject: [PATCH] ndk-build: Make platform SDK parsing more robust and ignore minor suffix The minor suffix of an SDK version is not something that can be targeted or conveyed in an Android app; ignore it for now as we only use this to determine the highest API level to target. However `fn platform_dir()` independently tries to reconstruct this path based on an API target and now has no idea to append `.1` if only `android-36.1` happens to be installed for instance. This should be brought back in sync. --- ndk-build/src/apk.rs | 2 +- ndk-build/src/ndk.rs | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ndk-build/src/apk.rs b/ndk-build/src/apk.rs index 3df2b8f..7653665 100644 --- a/ndk-build/src/apk.rs +++ b/ndk-build/src/apk.rs @@ -65,7 +65,7 @@ impl ApkConfig { self.build_dir.join(format!("{}.apk", self.apk_name)) } - pub fn create_apk(&self) -> Result { + pub fn create_apk(&self) -> Result, NdkError> { std::fs::create_dir_all(&self.build_dir)?; self.manifest.write_to(&self.build_dir)?; diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index ca017c2..7954dd9 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -130,8 +130,25 @@ impl Ndk { .filter(|path| path.path().is_dir()) .filter_map(|path| path.file_name().into_string().ok()) .filter_map(|name| { - name.strip_prefix("android-") - .and_then(|api| api.parse::().ok()) + let mut version = name + .strip_prefix("android-") + .expect("Invalid platform name"); + if let Some((_v, ext)) = version.split_once("-ext") { + // version = v; + let _ext_version = ext.parse::(); + eprintln!("Skipping platform SDK with extensions `{name}`"); + return None; + } + if let Some((v, minor_version)) = version.split_once('.') { + let _minor_version = minor_version.parse::(); + eprintln!("Ignoring minor suffix on SDK version `{version}`"); + version = v; + } + Some( + version + .parse::() + .expect("Invalid platform SDK version"), + ) }) .filter(|level| (min_platform_level..=max_platform_level).contains(level)) .collect(); @@ -214,6 +231,8 @@ impl Ndk { let dir = self .sdk_path .join("platforms") + // TODO: If selected/used by Self::highest_supported_platform(), + // append the minor suffix .join(format!("android-{platform}")); if !dir.exists() { return Err(NdkError::PlatformNotFound(platform));