/* * Copyright (C) 2018 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 com.android.sdkparcelables import org.objectweb.asm.ClassReader import org.objectweb.asm.Opcodes import java.io.File import java.io.IOException import java.util.zip.ZipFile fun main(args: Array) { if (args.size != 2) { usage() } val zipFileName = args[0] val aidlFileName = args[1] val zipFile: ZipFile try { zipFile = ZipFile(zipFileName) } catch (e: IOException) { System.err.println("error reading input jar: ${e.message}") kotlin.system.exitProcess(2) } val ancestorCollector = AncestorCollector(Opcodes.ASM6, null) for (entry in zipFile.entries()) { if (entry.name.endsWith(".class")) { val reader = ClassReader(zipFile.getInputStream(entry)) reader.accept(ancestorCollector, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) } } val parcelables = ParcelableDetector.ancestorsToParcelables(ancestorCollector.ancestors) try { val outFile = File(aidlFileName) val outWriter = outFile.bufferedWriter() for (parcelable in parcelables) { outWriter.write("parcelable ") outWriter.write(parcelable.replace('/', '.').replace('$', '.')) outWriter.write(";\n") } outWriter.flush() } catch (e: IOException) { System.err.println("error writing output aidl: ${e.message}") kotlin.system.exitProcess(2) } } fun usage() { System.err.println("Usage: ") kotlin.system.exitProcess(1) }