Merge "Test visibility bridge methods after inlining"
diff --git a/build.gradle b/build.gradle
index 7ff46eb..272fcdd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -255,9 +255,10 @@
}
def r8LibPath = "$buildDir/libs/r8lib.jar"
+def r8LibExludeDepsPath = "$buildDir/libs/r8lib-exclude-deps.jar"
def r8LibGeneratedKeepRulesPath = "$buildDir/generated/keep.txt"
+def r8LibGeneratedKeepRulesExcludeDepsPath = "$buildDir/generated/keep-exclude-deps.txt"
def r8LibTestPath = "$buildDir/classes/r8libtest"
-def r8TestsJarPath = "$buildDir/libs/r8tests.jar"
def osString = OperatingSystem.current().isLinux() ? "linux" :
OperatingSystem.current().isMacOsX() ? "mac" : "windows"
@@ -363,8 +364,7 @@
def outputDir = "${entry.key}/${entryFile}"
def gzFile = "${outputDir}.tar.gz"
def sha1File = "${gzFile}.sha1"
- inputs.file sha1File
- outputs.file gzFile
+ inputs.files files(sha1File, gzFile)
outputs.dir outputDir
executable "bash"
args "-c", "tools/download_from_x20.py ${sha1File}"
@@ -674,7 +674,6 @@
}
task testJar(type: ShadowJar, dependsOn: testClasses) {
- outputs.upToDateWhen { false }
baseName = "r8tests"
from sourceSets.test.output
if (!project.hasProperty('exclude_deps')) {
@@ -682,24 +681,30 @@
}
}
-task generateR8LibKeepRules(type: Exec) {
- doFirst {
- standardOutput new FileOutputStream(r8LibGeneratedKeepRulesPath)
+task testJarNoDeps(type: ShadowJar, dependsOn: testClasses) {
+ baseName = "r8tests-exclude-deps"
+ from sourceSets.test.output
+}
+
+def generateR8LibKeepRules(name, r8Source, testSource, output) {
+ return tasks.create("generateR8LibKeepRules_" + name, Exec) {
+ doFirst {
+ standardOutput new FileOutputStream(output)
+ }
+ dependsOn r8WithRelocatedDeps
+ dependsOn r8Source
+ dependsOn testSource
+ dependsOn downloadOpenJDKrt
+ inputs.files ([r8WithRelocatedDeps.outputs, r8Source.outputs, testSource.outputs])
+ outputs.file output
+ commandLine baseR8CommandLine([
+ "printuses",
+ "--keeprules",
+ "third_party/openjdk/openjdk-rt-1.8/rt.jar",
+ r8Source.outputs.files[0],
+ testSource.outputs.files[0]])
+ workingDir = projectDir
}
- def libSourceTask = project.hasProperty('exclude_deps') ? R8NoManifestNoDeps : R8NoManifest
- dependsOn r8WithRelocatedDeps
- dependsOn libSourceTask
- dependsOn testJar
- dependsOn downloadOpenJDKrt
- inputs.files ([r8WithRelocatedDeps.outputs, libSourceTask.outputs, testJar.outputs])
- outputs.file r8LibGeneratedKeepRulesPath
- commandLine baseR8CommandLine([
- "printuses",
- "--keeprules",
- "third_party/openjdk/openjdk-rt-1.8/rt.jar",
- libSourceTask.outputs.files[0],
- testJar.outputs.files[0]])
- workingDir = projectDir
}
task R8LibApiOnly {
@@ -707,29 +712,40 @@
outputs.file r8LibPath
}
-task R8LibNoDeps {
- dependsOn r8LibCreateTask(
- "NoDeps",
- "src/main/keep.txt",
- R8NoManifestNoDeps,
- r8LibPath,
- ["--pg-conf", generateR8LibKeepRules.outputs.files[0]],
- repackageDepsNoRelocate.outputs.files
- ).dependsOn(repackageDepsNoRelocate, generateR8LibKeepRules)
- outputs.file r8LibPath
-}
-
task R8Lib {
+ def genRulesTask = generateR8LibKeepRules(
+ "Main",
+ R8NoManifest,
+ testJar,
+ r8LibGeneratedKeepRulesPath)
dependsOn r8LibCreateTask(
"Main",
"src/main/keep.txt",
R8NoManifest,
r8LibPath,
- ["--pg-conf", generateR8LibKeepRules.outputs.files[0]]
- ).dependsOn(generateR8LibKeepRules)
+ ["--pg-conf", genRulesTask.outputs.files[0]]
+ ).dependsOn(genRulesTask)
outputs.file r8LibPath
}
+task R8LibNoDeps {
+ def genRulesTask = generateR8LibKeepRules(
+ "NoDeps",
+ R8NoManifestNoDeps,
+ testJarNoDeps,
+ r8LibGeneratedKeepRulesExcludeDepsPath
+ )
+ dependsOn r8LibCreateTask(
+ "NoDeps",
+ "src/main/keep.txt",
+ R8NoManifestNoDeps,
+ r8LibExludeDepsPath,
+ ["--pg-conf", genRulesTask.outputs.files[0]],
+ repackageDepsNoRelocate.outputs.files
+ ).dependsOn(repackageDepsNoRelocate, genRulesTask)
+ outputs.file r8LibExludeDepsPath
+}
+
task CompatDxLib {
dependsOn r8LibCreateTask(
"CompatDx", "src/main/keep-compatdx.txt", CompatDx, "build/libs/compatdxlib.jar")
@@ -1413,7 +1429,7 @@
task configureTestForR8Lib(type: Copy) {
dependsOn testJar
- inputs.file r8TestsJarPath
+ inputs.file "$buildDir/libs/r8tests.jar"
if (getR8LibTask() != null) {
dependsOn getR8LibTask()
delete r8LibTestPath
diff --git a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
index 0c838ac..e3fa01b 100644
--- a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
+++ b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
@@ -16,9 +16,11 @@
InvokedFrom,
InvokedFromLambdaCreatedIn,
ReferencedFrom,
+ ReflectiveUseFrom,
ReachableFromLiveType,
ReferencedInAnnotation,
IsLibraryMethod,
+ MethodHandleUseFrom
}
private final EdgeKind kind;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 97023f2..5aa2ee4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -685,9 +685,7 @@
public DexEncodedMethod toStaticMethodWithoutThis() {
checkIfObsolete();
assert !accessFlags.isStatic();
- Builder builder = builder(this);
- builder.setStatic();
- builder.withoutThisParameter();
+ Builder builder = builder(this).setStatic().unsetOptimizationInfo().withoutThisParameter();
setObsolete();
return builder.build();
}
@@ -1257,17 +1255,24 @@
this.method = method;
}
- public void setStatic() {
+ public Builder setStatic() {
this.accessFlags.setStatic();
+ return this;
}
- public void withoutThisParameter() {
+ public Builder unsetOptimizationInfo() {
+ optimizationInfo = DefaultOptimizationInfoImpl.DEFAULT_INSTANCE;
+ return this;
+ }
+
+ public Builder withoutThisParameter() {
assert code != null;
if (code.isDexCode()) {
code = code.asDexCode().withoutThisParameter();
} else {
throw new Unreachable("Code " + code.getClass().getSimpleName() + " is not supported.");
}
+ return this;
}
public void setCode(Code code) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index ba01321..5938781 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize;
import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
+import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.CANONICAL_NAME;
import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.NAME;
import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.SIMPLE_NAME;
@@ -14,6 +15,7 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
@@ -155,6 +157,7 @@
public final IRConverter converter;
private final AppInfo appInfo;
+ private final AppView<? extends AppInfo> appView;
private final DexItemFactory dexItemFactory;
private final Set<DexMethod> libraryMethodsReturningReceiver;
private final InternalOptions options;
@@ -165,6 +168,7 @@
InternalOptions options) {
this.converter = converter;
this.appInfo = converter.appInfo;
+ this.appView = converter.appView;
this.options = options;
this.dexItemFactory = appInfo.dexItemFactory;
this.libraryMethodsReturningReceiver = libraryMethodsReturningReceiver;
@@ -1571,20 +1575,31 @@
}
}
- private boolean checkArgumentType(InvokeMethod invoke, DexMethod target, int argumentIndex) {
- DexType returnType = invoke.getInvokedMethod().proto.returnType;
+ private boolean checkArgumentType(InvokeMethod invoke, int argumentIndex) {
// TODO(sgjesse): Insert cast if required.
- if (invoke.isInvokeStatic()) {
- return invoke.getInvokedMethod().proto.parameters.values[argumentIndex] == returnType;
+ TypeLatticeElement returnType =
+ TypeLatticeElement.fromDexType(
+ invoke.getInvokedMethod().proto.returnType, maybeNull(), appInfo);
+ TypeLatticeElement argumentType =
+ TypeLatticeElement.fromDexType(
+ getArgumentType(invoke, argumentIndex), maybeNull(), appInfo);
+ if (appView != null && appView.enableWholeProgramOptimizations()) {
+ return argumentType.lessThanOrEqual(returnType, appInfo);
} else {
- if (argumentIndex == 0) {
- return invoke.getInvokedMethod().getHolder() == returnType;
- } else {
- return invoke.getInvokedMethod().proto.parameters.values[argumentIndex - 1] == returnType;
- }
+ return argumentType.equals(returnType);
}
}
+ private DexType getArgumentType(InvokeMethod invoke, int argumentIndex) {
+ if (invoke.isInvokeStatic()) {
+ return invoke.getInvokedMethod().proto.parameters.values[argumentIndex];
+ }
+ if (argumentIndex == 0) {
+ return invoke.getInvokedMethod().getHolder();
+ }
+ return invoke.getInvokedMethod().proto.parameters.values[argumentIndex - 1];
+ }
+
// Replace result uses for methods where something is known about what is returned.
public void rewriteMoveResult(IRCode code) {
if (options.isGeneratingClassFiles()) {
@@ -1600,7 +1615,7 @@
InvokeMethod invoke = current.asInvokeMethod();
if (invoke.outValue() != null && !invoke.outValue().hasLocalInfo()) {
if (libraryMethodsReturningReceiver.contains(invoke.getInvokedMethod())) {
- if (checkArgumentType(invoke, invoke.getInvokedMethod(), 0)) {
+ if (checkArgumentType(invoke, 0)) {
invoke.outValue().replaceUsers(invoke.arguments().get(0));
invoke.setOutValue(null);
}
@@ -1614,8 +1629,7 @@
if (definition != null && definition.getOptimizationInfo().returnsArgument()) {
int argumentIndex = definition.getOptimizationInfo().getReturnedArgument();
// Replace the out value of the invoke with the argument and ignore the out value.
- if (argumentIndex != -1
- && checkArgumentType(invoke, target.method, argumentIndex)) {
+ if (argumentIndex >= 0 && checkArgumentType(invoke, argumentIndex)) {
Value argument = invoke.arguments().get(argumentIndex);
Value outValue = invoke.outValue();
assert outValue.verifyCompatible(argument.outType());
diff --git a/src/main/java/com/android/tools/r8/references/Reference.java b/src/main/java/com/android/tools/r8/references/Reference.java
index bb8e57e..0e3d988 100644
--- a/src/main/java/com/android/tools/r8/references/Reference.java
+++ b/src/main/java/com/android/tools/r8/references/Reference.java
@@ -9,6 +9,7 @@
import com.google.common.collect.MapMaker;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.List;
import java.util.concurrent.ConcurrentMap;
/**
@@ -119,15 +120,16 @@
public static MethodReference method(
ClassReference holderClass,
String methodName,
- ImmutableList<TypeReference> formalTypes,
+ List<TypeReference> formalTypes,
TypeReference returnType) {
- MethodReference key = new MethodReference(holderClass, methodName, formalTypes, returnType);
+ MethodReference key = new MethodReference(
+ holderClass, methodName, ImmutableList.copyOf(formalTypes), returnType);
return getInstance().methods.computeIfAbsent(key,
// Allocate a distinct value for the canonical reference so the key is not a strong pointer.
k -> new MethodReference(
k.getHolderClass(),
k.getMethodName(),
- (ImmutableList<TypeReference>) k.getFormalTypes(),
+ ImmutableList.copyOf(k.getFormalTypes()),
k.getReturnType()));
}
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index f10d000..673314d 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -604,7 +604,7 @@
if (methodHandle.isMethodHandle() && use != MethodHandleUse.ARGUMENT_TO_LAMBDA_METAFACTORY) {
DexClass holder = appInfo.definitionFor(methodHandle.asMethod().holder);
if (holder != null) {
- markClassAsInstantiatedWithMethodHandleRule(holder);
+ markInstantiated(holder.type, KeepReason.methodHandleReferencedIn(currentMethod));
}
}
}
@@ -1189,8 +1189,10 @@
private void markVirtualMethodAsLive(DexEncodedMethod method, KeepReason reason) {
assert method != null;
- // Only explicit keep rules should make abstract methods live.
- assert !method.accessFlags.isAbstract() || reason.isDueToKeepRule();
+ // Only explicit keep rules or reflective use should make abstract methods live.
+ assert !method.accessFlags.isAbstract()
+ || reason.isDueToKeepRule()
+ || reason.isDueToReflectiveUse();
if (!liveMethods.contains(method)) {
if (Log.ENABLED) {
Log.verbose(getClass(), "Adding virtual method `%s` to live set.", method.method);
@@ -1662,16 +1664,8 @@
collectReachedFields(staticFields, this::tryLookupStaticField)));
}
- private void markClassAsInstantiatedWithMethodHandleRule(DexClass clazz) {
- ProguardKeepRule rule =
- ProguardConfigurationUtils.buildMethodHandleKeepRule(clazz);
- proguardCompatibilityWorkList.add(
- Action.markInstantiated(clazz, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
- }
-
private void markClassAsInstantiatedWithCompatRule(DexClass clazz) {
- ProguardKeepRule rule =
- ProguardConfigurationUtils.buildDefaultInitializerKeepRule(clazz);
+ ProguardKeepRule rule = ProguardConfigurationUtils.buildDefaultInitializerKeepRule(clazz);
proguardCompatibilityWorkList.add(
Action.markInstantiated(clazz, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
if (clazz.hasDefaultInitializer()) {
@@ -1681,19 +1675,6 @@
}
}
- private void markFieldAsKeptWithCompatRule(DexEncodedField field, boolean keepClass) {
- DexClass holderClass = appInfo.definitionFor(field.field.getHolder());
- ProguardKeepRule rule =
- ProguardConfigurationUtils.buildFieldKeepRule(holderClass, field, keepClass);
- if (keepClass) {
- proguardCompatibilityWorkList.add(
- Action.markInstantiated(
- holderClass, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
- }
- proguardCompatibilityWorkList.add(
- Action.markFieldKept(field, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
- }
-
private void markMethodAsKeptWithCompatRule(DexEncodedMethod method) {
DexClass holderClass = appInfo.definitionFor(method.method.getHolder());
ProguardKeepRule rule =
@@ -1733,7 +1714,11 @@
if (identifierItem.isDexType()) {
DexClass clazz = appInfo.definitionFor(identifierItem.asDexType());
if (clazz != null) {
- markClassAsInstantiatedWithCompatRule(clazz);
+ markInstantiated(clazz.type, KeepReason.reflectiveUseIn(method));
+ if (clazz.hasDefaultInitializer()) {
+ markDirectStaticOrConstructorMethodAsLive(
+ clazz.getDefaultInitializer(), KeepReason.reflectiveUseIn(method));
+ }
}
} else if (identifierItem.isDexField()) {
DexEncodedField encodedField = appInfo.definitionFor(identifierItem.asDexField());
@@ -1746,13 +1731,22 @@
boolean keepClass =
!encodedField.accessFlags.isStatic()
&& appInfo.dexItemFactory.atomicFieldUpdaterMethods.isFieldUpdater(invokedMethod);
- markFieldAsKeptWithCompatRule(encodedField, keepClass);
+ if (keepClass) {
+ DexClass holderClass = appInfo.definitionFor(encodedField.field.getHolder());
+ markInstantiated(holderClass.type, KeepReason.reflectiveUseIn(method));
+ }
+ markFieldAsKept(encodedField, KeepReason.reflectiveUseIn(method));
}
} else {
assert identifierItem.isDexMethod();
DexEncodedMethod encodedMethod = appInfo.definitionFor(identifierItem.asDexMethod());
if (encodedMethod != null) {
- markMethodAsKeptWithCompatRule(encodedMethod);
+ if (encodedMethod.accessFlags.isStatic() || encodedMethod.accessFlags.isConstructor()) {
+ markDirectStaticOrConstructorMethodAsLive(
+ encodedMethod, KeepReason.reflectiveUseIn(method));
+ } else {
+ markVirtualMethodAsLive(encodedMethod, KeepReason.reflectiveUseIn(method));
+ }
}
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepReason.java b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
index 16d78a7..a797742 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepReason.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
@@ -61,6 +61,10 @@
return false;
}
+ public boolean isDueToReflectiveUse() {
+ return false;
+ }
+
public boolean isDueToProguardCompatibility() {
return false;
}
@@ -73,6 +77,14 @@
return new TargetedBySuper(from);
}
+ public static KeepReason reflectiveUseIn(DexEncodedMethod method) {
+ return new ReflectiveUseFrom(method);
+ }
+
+ public static KeepReason methodHandleReferencedIn(DexEncodedMethod method) {
+ return new MethodHandleReferencedFrom(method);
+ }
+
private static class DueToKeepRule extends KeepReason {
final ProguardKeepRule keepRule;
@@ -289,4 +301,43 @@
return enqueuer.getAnnotationGraphNode(holder);
}
}
+
+ private static class ReflectiveUseFrom extends BasedOnOtherMethod {
+
+ private ReflectiveUseFrom(DexEncodedMethod method) {
+ super(method);
+ }
+
+ @Override
+ public boolean isDueToReflectiveUse() {
+ return true;
+ }
+
+ @Override
+ public EdgeKind edgeKind() {
+ return EdgeKind.ReflectiveUseFrom;
+ }
+
+ @Override
+ String getKind() {
+ return "reflective use in";
+ }
+ }
+
+ private static class MethodHandleReferencedFrom extends BasedOnOtherMethod {
+
+ private MethodHandleReferencedFrom(DexEncodedMethod method) {
+ super(method);
+ }
+
+ @Override
+ public EdgeKind edgeKind() {
+ return EdgeKind.MethodHandleUseFrom;
+ }
+
+ @Override
+ String getKind() {
+ return "method handle referenced from";
+ }
+ }
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
index 163c60b..f9846b8 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
@@ -5,13 +5,8 @@
package com.android.tools.r8.shaking;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.ProguardConfigurationParser.IdentifierPatternWithWildcards;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -31,19 +26,6 @@
}
};
- public static ProguardKeepRule buildMethodHandleKeepRule(DexClass clazz) {
- ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
- builder.setOrigin(proguardCompatOrigin);
- builder.setType(ProguardKeepRuleType.KEEP);
- builder.getModifiersBuilder().setAllowsObfuscation(true);
- builder.getModifiersBuilder().setAllowsOptimization(true);
- builder.setClassType(
- clazz.isInterface() ? ProguardClassType.INTERFACE : ProguardClassType.CLASS);
- builder.setClassNames(
- ProguardClassNameList.singletonList(ProguardTypeMatcher.create(clazz.type)));
- return builder.build();
- }
-
public static ProguardKeepRule buildDefaultInitializerKeepRule(DexClass clazz) {
ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
builder.setOrigin(proguardCompatOrigin);
@@ -64,36 +46,6 @@
return builder.build();
}
- public static ProguardKeepRule buildFieldKeepRule(
- DexClass clazz, DexEncodedField field, boolean keepClass) {
- assert clazz.type == field.field.getHolder();
- ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
- builder.setOrigin(proguardCompatOrigin);
- if (keepClass) {
- builder.setType(ProguardKeepRuleType.KEEP);
- } else {
- builder.setType(ProguardKeepRuleType.KEEP_CLASS_MEMBERS);
- }
- builder.getModifiersBuilder().setAllowsObfuscation(true);
- builder.getModifiersBuilder().setAllowsOptimization(true);
- builder.getClassAccessFlags().setVisibility(clazz.accessFlags);
- if (clazz.isInterface()) {
- builder.setClassType(ProguardClassType.INTERFACE);
- } else {
- builder.setClassType(ProguardClassType.CLASS);
- }
- builder.setClassNames(
- ProguardClassNameList.singletonList(ProguardTypeMatcher.create(clazz.type)));
- ProguardMemberRule.Builder memberRuleBuilder = ProguardMemberRule.builder();
- memberRuleBuilder.setRuleType(ProguardMemberType.FIELD);
- memberRuleBuilder.getAccessFlags().setFlags(field.accessFlags);
- memberRuleBuilder.setName(
- IdentifierPatternWithWildcards.withoutWildcards(field.field.name.toString()));
- memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(field.field.type));
- builder.getMemberRules().add(memberRuleBuilder.build());
- return builder.build();
- }
-
public static ProguardKeepRule buildMethodKeepRule(DexClass clazz, DexEncodedMethod method) {
// TODO(b/122295241): These generated rules should be linked into the graph, eg, the method
// using identified reflection should be the source keeping the target alive.
@@ -125,41 +77,6 @@
return builder.build();
}
- public static ProguardIdentifierNameStringRule buildIdentifierNameStringRule(DexReference item) {
- assert item.isDexField() || item.isDexMethod();
- ProguardIdentifierNameStringRule.Builder builder = ProguardIdentifierNameStringRule.builder();
- ProguardMemberRule.Builder memberRuleBuilder = ProguardMemberRule.builder();
- DexType holderType;
- if (item.isDexField()) {
- DexField field = item.asDexField();
- holderType = field.getHolder();
- memberRuleBuilder.setRuleType(ProguardMemberType.FIELD);
- memberRuleBuilder.setName(
- IdentifierPatternWithWildcards.withoutWildcards(field.name.toString()));
- memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(field.type));
- } else {
- DexMethod method = item.asDexMethod();
- holderType = method.getHolder();
- memberRuleBuilder.setRuleType(ProguardMemberType.METHOD);
- memberRuleBuilder.setName(
- IdentifierPatternWithWildcards.withoutWildcards(method.name.toString()));
- memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(method.proto.returnType));
- List<ProguardTypeMatcher> arguments = Arrays.stream(method.proto.parameters.values)
- .map(ProguardTypeMatcher::create)
- .collect(Collectors.toList());
- memberRuleBuilder.setArguments(arguments);
- }
- if (holderType.isInterface()) {
- builder.setClassType(ProguardClassType.INTERFACE);
- } else {
- builder.setClassType(ProguardClassType.CLASS);
- }
- builder.setClassNames(
- ProguardClassNameList.singletonList(ProguardTypeMatcher.create(holderType)));
- builder.getMemberRules().add(memberRuleBuilder.build());
- return builder.build();
- }
-
public static ProguardAssumeValuesRule buildAssumeValuesForApiLevel(
DexItemFactory factory, AndroidApiLevel apiLevel) {
Origin synthesizedFromApiLevel =
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 6504169..906aee9 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -23,8 +23,6 @@
import com.android.tools.r8.shaking.ProguardConfigurationParser;
import com.android.tools.r8.shaking.ProguardConfigurationRule;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.shaking.ProguardKeepRule;
-import com.android.tools.r8.shaking.ProguardKeepRuleType;
import com.android.tools.r8.shaking.ProguardMemberRule;
import com.android.tools.r8.shaking.ProguardMemberType;
import com.android.tools.r8.shaking.forceproguardcompatibility.defaultmethods.ClassImplementingInterface;
@@ -40,8 +38,6 @@
import com.android.tools.r8.utils.codeinspector.FieldSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import com.google.common.collect.ImmutableList;
-import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
@@ -277,39 +273,6 @@
assertEquals(subject.isPresent() && allowObfuscation, subject.isRenamed());
});
- // Check the Proguard compatibility rules generated.
- ProguardConfigurationParser parser =
- new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
- parser.parse(proguardCompatibilityRules);
- ProguardConfiguration configuration = parser.getConfigRawForTesting();
- if (forceProguardCompatibility) {
- List<ProguardConfigurationRule> rules = configuration.getRules();
- assertEquals(2, rules.size());
- for (ProguardConfigurationRule r : rules) {
- assertTrue(r instanceof ProguardKeepRule);
- ProguardKeepRule rule = (ProguardKeepRule) r;
- assertEquals(ProguardKeepRuleType.KEEP, rule.getType());
- assertTrue(rule.getModifiers().allowsObfuscation);
- assertTrue(rule.getModifiers().allowsOptimization);
- List<ProguardMemberRule> memberRules = rule.getMemberRules();
- ProguardClassNameList classNames = rule.getClassNames();
- assertEquals(1, classNames.size());
- DexType type = classNames.asSpecificDexTypes().get(0);
- if (type.toSourceString().equals(forNameClass1.getCanonicalName())) {
- assertEquals(1, memberRules.size());
- assertEquals(ProguardMemberType.INIT, memberRules.iterator().next().getRuleType());
- } else {
- assertTrue(type.toSourceString().equals(forNameClass2.getCanonicalName()));
- // During parsing we add in the default constructor if there are otherwise no single
- // member rule.
- assertEquals(1, memberRules.size());
- assertEquals(ProguardMemberType.INIT, memberRules.iterator().next().getRuleType());
- }
- }
- } else {
- assertEquals(0, configuration.getRules().size());
- }
-
if (isRunProguard()) {
Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
@@ -376,38 +339,6 @@
assertTrue(bar.isPresent());
assertEquals(bar.isPresent() && allowObfuscation, bar.isRenamed());
- // Check the Proguard compatibility rules generated.
- ProguardConfigurationParser parser =
- new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
- parser.parse(proguardCompatibilityRules);
- ProguardConfiguration configuration = parser.getConfigRawForTesting();
- if (forceProguardCompatibility) {
- List<ProguardConfigurationRule> rules = configuration.getRules();
- assertEquals(2, rules.size());
- for (ProguardConfigurationRule r : rules) {
- assertTrue(r instanceof ProguardKeepRule);
- ProguardKeepRule rule = (ProguardKeepRule) r;
- assertEquals(ProguardKeepRuleType.KEEP_CLASS_MEMBERS, rule.getType());
- assertTrue(rule.getModifiers().allowsObfuscation);
- assertTrue(rule.getModifiers().allowsOptimization);
- List<ProguardMemberRule> memberRules = rule.getMemberRules();
- ProguardClassNameList classNames = rule.getClassNames();
- assertEquals(1, classNames.size());
- DexType type = classNames.asSpecificDexTypes().get(0);
- assertEquals(withMemberClass.getCanonicalName(), type.toSourceString());
- assertEquals(1, memberRules.size());
- ProguardMemberRule memberRule = memberRules.iterator().next();
- if (memberRule.getRuleType() == ProguardMemberType.FIELD) {
- assertTrue(memberRule.getName().matches("foo"));
- } else {
- assertEquals(ProguardMemberType.METHOD, memberRule.getRuleType());
- assertTrue(memberRule.getName().matches("bar"));
- }
- }
- } else {
- assertEquals(0, configuration.getRules().size());
- }
-
if (isRunProguard()) {
Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
@@ -481,39 +412,6 @@
assertTrue(f.isPresent());
assertEquals(f.isPresent() && allowObfuscation, f.isRenamed());
- // Check the Proguard compatibility rules generated.
- ProguardConfigurationParser parser =
- new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
- parser.parse(proguardCompatibilityRules);
- ProguardConfiguration configuration = parser.getConfigRawForTesting();
- if (forceProguardCompatibility) {
- List<ProguardConfigurationRule> rules = configuration.getRules();
- assertEquals(3, rules.size());
- Object2BooleanMap<String> keptFields = new Object2BooleanArrayMap<>();
- for (ProguardConfigurationRule r : rules) {
- assertTrue(r instanceof ProguardKeepRule);
- ProguardKeepRule rule = (ProguardKeepRule) r;
- assertEquals(ProguardKeepRuleType.KEEP, rule.getType());
- assertTrue(rule.getModifiers().allowsObfuscation);
- assertTrue(rule.getModifiers().allowsOptimization);
- List<ProguardMemberRule> memberRules = rule.getMemberRules();
- ProguardClassNameList classNames = rule.getClassNames();
- assertEquals(1, classNames.size());
- DexType type = classNames.asSpecificDexTypes().get(0);
- assertEquals(withVolatileFields.getCanonicalName(), type.toSourceString());
- assertEquals(1, memberRules.size());
- ProguardMemberRule memberRule = memberRules.iterator().next();
- assertEquals(ProguardMemberType.FIELD, memberRule.getRuleType());
- keptFields.put(memberRule.getName().toString(), true);
- }
- assertEquals(3, keptFields.size());
- assertTrue(keptFields.containsKey("intField"));
- assertTrue(keptFields.containsKey("longField"));
- assertTrue(keptFields.containsKey("objField"));
- } else {
- assertEquals(0, configuration.getRules().size());
- }
-
if (isRunProguard()) {
Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
diff --git a/tools/archive.py b/tools/archive.py
index ce04494..d8fb4d0 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -91,12 +91,6 @@
if not utils.is_bot() and not options.dry_run:
raise Exception('You are not a bot, don\'t archive builds')
- # Generate an r8-ed build without dependencies.
- # The '-Pno_internal' flag is important because we generate the lib based on uses in tests.
- gradle.RunGradleExcludeDeps([utils.R8LIB_NO_DEPS, '-Pno_internal'])
- shutil.copyfile(utils.R8LIB_JAR, utils.R8LIB_EXCLUDE_DEPS_JAR)
- shutil.copyfile(utils.R8LIB_JAR + '.map', utils.R8LIB_EXCLUDE_DEPS_JAR + '.map')
-
# Create maven release which uses a build that exclude dependencies.
create_maven_release.main(["--out", utils.LIBS])
@@ -114,6 +108,7 @@
utils.COMPATDX,
utils.COMPATPROGUARD,
utils.R8LIB,
+ utils.R8LIB_NO_DEPS,
utils.COMPATDXLIB,
utils.COMPATPROGUARDLIB,
'-Pno_internal'
diff --git a/tools/test.py b/tools/test.py
index 6b24433..043487c 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -185,7 +185,6 @@
gradle_args.append('-Pr8lib')
if options.r8lib_no_deps:
gradle_args.append('-Pr8lib_no_deps')
- gradle_args.append('-Pexclude_deps')
# Add Gradle tasks
gradle_args.append('cleanTest')