| /* |
| * Copyright (C) 2020 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.build.shrinker.obfuscation |
| |
| import com.google.common.collect.ImmutableMap |
| |
| /** Contains mappings between obfuscated classes and methods to original ones. */ |
| public class ObfuscatedClasses private constructor(builder: Builder) { |
| |
| public companion object { |
| @JvmField public val NO_OBFUSCATION: ObfuscatedClasses = Builder().build() |
| } |
| |
| private val obfuscatedClasses = ImmutableMap.copyOf(builder.obfuscatedClasses) |
| private val obfuscatedMethods = ImmutableMap.copyOf(builder.obfuscatedMethods) |
| |
| public fun resolveOriginalMethod(obfuscatedMethod: ClassAndMethod): ClassAndMethod { |
| return obfuscatedMethods.getOrElse(obfuscatedMethod) { |
| val realClassName = |
| obfuscatedClasses[obfuscatedMethod.className] ?: obfuscatedMethod.className |
| ClassAndMethod(realClassName, obfuscatedMethod.methodName) |
| } |
| } |
| |
| public fun resolveOriginalClass(obfuscatedClass: String): String { |
| return obfuscatedClasses[obfuscatedClass] ?: obfuscatedClass |
| } |
| |
| /** |
| * Builder that allows to build obfuscated mappings in a way when next method mapping is added to |
| * previous class mapping. Example: builder .addClassMapping(Pair(classA, obfuscatedClassA)) |
| * .addMethodMapping(Pair(classAMethod1, obfuscatedClassAMethod1)) |
| * .addMethodMapping(Pair(classAMethod2, obfuscatedClassAMethod2)) .addClassMapping(Pair(classB, |
| * obfuscatedClassB)) .addMethodMapping(Pair(classBMethod1, obfuscatedClassBMethod1)) |
| */ |
| public class Builder { |
| |
| public val obfuscatedClasses: MutableMap<String, String> = mutableMapOf() |
| public val obfuscatedMethods: MutableMap<ClassAndMethod, ClassAndMethod> = mutableMapOf() |
| |
| public var currentClassMapping: Pair<String, String>? = null |
| |
| /** |
| * Adds class mapping: original class name -> obfuscated class name. |
| * |
| * @param mapping Pair(originalClassName, obfuscatedClassName) |
| */ |
| public fun addClassMapping(mapping: Pair<String, String>): Builder { |
| currentClassMapping = mapping |
| obfuscatedClasses += Pair(mapping.second, mapping.first) |
| return this |
| } |
| |
| /** |
| * Adds method mapping: original method name -> obfuscated method name to the latest added class |
| * mapping. |
| * |
| * @param mapping Pair(originalMethodName, obfuscatedMethodName) |
| */ |
| public fun addMethodMapping(mapping: Pair<String, String>): Builder { |
| if (currentClassMapping != null) { |
| obfuscatedMethods += |
| Pair( |
| ClassAndMethod(currentClassMapping!!.second, mapping.second), |
| ClassAndMethod(currentClassMapping!!.first, mapping.first), |
| ) |
| } |
| return this |
| } |
| |
| public fun build(): ObfuscatedClasses = ObfuscatedClasses(this) |
| } |
| } |
| |
| public data class ClassAndMethod(val className: String, val methodName: String) |