blob: 607d764a576e2dcddc9b266e6a396ab8443d988d [file] [log] [blame]
# Copyright (C) 2023 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Constants and utility functions relating to prebuilt SDKs.
"""
load("//build/bazel/rules/common:api.bzl", "api")
load("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
# The highest numbered directory under prebuilts/sdk that provides an android.jar
_MAX_API_LEVEL = 34
# All api levels that have a prebuilt SDK.
_API_LEVELS = list(range(4, _MAX_API_LEVEL + 1)) + [api.FUTURE_API_LEVEL]
def _available_kinds_for_api_level(api_level):
"""Return the available SDK kinds (or scopes) under the given api level directory."""
if api_level not in _API_LEVELS:
fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
if api_level == api.FUTURE_API_LEVEL:
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_SYSTEM,
sdk_version.KIND_TEST,
sdk_version.KIND_SYSTEM_SERVER,
sdk_version.KIND_MODULE,
sdk_version.KIND_CORE,
]
if api_level <= 20:
return [sdk_version.KIND_PUBLIC]
if api_level <= 28:
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_SYSTEM,
]
if api_level == 29:
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_SYSTEM,
sdk_version.KIND_TEST,
]
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_SYSTEM,
sdk_version.KIND_TEST,
sdk_version.KIND_SYSTEM_SERVER,
sdk_version.KIND_MODULE,
]
# core-for-system-modules public starts at v30, module starts at v33.
def _available_core_kinds_for_api_level(api_level):
"""Return all core module kinds available for a given api level."""
if api_level not in _API_LEVELS:
fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
if api_level == api.FUTURE_API_LEVEL:
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_MODULE,
]
if api_level <= 29:
return []
if api_level <= 32:
return [sdk_version.KIND_PUBLIC]
return [
sdk_version.KIND_PUBLIC,
sdk_version.KIND_MODULE,
]
def _to_core_kind(kind, api_level):
"""Returns the core kind corresponding to the input kind and api level."""
if api_level not in _API_LEVELS:
fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
if api_level == api.FUTURE_API_LEVEL:
return (
sdk_version.KIND_MODULE if kind in (
sdk_version.KIND_MODULE,
sdk_version.KIND_SYSTEM_SERVER,
) else sdk_version.KIND_PUBLIC
)
if api_level <= 29:
return None
if api_level <= 32:
return sdk_version.KIND_PUBLIC
return (
sdk_version.KIND_MODULE if kind in (
sdk_version.KIND_MODULE,
sdk_version.KIND_SYSTEM_SERVER,
) else sdk_version.KIND_PUBLIC
)
def _to_aidl_kind(kind, api_level):
"""Returns the best available framework.aidl prebuilt kind for the given kind X api level."""
if api_level not in _API_LEVELS:
fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
if api_level == api.FUTURE_API_LEVEL:
return sdk_version.KIND_PUBLIC
# Only 23 and 28 provide framework.aidl for system.
if api_level in (23, 28) and kind == sdk_version.KIND_SYSTEM:
return sdk_version.KIND_SYSTEM
return sdk_version.KIND_PUBLIC
def _to_kind_dir(kind):
"""Maps kind as specified in sdk_version with the corresponding directory under prebuilt/sdk"""
if kind == sdk_version.KIND_MODULE:
return "module-lib"
if kind == sdk_version.KIND_SYSTEM_SERVER:
return "system-server"
return kind
prebuilt_sdk_utils = struct(
MAX_API_LEVEL = _MAX_API_LEVEL,
API_LEVELS = _API_LEVELS,
available_kinds_for_api_level = _available_kinds_for_api_level,
available_core_kinds_for_api_level = _available_core_kinds_for_api_level,
to_core_kind = _to_core_kind,
to_aidl_kind = _to_aidl_kind,
to_kind_dir = _to_kind_dir,
)