diff --git a/cmake/Tools/Platform/Android/android_support.py b/cmake/Tools/Platform/Android/android_support.py index 54f1a4c8f4..de33b59907 100755 --- a/cmake/Tools/Platform/Android/android_support.py +++ b/cmake/Tools/Platform/Android/android_support.py @@ -1548,17 +1548,32 @@ class AndroidSDKResolver(object): self.version = LooseVersion(available_update_components[1]) self.available = available_update_components[2] - def __init__(self, android_sdk_path): + def __init__(self, android_sdk_path, command_line_tools_version): self.android_sdk_path = android_sdk_path or os.environ.get(ANDROID_SDK_ENV_NAME) if not self.android_sdk_path: raise common.LmbrCmdError(f"Android SDK path not set or it was not passed into the command to generate the android project") if not os.path.isdir(self.android_sdk_path): raise common.LmbrCmdError(f"Android SDK path {self.android_sdk_path} is not valid") + + sdk_root = pathlib.Path(self.android_sdk_path) + + tools_path = sdk_root / 'cmdline-tools' + if tools_path.exists(): + tools_path = tools_path / command_line_tools_version + if not tools_path.exists(): + raise common.LmbrCmdError(f"The desired version of the Android 'cmdline-tools' ({command_line_tools_version}) is not detected") + else: + tools_path = sdk_root / 'tools' + + ext = '' if platform.system() == 'Windows': - self.sdk_manager_path = pathlib.Path(self.android_sdk_path) / 'tools' / 'bin' / 'sdkmanager.bat' + ext = '.bat' else: raise common.LmbrCmdError(f"This tool is not supported on the current platform {platform.system()}") + + self.sdk_manager_path = tools_path / 'bin' / f'sdkmanager{ext}' + if not self.sdk_manager_path.is_file(): raise common.LmbrCmdError(f"Android SDK path {self.android_sdk_path} is not valid or complete. Missing {self.sdk_manager_path}") diff --git a/cmake/Tools/Platform/Android/generate_android_project.py b/cmake/Tools/Platform/Android/generate_android_project.py index d8f1021590..572ad1cd37 100755 --- a/cmake/Tools/Platform/Android/generate_android_project.py +++ b/cmake/Tools/Platform/Android/generate_android_project.py @@ -102,6 +102,7 @@ def build_optional_signing_profile(store_file, store_password, key_alias, key_pa ANDROID_SDK_ARGUMENT_NAME = '--android-sdk-path' ANDROID_SDK_PLATFORM_ARGUMENT_NAME = '--android-sdk-platform' ANDROID_SDK_PREFERRED_TOOL_VER = '--android-sdk-build-tool-version' +ANDROID_SDK_COMMAND_LINE_TOOLS_VER = '--android-sdk-command-line-tools-version' ANDROID_NATIVE_API_LEVEL = '--android-native-api-level' @@ -185,6 +186,11 @@ def main(args): default=-1) # Override arguments + parser.add_argument(ANDROID_SDK_COMMAND_LINE_TOOLS_VER, + default='latest', + help='The android SDK command line tools version.', + required=False) + parser.add_argument(ANDROID_SDK_PREFERRED_TOOL_VER, help='The android SDK build tools version.', required=False) @@ -304,7 +310,8 @@ def main(args): f"({android_gradle_plugin_version}).") # Use the SDK Resolver to make sure the build tools and ndk - android_sdk = android_support.AndroidSDKResolver(android_sdk_path=parsed_args.get_argument(ANDROID_SDK_ARGUMENT_NAME)) + android_sdk = android_support.AndroidSDKResolver(android_sdk_path=parsed_args.get_argument(ANDROID_SDK_ARGUMENT_NAME), + command_line_tools_version=parsed_args.get_argument(ANDROID_SDK_COMMAND_LINE_TOOLS_VER)) # If no SDK platform is provided, check for any installed one if android_sdk_platform_version < 0: