Respect -keep rules in publicizing of fields
Bug: b/131130038
Change-Id: I169aa1d9d2f20746fe92bb49dee52123cf93851f
diff --git a/src/main/java/com/android/tools/r8/optimize/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
index 7661768..d8b5946 100644
--- a/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
+++ b/src/main/java/com/android/tools/r8/optimize/AccessModifier.java
@@ -27,7 +27,6 @@
import com.android.tools.r8.ir.optimize.MethodPoolCollection;
import com.android.tools.r8.optimize.PublicizerLens.PublicizedLensBuilder;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.shaking.KeepFieldInfo;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.MethodSignatureEquivalence;
import com.android.tools.r8.utils.OptionalBool;
@@ -134,17 +133,17 @@
}
private void processField(ProgramField field) {
- finalizeField(field);
- publicizeField(field);
+ if (appView.appInfo().isAccessModificationAllowed(field)) {
+ finalizeField(field);
+ publicizeField(field);
+ }
}
private void finalizeField(ProgramField field) {
FieldAccessFlags flags = field.getAccessFlags();
FieldAccessInfo accessInfo =
appView.appInfo().getFieldAccessInfoCollection().get(field.getReference());
- KeepFieldInfo keepInfo = appView.getKeepInfo(field);
- if (keepInfo.isAccessModificationAllowed(options)
- && !keepInfo.isPinned(options)
+ if (!appView.getKeepInfo(field).isPinned(options)
&& !accessInfo.hasReflectiveWrite()
&& !accessInfo.isWrittenFromMethodHandle()
&& accessInfo.isWrittenOnlyInMethodSatisfying(
@@ -159,17 +158,9 @@
private void publicizeField(ProgramField field) {
FieldAccessFlags flags = field.getAccessFlags();
- if (flags.isPublic()) {
- return;
+ if (!flags.isPublic()) {
+ flags.promoteToPublic();
}
- if (!appView.appInfo().isAccessModificationAllowed(field)) {
- // TODO(b/131130038): Also do not publicize package-private and protected fields that
- // are kept.
- if (flags.isPrivate()) {
- return;
- }
- }
- flags.promoteToPublic();
}
private boolean publicizeMethod(ProgramMethod method) {
diff --git a/src/test/examples/naming044/keep-rules-001.txt b/src/test/examples/naming044/keep-rules-001.txt
index a191b54..4d818ad 100644
--- a/src/test/examples/naming044/keep-rules-001.txt
+++ b/src/test/examples/naming044/keep-rules-001.txt
@@ -6,6 +6,6 @@
-repackageclasses ''
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming044/keep-rules-002.txt b/src/test/examples/naming044/keep-rules-002.txt
index c6e495b..084e4ea 100644
--- a/src/test/examples/naming044/keep-rules-002.txt
+++ b/src/test/examples/naming044/keep-rules-002.txt
@@ -6,6 +6,6 @@
-repackageclasses 'p44.x'
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming044/keep-rules-003.txt b/src/test/examples/naming044/keep-rules-003.txt
index 10b2856..e6780a0 100644
--- a/src/test/examples/naming044/keep-rules-003.txt
+++ b/src/test/examples/naming044/keep-rules-003.txt
@@ -6,6 +6,6 @@
-flattenpackagehierarchy ''
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming044/keep-rules-004.txt b/src/test/examples/naming044/keep-rules-004.txt
index 3785014..3d3ef56 100644
--- a/src/test/examples/naming044/keep-rules-004.txt
+++ b/src/test/examples/naming044/keep-rules-004.txt
@@ -6,6 +6,6 @@
-flattenpackagehierarchy 'p44.y'
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming044/keep-rules-005.txt b/src/test/examples/naming044/keep-rules-005.txt
index 5583ccf..b4b4bcc 100644
--- a/src/test/examples/naming044/keep-rules-005.txt
+++ b/src/test/examples/naming044/keep-rules-005.txt
@@ -4,6 +4,6 @@
-allowaccessmodification
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming101/keep-rules-001.txt b/src/test/examples/naming101/keep-rules-001.txt
index a191b54..4d818ad 100644
--- a/src/test/examples/naming101/keep-rules-001.txt
+++ b/src/test/examples/naming101/keep-rules-001.txt
@@ -6,6 +6,6 @@
-repackageclasses ''
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming101/keep-rules-002.txt b/src/test/examples/naming101/keep-rules-002.txt
index bbdde22..cdeb26a 100644
--- a/src/test/examples/naming101/keep-rules-002.txt
+++ b/src/test/examples/naming101/keep-rules-002.txt
@@ -6,10 +6,10 @@
-repackageclasses 'naming101.a'
--keep public class **.a {
+-keep,allowaccessmodification public class **.a {
*;
}
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming101/keep-rules-003.txt b/src/test/examples/naming101/keep-rules-003.txt
index 10b2856..e6780a0 100644
--- a/src/test/examples/naming101/keep-rules-003.txt
+++ b/src/test/examples/naming101/keep-rules-003.txt
@@ -6,6 +6,6 @@
-flattenpackagehierarchy ''
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/examples/naming101/keep-rules-005.txt b/src/test/examples/naming101/keep-rules-005.txt
index 5583ccf..b4b4bcc 100644
--- a/src/test/examples/naming101/keep-rules-005.txt
+++ b/src/test/examples/naming101/keep-rules-005.txt
@@ -4,6 +4,6 @@
-allowaccessmodification
--keep,allowobfuscation class * {
+-keep,allowaccessmodification,allowobfuscation class * {
*;
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
index 882076c..5a27372 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
@@ -41,7 +41,9 @@
.addInnerClasses(IfRuleWithAccessRelaxationTest.class)
.addKeepMainRule(TestClass.class)
.addKeepRules(
- "-keep class " + TestClass.class.getTypeName() + " { int field; }",
+ "-keep,allowaccessmodification class " + TestClass.class.getTypeName() + " {",
+ " int field;",
+ "}",
"-if class " + TestClass.class.getTypeName() + " { protected int field; }",
"-keep class " + Unused1.class.getTypeName(),
"-if class " + TestClass.class.getTypeName() + " {",