Do not warn undetermined identifiers for reflection in library classes.
Bug: 111246805, 72858955
Change-Id: I2e2fcfa9664891e0c2f251bce124f0ea5830c4e8
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 581ac8a..b0f4dc0 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -6,7 +6,7 @@
import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentiferNameString;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.inferMemberOrTypeFromNameString;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
-import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifier;
+import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifierIfNecessary;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.DexEncodedField;
@@ -32,7 +32,6 @@
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.Streams;
@@ -82,7 +81,7 @@
}
public void decoupleIdentifierNameStringsInMethod(DexEncodedMethod encodedMethod, IRCode code) {
- Origin origin = appInfo.originFor(code.method.method.getHolder());
+ DexType originHolder = code.method.method.getHolder();
ListIterator<BasicBlock> blocks = code.listIterator();
while (blocks.hasNext()) {
BasicBlock block = blocks.next();
@@ -110,17 +109,15 @@
? instruction.asStaticPut().inValue()
: instruction.asInstancePut().value();
if (!in.isConstString()) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(options.reporter, field, origin, instruction, null);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, field, originHolder, instruction, null);
continue;
}
DexString original = in.getConstInstruction().asConstString().getValue();
DexItemBasedString itemBasedString = inferMemberOrTypeFromNameString(appInfo, original);
if (itemBasedString == null) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(options.reporter, field, origin, instruction, original);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, field, originHolder, instruction, original);
continue;
}
// Move the cursor back to $fieldPut
@@ -174,10 +171,8 @@
if (isReflectionMethod(dexItemFactory, invokedMethod)) {
DexItemBasedString itemBasedString = identifyIdentiferNameString(appInfo, invoke);
if (itemBasedString == null) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(
- options.reporter, invokedMethod, origin, instruction, null);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, invokedMethod, originHolder, instruction, null);
continue;
}
DexType returnType = invoke.getReturnType();
@@ -222,20 +217,16 @@
for (int i = 0; i < ins.size(); i++) {
Value in = ins.get(i);
if (!in.isConstString()) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(
- options.reporter, invokedMethod, origin, instruction, null);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, invokedMethod, originHolder, instruction, null);
continue;
}
DexString original = in.getConstInstruction().asConstString().getValue();
DexItemBasedString itemBasedString =
inferMemberOrTypeFromNameString(appInfo, original);
if (itemBasedString == null) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(
- options.reporter, invokedMethod, origin, instruction, original);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, invokedMethod, originHolder, instruction, original);
continue;
}
// Move the cursor back to $invoke
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
index 471b3f8..bf23f59 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -26,7 +26,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.TextPosition;
-import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringDiagnostic;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import java.util.List;
@@ -372,13 +372,24 @@
return new DexTypeList(types);
}
- public static void warnUndeterminedIdentifier(
- Reporter reporter,
+ public static void warnUndeterminedIdentifierIfNecessary(
+ AppInfo appInfo,
+ InternalOptions options,
DexItem member,
- Origin origin,
+ DexType originHolder,
Instruction instruction,
DexString original) {
assert member instanceof DexField || member instanceof DexMethod;
+ DexClass originClass = appInfo.definitionFor(originHolder);
+ // If the origin is a library class, it is out of developers' control.
+ if (originClass != null && originClass.isLibraryClass()) {
+ return;
+ }
+ // Undetermined identifiers matter only if minification is enabled.
+ if (!options.proguardConfiguration.isObfuscating()) {
+ return;
+ }
+ Origin origin = appInfo.originFor(originHolder);
String kind = member instanceof DexField ? "field" : "method";
String originalMessage = original == null ? "what identifier string flows to "
: "what '" + original.toString() + "' refers to, which flows to ";
@@ -392,6 +403,6 @@
? new StringDiagnostic(message, origin,
new TextPosition(0L, instruction.getPosition().line, 1))
: new StringDiagnostic(message, origin);
- reporter.warning(diagnostic);
+ options.reporter.warning(diagnostic);
}
}
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 061b9bf..8335cba 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -5,7 +5,7 @@
import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentiferNameString;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
-import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifier;
+import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifierIfNecessary;
import static com.android.tools.r8.shaking.ProguardConfigurationUtils.buildIdentifierNameStringRule;
import com.android.tools.r8.Diagnostic;
@@ -1359,13 +1359,14 @@
}
private void handleProguardReflectiveBehavior(DexEncodedMethod method) {
- Origin origin = appInfo.originFor(method.method.holder);
+ DexType originHolder = method.method.holder;
+ Origin origin = appInfo.originFor(originHolder);
IRCode code = method.buildIR(appInfo, options, origin);
code.instructionIterator().forEachRemaining(instr ->
- handleProguardReflectiveBehavior(instr, origin));
+ handleProguardReflectiveBehavior(instr, originHolder));
}
- private void handleProguardReflectiveBehavior(Instruction instruction, Origin origin) {
+ private void handleProguardReflectiveBehavior(Instruction instruction, DexType originHolder) {
if (!instruction.isInvokeMethod()) {
return;
}
@@ -1376,9 +1377,8 @@
}
DexItemBasedString itemBasedString = identifyIdentiferNameString(appInfo, invoke);
if (itemBasedString == null) {
- if (options.proguardConfiguration.isObfuscating()) {
- warnUndeterminedIdentifier(options.reporter, invokedMethod, origin, instruction, null);
- }
+ warnUndeterminedIdentifierIfNecessary(
+ appInfo, options, invokedMethod, originHolder, instruction, null);
return;
}
if (itemBasedString.basedOn instanceof DexType) {