diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e2370a46..ba4b39b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,6 +52,16 @@ jobs: arch: x64 - platform: android arch: arm64 + - platform: android + arch: arm + - platform: android + arch: armv7 + - platform: android + arch: armv6 + - platform: android + arch: armv8a32 + - platform: android + arch: x86 - platform: ios arch: arm64 diff --git a/apk/src/utils.rs b/apk/src/utils.rs index ff266848..f44efab9 100644 --- a/apk/src/utils.rs +++ b/apk/src/utils.rs @@ -4,9 +4,12 @@ use anyhow::{Context, Result}; #[repr(u8)] pub enum Target { ArmV7a = 1, - Arm64V8a = 2, - X86 = 3, - X86_64 = 4, + Armeabi = 2, + Arm64V8a = 3, + X86 = 4, + X86_64 = 5, + ArmV6a = 6, // ARM 32-bit (ARMv6-A) + ArmV8a32 = 7, // ARM 32-bit (ARMv8-A) } impl Target { @@ -14,9 +17,12 @@ impl Target { pub fn as_str(self) -> &'static str { match self { Self::Arm64V8a => "arm64-v8a", + Self::Armeabi => "armeabi", Self::ArmV7a => "armeabi-v7a", Self::X86 => "x86", Self::X86_64 => "x86_64", + Self::ArmV6a => "armeabi-v6a", + Self::ArmV8a32 => "armv8a", } } } diff --git a/xbuild/src/devices/adb.rs b/xbuild/src/devices/adb.rs index 356612e1..565d8580 100644 --- a/xbuild/src/devices/adb.rs +++ b/xbuild/src/devices/adb.rs @@ -375,9 +375,12 @@ impl Adb { pub fn arch(&self, device: &str) -> Result { let arch = match self.getprop(device, "ro.product.cpu.abi")?.as_str() { "arm64-v8a" => Arch::Arm64, - //"armeabi-v7a" => Arch::Arm, + "armeabi-v7a" => Arch::Armv7, + "armeabi-v6a" => Arch::Armv6, + "armv8a" => Arch::Armv8a32, + "armeabi" => Arch::Arm, "x86_64" => Arch::X64, - //"x86" => Arch::X86, + "x86" => Arch::X86, abi => anyhow::bail!("unrecognized abi {}", abi), }; Ok(arch) diff --git a/xbuild/src/devices/imd.rs b/xbuild/src/devices/imd.rs index 9e2dee74..4b8d07ce 100644 --- a/xbuild/src/devices/imd.rs +++ b/xbuild/src/devices/imd.rs @@ -127,6 +127,9 @@ impl IMobileDevice { pub fn arch(&self, device: &str) -> Result { match self.getkey(device, "CPUArchitecture")?.as_str() { "arm64" | "arm64e" => Ok(Arch::Arm64), + "armv7" => Ok(Arch::Armv7), + "arm" => Ok(Arch::Arm), + "x86_64" => Ok(Arch::X64), arch => anyhow::bail!("unsupported arch {}", arch), } } diff --git a/xbuild/src/lib.rs b/xbuild/src/lib.rs index 4a376e51..d508c68c 100644 --- a/xbuild/src/lib.rs +++ b/xbuild/src/lib.rs @@ -74,10 +74,13 @@ impl std::fmt::Display for Platform { #[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)] pub enum Arch { - //Arm, + Armv7, + Arm, + Armv6, // ARM 32-bit (ARMv6) + Armv8a32, // ARM 32-bit (ARMv8-A) Arm64, X64, - //X86, + X86, // Intel 32-bit } impl Arch { @@ -206,8 +209,13 @@ impl CompileTarget { pub fn android_abi(self) -> apk::Target { assert_eq!(self.platform(), Platform::Android); match self.arch() { + Arch::Armv7 => apk::Target::ArmV7a, + Arch::Arm => apk::Target::Armeabi, + Arch::Armv6 => apk::Target::ArmV6a, + Arch::Armv8a32 => apk::Target::ArmV8a32, Arch::Arm64 => apk::Target::Arm64V8a, Arch::X64 => apk::Target::X86_64, + Arch::X86 => apk::Target::X86, } } @@ -216,19 +224,27 @@ impl CompileTarget { assert_eq!(self.platform(), Platform::Android); match self.arch() { Arch::Arm64 => "aarch64-linux-android", - //Arch::Arm => "arm-linux-androideabi", - //Arch::X86 => "i686-linux-android", + Arch::Arm => "arm-linux-androideabi", + Arch::Armv7 => "armv7a-linux-androideabi", + Arch::Armv6 => "armv6a-linux-androideabi", + Arch::Armv8a32 => "armv8a-linux-androideabi", Arch::X64 => "x86_64-linux-android", + Arch::X86 => "i686-linux-android", } } pub fn rust_triple(self) -> Result<&'static str> { - Ok(match (self.arch, self.platform) { + Ok(match (self.arch(), self.platform) { (Arch::Arm64, Platform::Android) => "aarch64-linux-android", + (Arch::Armv7, Platform::Android) => "armv7-linux-androideabi", + (Arch::Arm, Platform::Android) => "arm-linux-androideabi", + (Arch::Armv6, Platform::Android) => "armv6-linux-androideabi", + (Arch::Armv8a32, Platform::Android) => "armv8a-linux-androideabi", + (Arch::X64, Platform::Android) => "x86_64-linux-android", + (Arch::X86, Platform::Android) => "i686-linux-android", (Arch::Arm64, Platform::Ios) => "aarch64-apple-ios", (Arch::Arm64, Platform::Linux) => "aarch64-unknown-linux-gnu", (Arch::Arm64, Platform::Macos) => "aarch64-apple-darwin", - (Arch::X64, Platform::Android) => "x86_64-linux-android", (Arch::X64, Platform::Linux) => "x86_64-unknown-linux-gnu", (Arch::X64, Platform::Macos) => "x86_64-apple-darwin", (Arch::X64, Platform::Windows) => "x86_64-pc-windows-msvc",