131 lines
4.6 KiB
Python
131 lines
4.6 KiB
Python
|
|
# 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 = 33
|
||
|
|
|
||
|
|
# 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,
|
||
|
|
)
|