Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve the logic to compile for Android #44949

Merged
merged 1 commit into from
Feb 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 57 additions & 4 deletions platform/android/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def get_name():


def can_build():
return "ANDROID_NDK_ROOT" in os.environ
return ("ANDROID_NDK_ROOT" in os.environ) or ("ANDROID_SDK_ROOT" in os.environ) or ("ANDROID_HOME" in os.environ)


def get_platform(platform):
Expand All @@ -24,13 +24,36 @@ def get_opts():
from SCons.Variables import BoolVariable, EnumVariable

return [
("ANDROID_NDK_ROOT", "Path to the Android NDK", os.environ.get("ANDROID_NDK_ROOT", 0)),
("ANDROID_NDK_ROOT", "Path to the Android NDK", get_android_ndk_root()),
("ANDROID_SDK_ROOT", "Path to the Android SDK", get_android_sdk_root()),
("ndk_platform", 'Target platform (android-<api>, e.g. "android-24")', "android-24"),
EnumVariable("android_arch", "Target architecture", "armv7", ("armv7", "arm64v8", "x86", "x86_64")),
BoolVariable("android_neon", "Enable NEON support (armv7 only)", True),
]


# Return the ANDROID_SDK_ROOT environment variable.
# While ANDROID_HOME has been deprecated, it's used as a fallback for backward
# compatibility purposes.
def get_android_sdk_root():
if "ANDROID_SDK_ROOT" in os.environ:
return os.environ.get("ANDROID_SDK_ROOT", 0)
else:
return os.environ.get("ANDROID_HOME", 0)


# Return the ANDROID_NDK_ROOT environment variable.
# If the env variable is already defined, we use it with the expectation that
# the user knows what they're doing (e.g: testing a new NDK version).
# Otherwise, we generate one for this build using the ANDROID_SDK_ROOT env
# variable and the project ndk version.
def get_android_ndk_root():
if "ANDROID_NDK_ROOT" in os.environ:
return os.environ.get("ANDROID_NDK_ROOT", 0)
else:
return get_android_sdk_root() + "/ndk/" + get_project_ndk_version()


def get_flags():
return [
("tools", False),
Expand All @@ -47,7 +70,31 @@ def create(env):
return env.Clone(tools=tools)


# Check if ANDROID_NDK_ROOT is valid.
# If not, install the ndk using ANDROID_SDK_ROOT and sdkmanager.
def install_ndk_if_needed(env):
print("Checking for Android NDK...")
env_ndk_version = get_env_ndk_version(env["ANDROID_NDK_ROOT"])
if env_ndk_version is None:
# Reinstall the ndk and update ANDROID_NDK_ROOT.
print("Installing Android NDK...")
if env["ANDROID_SDK_ROOT"] is None:
raise Exception("Invalid ANDROID_SDK_ROOT environment variable.")

import subprocess

extension = ".bat" if os.name == "nt" else ""
sdkmanager_path = env["ANDROID_SDK_ROOT"] + "/cmdline-tools/latest/bin/sdkmanager" + extension
ndk_download_args = "ndk;" + get_project_ndk_version()
subprocess.check_call([sdkmanager_path, ndk_download_args])

env["ANDROID_NDK_ROOT"] = env["ANDROID_SDK_ROOT"] + "/ndk/" + get_project_ndk_version()
print("ANDROID_NDK_ROOT: " + env["ANDROID_NDK_ROOT"])


def configure(env):
install_ndk_if_needed(env)

# Workaround for MinGW. See:
# http://www.scons.org/wiki/LongCmdLinesOnWin32
if os.name == "nt":
Expand Down Expand Up @@ -270,7 +317,7 @@ def mySpawn(sh, escape, cmd, args, env):

# Link flags

ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"])
ndk_version = get_env_ndk_version(env["ANDROID_NDK_ROOT"])
if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"):
env.Append(LINKFLAGS=["-Wl,--exclude-libs,libgcc.a", "-Wl,--exclude-libs,libatomic.a", "-nostdlib++"])
else:
Expand Down Expand Up @@ -323,8 +370,14 @@ def mySpawn(sh, escape, cmd, args, env):
env.Append(LIBS=["OpenSLES", "EGL", "GLESv2", "vulkan", "android", "log", "z", "dl"])


# Return the project NDK version.
# This is kept in sync with the value in 'platform/android/java/app/config.gradle'.
def get_project_ndk_version():
return "21.3.6528147"


# Return NDK version string in source.properties (adapted from the Chromium project).
def get_ndk_version(path):
def get_env_ndk_version(path):
if path is None:
return None
prop_file_path = os.path.join(path, "source.properties")
Expand Down
2 changes: 2 additions & 0 deletions platform/android/java/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ android {
disable 'MissingTranslation', 'UnusedResources'
}

ndkVersion versions.ndkVersion

packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
Expand Down
3 changes: 2 additions & 1 deletion platform/android/java/app/config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ ext.versions = [
supportCoreUtils : '1.0.0',
kotlinVersion : '1.4.10',
v4Support : '1.0.0',
javaVersion : 1.8
javaVersion : 1.8,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That might be the reason for all my JDK 11 troubles :|

ndkVersion : '21.3.6528147' // Also update 'platform/android/detect.py#get_project_ndk_version()' when this is updated.

]

Expand Down
2 changes: 2 additions & 0 deletions platform/android/java/nativeSrcsConfigs/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ android {
}
}

ndkVersion versions.ndkVersion

externalNativeBuild {
cmake {
path "CMakeLists.txt"
Expand Down