1 /* <lambda>null2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tools.metalava.cli.signature 18 19 import com.android.tools.metalava.OptionsDelegate 20 import com.android.tools.metalava.cli.common.DefaultSignatureFileLoader 21 import com.android.tools.metalava.cli.common.MetalavaSubCommand 22 import com.android.tools.metalava.cli.common.existingFile 23 import com.android.tools.metalava.cli.common.newFile 24 import com.android.tools.metalava.cli.common.progressTracker 25 import com.android.tools.metalava.createReportFile 26 import com.android.tools.metalava.model.Codebase 27 import com.android.tools.metalava.model.text.SignatureFile 28 import com.android.tools.metalava.model.visitors.ApiPredicate 29 import com.android.tools.metalava.model.visitors.ApiType 30 import com.android.tools.metalava.model.visitors.FilteringApiVisitor 31 import com.github.ajalt.clikt.parameters.arguments.argument 32 import com.github.ajalt.clikt.parameters.arguments.multiple 33 import com.github.ajalt.clikt.parameters.options.option 34 import com.github.ajalt.clikt.parameters.options.required 35 36 const val ARG_OUT = "--out" 37 38 class SignatureToDexCommand : 39 MetalavaSubCommand( 40 help = "Convert API signature files into a file containing a list of DEX signatures.", 41 ) { 42 43 private val apiFiles by 44 argument( 45 name = "<api-file>", 46 help = "API signature files to convert to DEX signatures.", 47 ) 48 .existingFile() 49 .multiple(required = true) 50 51 private val outFile by 52 option( 53 ARG_OUT, 54 help = "Output DEX signatures file.", 55 ) 56 .newFile() 57 .required() 58 59 override fun run() { 60 // Make sure that none of the code called by this command accesses the global `options` 61 // property. 62 OptionsDelegate.disallowAccess() 63 64 val codebaseConfig = Codebase.Config.NOOP 65 val signatureFileLoader = DefaultSignatureFileLoader(codebaseConfig) 66 val signatureApi = signatureFileLoader.load(SignatureFile.fromFiles(apiFiles)) 67 68 val apiPredicateConfig = ApiPredicate.Config() 69 val apiType = ApiType.ALL 70 val apiFilters = apiType.getApiFilters(apiPredicateConfig) 71 72 createReportFile(progressTracker, signatureApi, outFile, "DEX API") { printWriter -> 73 DexApiWriter( 74 printWriter, 75 ) 76 .let { dexApiWriter -> 77 FilteringApiVisitor( 78 dexApiWriter, 79 inlineInheritedFields = true, 80 apiFilters = apiFilters, 81 preFiltered = signatureApi.preFiltered, 82 ) 83 } 84 } 85 } 86 } 87