| # 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, |
| ) |