From 3b8936cd8b3c837681b9d8813b4f84ab5921e8aa Mon Sep 17 00:00:00 2001 From: Mukilan Thiyagarajan Date: Tue, 12 Mar 2024 13:10:47 +0530 Subject: [PATCH] android x86_64 support --- .github/workflows/android.yml | 2 +- python/servo/command_base.py | 23 +++++++++++++++++++++- python/servo/package_commands.py | 4 ++-- support/android/apk/build.gradle | 6 ++++-- support/android/apk/jni/Application.mk | 5 ++++- support/android/apk/servoapp/build.gradle | 12 +++++++++++ support/android/apk/servoview/build.gradle | 14 ++++++++++++- 7 files changed, 58 insertions(+), 8 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 469b94256c1b1..0a62eff83fadc 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - arch: ['armv7-linux-androideabi', 'i686-linux-android'] + arch: ['armv7-linux-androideabi', 'i686-linux-android', 'x86_64-linux-android'] steps: - uses: actions/checkout@v4 if: github.event_name != 'issue_comment' && github.event_name != 'pull_request_target' diff --git a/python/servo/command_base.py b/python/servo/command_base.py index 63b61b07bf071..80b3cb6b36254 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -588,6 +588,19 @@ def build_android_env_if_needed(self, env: Dict[str, str]): def to_ndk_bin(prog): return path.join(llvm_toolchain, "bin", prog) + # This workaround is due to an issue in the x86_64 Android NDK that introduces + # an undefined reference to the symbol '__extendsftf2'. + # See https://github.com/termux/termux-packages/issues/8029#issuecomment-1369150244 + if "x86_64" in self.cross_compile_target: + libclangrt_filename = subprocess.run( + [to_ndk_bin(f"x86_64-linux-android{android_api}-clang"), "--print-libgcc-file-name"], + check=True, + capture_output=True, + encoding="utf8" + ).stdout + env['RUSTFLAGS'] = env.get('RUSTFLAGS', "") + env["RUSTFLAGS"] += f"-C link-arg={libclangrt_filename}" + env["RUST_TARGET"] = self.cross_compile_target env['HOST_CC'] = host_cc env['HOST_CXX'] = host_cxx @@ -910,7 +923,15 @@ def setup_configuration_for_android_target(self, target: str): self.config["android"]["toolchain_prefix"] = target self.config["android"]["arch"] = "x86" self.config["android"]["lib"] = "x86" - self.config["android"]["toolchain_name"] = "i686-linux-android30" + self.config["android"]["toolchain_name"] = "x86-linux-android30" + return True + elif target == "x86_64-linux-android": + self.config["android"]["platform"] = "android-30" + self.config["android"]["target"] = target + self.config["android"]["toolchain_prefix"] = target + self.config["android"]["arch"] = "x86_64" + self.config["android"]["lib"] = "x86_64" + self.config["android"]["toolchain_name"] = "x86_64-linux-android30" return True return False diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index 54afdd6a9e4bd..5e3a10059cc34 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -144,8 +144,8 @@ def package(self, build_type: BuildType, android=None, target=None, flavor=None, arch_string = "Arm64" elif "armv7" in android_target: arch_string = "Armv7" - elif "i686" in android_target: - arch_string = "x86" + elif "x86_64" in android_target: + arch_string = "x64" else: arch_string = "Arm" diff --git a/support/android/apk/build.gradle b/support/android/apk/build.gradle index c2619efb97877..0dd2538336a5a 100644 --- a/support/android/apk/build.gradle +++ b/support/android/apk/build.gradle @@ -27,7 +27,8 @@ ext.getRustTarget = { String arch -> switch (arch.toLowerCase()) { case 'armv7' : return 'armv7-linux-androideabi' case 'arm64' : return 'aarch64-linux-android' - case 'x86' : return 'i686-linux-android' + case 'x86': return 'x86-linux-android' + case 'x64': return 'x86_64-linux-android' default: throw new GradleException("Invalid target architecture " + arch) } } @@ -36,7 +37,8 @@ ext.getNDKAbi = { String arch -> switch (arch.toLowerCase()) { case 'armv7' : return 'armeabi-v7a' case 'arm64' : return 'arm64-v8a' - case 'x86' : return 'x86' + case 'x86': return 'x86' + case 'x64': return 'x86_64' default: throw new GradleException("Invalid target architecture " + arch) } } diff --git a/support/android/apk/jni/Application.mk b/support/android/apk/jni/Application.mk index 5b349f06d44bc..2a6cbd50ea79e 100644 --- a/support/android/apk/jni/Application.mk +++ b/support/android/apk/jni/Application.mk @@ -2,4 +2,7 @@ NDK_TOOLCHAIN_VERSION := clang APP_MODULES := c++_shared servojni APP_PLATFORM := android-30 APP_STL := c++_shared -APP_ABI := armeabi-v7a x86 +APP_ABI := armeabi-v7a x86 x86_64 +ifeq ($(NDK_DEBUG),1) + APP_STRIP_MODE := none +endif diff --git a/support/android/apk/servoapp/build.gradle b/support/android/apk/servoapp/build.gradle index 6e1cb514d268e..88f989bfdd875 100644 --- a/support/android/apk/servoapp/build.gradle +++ b/support/android/apk/servoapp/build.gradle @@ -97,6 +97,18 @@ android { abiFilters getNDKAbi('x86') } } + x64Debug { + initWith(debug) + ndk { + abiFilters getNDKAbi('x64') + } + } + x64Release { + initWith(release) + ndk { + abiFilters getNDKAbi('x64') + } + } } // Ignore default 'debug' and 'release' build types diff --git a/support/android/apk/servoview/build.gradle b/support/android/apk/servoview/build.gradle index 5898bb7bca242..f0511735fc515 100644 --- a/support/android/apk/servoview/build.gradle +++ b/support/android/apk/servoview/build.gradle @@ -76,6 +76,12 @@ android { x86Release { initWith(release) } + x64Debug { + initWith(debug) + } + x64Release { + initWith(release) + } } sourceSets { @@ -99,6 +105,12 @@ android { x86Release { jniLibs.srcDirs = [getJniLibsPath(false, 'x86')] } + x64Debug { + jniLibs.srcDirs = [getJniLibsPath(true, 'x64')] + } + x64Release { + jniLibs.srcDirs = [getJniLibsPath(false, 'x64')] + } } // Ignore default 'debug' and 'release' build types @@ -183,7 +195,7 @@ dependencies { ] // Iterate all build types and dependencies // For each dependency call the proper implementation command and set the correct dependency path - def list = ['armv7', 'arm64', 'x86'] + def list = ['armv7', 'arm64', 'x86', 'x64'] for (arch in list) { for (debug in [true, false]) { String basePath = getTargetDir(debug, arch) + "/build"