Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a95134ca authored by Yiming Pan's avatar Yiming Pan
Browse files

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
parent 3fc4d396
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
// 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",
    },
}
+58 −0
Original line number Diff line number Diff line
/*
 * 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()) }
}
+34 −0
Original line number Diff line number Diff line
/*
 * 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;
}