Skip to content

Commit

Permalink
android x86_64 support
Browse files Browse the repository at this point in the history
  • Loading branch information
mukilan committed Mar 17, 2024
1 parent 8cfc6a1 commit 3b8936c
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 8 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
23 changes: 22 additions & 1 deletion python/servo/command_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions python/servo/package_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
6 changes: 4 additions & 2 deletions support/android/apk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand All @@ -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)
}
}
Expand Down
5 changes: 4 additions & 1 deletion support/android/apk/jni/Application.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 12 additions & 0 deletions support/android/apk/servoapp/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 13 additions & 1 deletion support/android/apk/servoview/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ android {
x86Release {
initWith(release)
}
x64Debug {
initWith(debug)
}
x64Release {
initWith(release)
}
}

sourceSets {
Expand All @@ -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
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit 3b8936c

Please sign in to comment.