1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java
index f66fff8f3..c63f4f566 100644
--- a/src/main/java/com/android/tools/r8/D8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/D8CommandParser.java
@@ -205,7 +205,7 @@ public class D8CommandParser extends BaseCompilerCommandParser<D8Command, D8Comm
}
compilationMode = CompilationMode.RELEASE;
} else if (arg.equals("--file-per-class")) {
- outputMode = OutputMode.DexFilePerClass;
+ outputMode = OutputMode.DexFilePerClassFile;
} else if (arg.equals("--output")) {
if (outputPath != null) {
builder.error(
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 4051f9cef..6d034d5b8 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -42,6 +42,8 @@ import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
+import com.android.tools.r8.DexIndexedConsumer.DirectoryConsumer;
+
/**
* Immutable command structure for an invocation of the {@link R8} compiler.
*
@@ -234,6 +236,15 @@ public final class R8Command extends BaseCompilerCommand {
return self();
}
+ public Builder addFeatureJar(Path inputJarPath, Path outputPath) {
+ addFeatureSplit(splitBuilder ->
+ splitBuilder
+ .addProgramResourceProvider(ArchiveProgramResourceProvider.fromArchive(inputJarPath))
+ .setProgramConsumer(new DirectoryConsumer(outputPath))
+ .build());
+ return self();
+ }
+
/**
* Set a consumer for receiving the proguard-map content.
*
diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java
index 22ebb5e42..b53e4c59e 100644
--- a/src/main/java/com/android/tools/r8/R8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/R8CommandParser.java
@@ -24,6 +24,7 @@ public class R8CommandParser extends BaseCompilerCommandParser<R8Command, R8Comm
"--min-api",
"--main-dex-rules",
"--main-dex-list",
+ "--feature-jar",
"--main-dex-list-output",
"--pg-conf",
"--pg-map-output",
@@ -205,6 +206,11 @@ public class R8CommandParser extends BaseCompilerCommandParser<R8Command, R8Comm
builder.setDisableDesugaring(true);
} else if (arg.equals("--main-dex-rules")) {
builder.addMainDexRulesFiles(Paths.get(nextArg));
+ } else if (arg.equals("--feature-jar")) {
+ String[] argParts = nextArg.split(":");
+ String featureJarInputPath = argParts[0];
+ String featureJarOutputPath = argParts[1];
+ builder.addFeatureJar(Paths.get(featureJarInputPath), Paths.get(featureJarOutputPath));
} else if (arg.equals("--main-dex-list")) {
builder.addMainDexListFiles(Paths.get(nextArg));
} else if (arg.equals("--main-dex-list-output")) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 0831e6d93..49c1a202b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -206,7 +206,7 @@ public final class LambdaClass {
}
public final boolean isStateless() {
- return descriptor.isStateless();
+ return false; // descriptor.isStateless();
}
void addSynthesizedFrom(DexProgramClass clazz) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 232b54a54..fd45dfe36 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -198,8 +198,8 @@ public class InternalOptions {
public boolean enableFieldAssignmentTracker = true;
public boolean enableFieldBitAccessAnalysis =
System.getProperty("com.android.tools.r8.fieldBitAccessAnalysis") != null;
- public boolean enableHorizontalClassMerging = true;
- public boolean enableVerticalClassMerging = true;
+ public boolean enableHorizontalClassMerging = System.getProperty("com.android.tools.r8.enableHorizontalClassMerging") != null;
+ public boolean enableVerticalClassMerging = System.getProperty("com.android.tools.r8.enableVerticalClassMerging") != null;
public boolean enableArgumentRemoval = true;
public boolean enableUnusedArgumentRemoval = true;
public boolean enableUnusedInterfaceRemoval = true;
@@ -956,7 +956,7 @@ public class InternalOptions {
public static final String CLASS_NAME = "com.android.tools.r8.GeneratedOutlineSupport";
public static final String METHOD_PREFIX = "outline";
- public boolean enabled = true;
+ public boolean enabled = System.getProperty("com.android.tools.r8.disableOutlining") == null;
public int minSize = 3;
public int maxSize = 99;
public int threshold = 20;
diff --git a/src/main/keep.txt b/src/main/keep.txt
index b0c58c916..5e4405175 100644
--- a/src/main/keep.txt
+++ b/src/main/keep.txt
@@ -27,4 +27,10 @@
-keep public class com.android.tools.r8.compatproguard.CompatProguard { public static void main(java.lang.String[]); }
# Compatibility command line program used by in google3.
--keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); }
\ No newline at end of file
+-keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); }
+
+-keep public class com.android.tools.r8.SwissArmyKnife { *; }
+
+# Chrome: We want to maintain stack traces from the R8 tool, so disable
+# optimizations.
+-dontoptimize
|