blob: 4061e686e2a90be67a23b9628a8449ea6abf1dca [file] [log] [blame]
// 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);
}
}