| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8; |
| |
| import com.android.tools.r8.naming.ClassNameMapper; |
| import com.android.tools.r8.utils.FileUtils; |
| import com.android.tools.r8.utils.StringUtils; |
| import com.google.common.collect.Iterators; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.util.Iterator; |
| import java.util.function.Function; |
| import java.util.stream.Collectors; |
| |
| /** |
| * Utility for applying proguard map and sorting the main dex list. |
| */ |
| public class ReadMainDexList { |
| |
| private static final String DOT_CLASS = ".class"; |
| |
| private String stripDotClass(String name) { |
| return name.endsWith(DOT_CLASS) ? name.substring(0, name.length() - DOT_CLASS.length()) : name; |
| } |
| |
| private String toClassFilePath(String name) { |
| return name.replace('.', '/') + DOT_CLASS; |
| } |
| |
| private String toKeepRule(String className) { |
| return "-keep class " + className + " {}"; |
| } |
| |
| private String deobfuscateClassName(String name, ClassNameMapper mapper) { |
| if (mapper == null) { |
| return name; |
| } |
| return mapper.deobfuscateClassName(name); |
| } |
| |
| private void run(String[] args) throws Exception { |
| if (args.length < 1 || args.length > 3) { |
| throw new RuntimeException( |
| StringUtils.joinLines( |
| "Invalid invocation.", "Usage: command [-k] <main_dex_list> [<proguard_map>]")); |
| } |
| |
| Iterator<String> arguments = Iterators.forArray(args); |
| Function<String, String> outputGenerator; |
| String arg = arguments.next(); |
| if (arg.equals("-k")) { |
| outputGenerator = this::toKeepRule; |
| arg = arguments.next(); |
| } else { |
| outputGenerator = this::toClassFilePath; |
| } |
| Path mainDexList = Paths.get(arg); |
| |
| final ClassNameMapper mapper = |
| arguments.hasNext() ? ClassNameMapper.mapperFromFile(Paths.get(arguments.next())) : null; |
| |
| FileUtils.readAllLines(mainDexList) |
| .stream() |
| .map(this::stripDotClass) |
| .map(name -> name.replace('/', '.')) |
| .map(name -> deobfuscateClassName(name, mapper)) |
| .map(outputGenerator) |
| .sorted() |
| .collect(Collectors.toList()) |
| .forEach(System.out::println); |
| } |
| |
| public static void main(String[] args) throws Exception { |
| new ReadMainDexList().run(args); |
| } |
| } |