diff options
author | 2023-11-15 00:26:25 +0000 | |
---|---|---|
committer | 2023-11-16 09:19:15 +0000 | |
commit | a95134ca6dda5f5e41562d55696918ab32ea07a1 (patch) | |
tree | 6c6826faa6181adcbc916972bd1326dc9e8eb068 /api/coverage | |
parent | 3fc4d3967e6f74ee11bafb1cde34b2ea4ba21d99 (diff) |
Extract the mapping of flags to APIs.
This CL creates a binary that extracts flagged APIs from an API
signature file, and writes the mapping of flags to APIs to a pb file.
Bug: 311059624
Test: mmm -j frameworks/base/api/coverage/tools/:extract-flagged-apis
extract-flagged-apis <input api.text file> <output pb file>
Change-Id: I9b6f45bd126cd6a5b2ed1e9f83bdaa12dd580480
Diffstat (limited to 'api/coverage')
-rw-r--r-- | api/coverage/tools/Android.bp | 32 | ||||
-rw-r--r-- | api/coverage/tools/ExtractFlaggedApis.kt | 58 | ||||
-rw-r--r-- | api/coverage/tools/extract_flagged_apis.proto | 34 |
3 files changed, 124 insertions, 0 deletions
diff --git a/api/coverage/tools/Android.bp b/api/coverage/tools/Android.bp new file mode 100644 index 000000000000..3e169120dc48 --- /dev/null +++ b/api/coverage/tools/Android.bp @@ -0,0 +1,32 @@ +// 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. + +java_binary_host { + name: "extract-flagged-apis", + srcs: ["ExtractFlaggedApis.kt"], + main_class: "android.platform.coverage.ExtractFlaggedApisKt", + static_libs: [ + "metalava-signature-reader", + "extract_flagged_apis_proto", + ], +} + +java_library_host { + name: "extract_flagged_apis_proto", + srcs: ["extract_flagged_apis.proto"], + static_libs: ["libprotobuf-java-full"], + proto: { + type: "full", + }, +} diff --git a/api/coverage/tools/ExtractFlaggedApis.kt b/api/coverage/tools/ExtractFlaggedApis.kt new file mode 100644 index 000000000000..948e64f22f20 --- /dev/null +++ b/api/coverage/tools/ExtractFlaggedApis.kt @@ -0,0 +1,58 @@ +/* + * 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. + */ + +package android.platform.coverage + +import com.android.tools.metalava.model.text.ApiFile +import java.io.File +import java.io.FileWriter + +/** Usage: extract-flagged-apis <api text file> <output .pb file> */ +fun main(args: Array<String>) { + var cb = ApiFile.parseApi(listOf(File(args[0]))) + val flagToApi = mutableMapOf<String, MutableList<String>>() + cb.getPackages() + .allTopLevelClasses() + .filter { it.methods().size > 0 } + .forEach { + for (method in it.methods()) { + val flagValue = + method.modifiers + .findAnnotation("android.annotation.FlaggedApi") + ?.findAttribute("value") + ?.value + ?.value() + if (flagValue != null && flagValue is String) { + val methodQualifiedName = "${it.qualifiedName()}.${method.name()}" + if (flagToApi.containsKey(flagValue)) { + flagToApi.get(flagValue)?.add(methodQualifiedName) + } else { + flagToApi.put(flagValue, mutableListOf(methodQualifiedName)) + } + } + } + } + var builder = FlagApiMap.newBuilder() + for (flag in flagToApi.keys) { + var flaggedApis = FlaggedApis.newBuilder() + for (method in flagToApi.get(flag).orEmpty()) { + flaggedApis.addFlaggedApi(FlaggedApi.newBuilder().setQualifiedName(method)) + } + builder.putFlagToApi(flag, flaggedApis.build()) + } + val flagApiMap = builder.build() + FileWriter(args[1]).use { it.write(flagApiMap.toString()) } +} diff --git a/api/coverage/tools/extract_flagged_apis.proto b/api/coverage/tools/extract_flagged_apis.proto new file mode 100644 index 000000000000..a858108a27b2 --- /dev/null +++ b/api/coverage/tools/extract_flagged_apis.proto @@ -0,0 +1,34 @@ +/* + * 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. + */ + +syntax = "proto3"; + +package android.platform.coverage; + +option java_multiple_files = true; + +message FlagApiMap { + map<string, FlaggedApis> flag_to_api = 1; +} + +message FlaggedApis { + repeated FlaggedApi flagged_api = 1; +} + +message FlaggedApi { + string qualified_name = 1; +} + |