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