xref: /aosp_15_r20/prebuilts/sdk/utils.bzl (revision 344a7f5ef16c479e7a7f54ee6567a9d112f9e72b)
1# Copyright (C) 2023 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Constants and utility functions relating to prebuilt SDKs.
16"""
17
18load("//build/bazel/rules/common:api.bzl", "api")
19load("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
20
21# The highest numbered directory under prebuilts/sdk that provides an android.jar
22_MAX_API_LEVEL = 34
23
24# All api levels that have a prebuilt SDK.
25_API_LEVELS = list(range(4, _MAX_API_LEVEL + 1)) + [api.FUTURE_API_LEVEL]
26
27def _available_kinds_for_api_level(api_level):
28    """Return the available SDK kinds (or scopes) under the given api level directory."""
29    if api_level not in _API_LEVELS:
30        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
31    if api_level == api.FUTURE_API_LEVEL:
32        return [
33            sdk_version.KIND_PUBLIC,
34            sdk_version.KIND_SYSTEM,
35            sdk_version.KIND_TEST,
36            sdk_version.KIND_SYSTEM_SERVER,
37            sdk_version.KIND_MODULE,
38            sdk_version.KIND_CORE,
39        ]
40    if api_level <= 20:
41        return [sdk_version.KIND_PUBLIC]
42    if api_level <= 28:
43        return [
44            sdk_version.KIND_PUBLIC,
45            sdk_version.KIND_SYSTEM,
46        ]
47    if api_level == 29:
48        return [
49            sdk_version.KIND_PUBLIC,
50            sdk_version.KIND_SYSTEM,
51            sdk_version.KIND_TEST,
52        ]
53    return [
54        sdk_version.KIND_PUBLIC,
55        sdk_version.KIND_SYSTEM,
56        sdk_version.KIND_TEST,
57        sdk_version.KIND_SYSTEM_SERVER,
58        sdk_version.KIND_MODULE,
59    ]
60
61# core-for-system-modules public starts at v30, module starts at v33.
62def _available_core_kinds_for_api_level(api_level):
63    """Return all core module kinds available for a given api level."""
64    if api_level not in _API_LEVELS:
65        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
66    if api_level == api.FUTURE_API_LEVEL:
67        return [
68            sdk_version.KIND_PUBLIC,
69            sdk_version.KIND_MODULE,
70        ]
71    if api_level <= 29:
72        return []
73    if api_level <= 32:
74        return [sdk_version.KIND_PUBLIC]
75    return [
76        sdk_version.KIND_PUBLIC,
77        sdk_version.KIND_MODULE,
78    ]
79
80def _to_core_kind(kind, api_level):
81    """Returns the core kind corresponding to the input kind and api level."""
82    if api_level not in _API_LEVELS:
83        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
84    if api_level == api.FUTURE_API_LEVEL:
85        return (
86            sdk_version.KIND_MODULE if kind in (
87                sdk_version.KIND_MODULE,
88                sdk_version.KIND_SYSTEM_SERVER,
89            ) else sdk_version.KIND_PUBLIC
90        )
91    if api_level <= 29:
92        return None
93    if api_level <= 32:
94        return sdk_version.KIND_PUBLIC
95    return (
96        sdk_version.KIND_MODULE if kind in (
97            sdk_version.KIND_MODULE,
98            sdk_version.KIND_SYSTEM_SERVER,
99        ) else sdk_version.KIND_PUBLIC
100    )
101
102def _to_aidl_kind(kind, api_level):
103    """Returns the best available framework.aidl prebuilt kind for the given kind X api level."""
104    if api_level not in _API_LEVELS:
105        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
106    if api_level == api.FUTURE_API_LEVEL:
107        return sdk_version.KIND_PUBLIC
108
109    # Only 23 and 28 provide framework.aidl for system.
110    if api_level in (23, 28) and kind == sdk_version.KIND_SYSTEM:
111        return sdk_version.KIND_SYSTEM
112    return sdk_version.KIND_PUBLIC
113
114def _to_kind_dir(kind):
115    """Maps kind as specified in sdk_version with the corresponding directory under prebuilt/sdk"""
116    if kind == sdk_version.KIND_MODULE:
117        return "module-lib"
118    if kind == sdk_version.KIND_SYSTEM_SERVER:
119        return "system-server"
120    return kind
121
122prebuilt_sdk_utils = struct(
123    MAX_API_LEVEL = _MAX_API_LEVEL,
124    API_LEVELS = _API_LEVELS,
125    available_kinds_for_api_level = _available_kinds_for_api_level,
126    available_core_kinds_for_api_level = _available_core_kinds_for_api_level,
127    to_core_kind = _to_core_kind,
128    to_aidl_kind = _to_aidl_kind,
129    to_kind_dir = _to_kind_dir,
130)
131