// 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.naming.ProguardMapReader; import com.android.tools.r8.utils.FileUtils; import java.nio.file.Paths; import java.util.stream.Collectors; /** * Utility for applying proguard map and sorting the main dex list. */ public class ReadMainDexList { private 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 addDotClass(String name) { return name + DOT_CLASS; } 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 != 2) { System.out.println("Usage: command []"); System.exit(0); } final ClassNameMapper mapper = args.length == 2 ? ProguardMapReader.mapperFromFile(Paths.get(args[1])) : null; FileUtils.readTextFile(Paths.get(args[0])) .stream() .map(this::stripDotClass) .map(name -> name.replace('/', '.')) .map(name -> deobfuscateClassName(name, mapper)) .map(name -> name.replace('.', '/')) .map(this::addDotClass) .sorted() .collect(Collectors.toList()) .forEach(System.out::println); } public static void main(String[] args) throws Exception { new ReadMainDexList().run(args); } }