Support multiple keep annotation namespaces
With this change the keep annotations can be in either the current
com.android.tools.r8.keepanno namespace or in the new
androidx.annoataion.keep namespace. The compiler will treat both
namespaces the same, and annotations from both namespaces can be
present at the same time.
The support for the new namespace is needed to be able to release the
keep annotation library and the support for both is required for
migrating the use of keep annotations in android platform.
Bug: b/392865072
Change-Id: I173c630269731037e865dbd4b55800862647f563
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepConstraintsVisitor.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepConstraintsVisitor.java
index a35f9e9..1df490b 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepConstraintsVisitor.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepConstraintsVisitor.java
@@ -23,7 +23,7 @@
@Override
public void visitEnum(String ignore, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.Constraints.DESCRIPTOR)) {
+ if (!AnnotationConstants.Constraints.isDescriptor(descriptor)) {
super.visitEnum(ignore, descriptor, value);
}
switch (value) {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
index c37ef50..f82c8ff 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
@@ -100,18 +100,16 @@
}
private static boolean isEmbeddedAnnotation(String descriptor) {
- switch (descriptor) {
- case AnnotationConstants.Edge.DESCRIPTOR:
- case AnnotationConstants.UsesReflection.DESCRIPTOR:
- case AnnotationConstants.ForApi.DESCRIPTOR:
- case AnnotationConstants.UsedByReflection.DESCRIPTOR:
- case AnnotationConstants.UsedByNative.DESCRIPTOR:
- case AnnotationConstants.CheckRemoved.DESCRIPTOR:
- case AnnotationConstants.CheckOptimizedOut.DESCRIPTOR:
- return true;
- default:
- return false;
+ if (AnnotationConstants.Edge.isDescriptor(descriptor)
+ || AnnotationConstants.UsesReflection.isDescriptor(descriptor)
+ || AnnotationConstants.ForApi.isDescriptor(descriptor)
+ || AnnotationConstants.UsedByReflection.isDescriptor(descriptor)
+ || AnnotationConstants.UsedByNative.isDescriptor(descriptor)
+ || AnnotationConstants.CheckRemoved.isDescriptor(descriptor)
+ || AnnotationConstants.CheckOptimizedOut.isDescriptor(descriptor)) {
+ return true;
}
+ return false;
}
public static List<KeepDeclaration> readKeepEdges(byte[] classFileBytes) {
@@ -345,10 +343,10 @@
if (!readEmbedded || !isEmbeddedAnnotation(descriptor)) {
return null;
}
- if (descriptor.equals(Edge.DESCRIPTOR)) {
+ if (Edge.isDescriptor(descriptor)) {
return new KeepEdgeVisitor(parsingContext, parent::accept, setContext);
}
- if (descriptor.equals(AnnotationConstants.UsesReflection.DESCRIPTOR)) {
+ if (AnnotationConstants.UsesReflection.isDescriptor(descriptor)) {
return new UsesReflectionVisitor(
parsingContext,
parent::accept,
@@ -358,19 +356,19 @@
.setClassNamePattern(KeepQualifiedClassNamePattern.exact(className))
.build());
}
- if (descriptor.equals(ForApi.DESCRIPTOR)) {
+ if (ForApi.isDescriptor(descriptor)) {
return new ForApiClassVisitor(parsingContext, parent::accept, setContext, className);
}
- if (descriptor.equals(UsedByReflection.DESCRIPTOR)
- || descriptor.equals(AnnotationConstants.UsedByNative.DESCRIPTOR)) {
+ if (UsedByReflection.isDescriptor(descriptor)
+ || AnnotationConstants.UsedByNative.isDescriptor(descriptor)) {
return new UsedByReflectionClassVisitor(
parsingContext, parent::accept, setContext, className);
}
- if (descriptor.equals(AnnotationConstants.CheckRemoved.DESCRIPTOR)) {
+ if (AnnotationConstants.CheckRemoved.isDescriptor(descriptor)) {
return new CheckRemovedClassVisitor(
parsingContext, parent::accept, setContext, className, KeepCheckKind.REMOVED);
}
- if (descriptor.equals(AnnotationConstants.CheckOptimizedOut.DESCRIPTOR)) {
+ if (AnnotationConstants.CheckOptimizedOut.isDescriptor(descriptor)) {
return new CheckRemovedClassVisitor(
parsingContext, parent::accept, setContext, className, KeepCheckKind.OPTIMIZED_OUT);
}
@@ -489,10 +487,10 @@
// Only the embedded annotations can be on methods.
return null;
}
- if (descriptor.equals(Edge.DESCRIPTOR)) {
+ if (Edge.isDescriptor(descriptor)) {
return new KeepEdgeVisitor(parsingContext, parent::accept, setContext);
}
- if (descriptor.equals(AnnotationConstants.UsesReflection.DESCRIPTOR)) {
+ if (AnnotationConstants.UsesReflection.isDescriptor(descriptor)) {
return new UsesReflectionVisitor(
parsingContext,
parent::accept,
@@ -500,7 +498,7 @@
bindingsHelper ->
createMethodItemContext(className, methodName, methodDescriptor, bindingsHelper));
}
- if (descriptor.equals(AnnotationConstants.ForApi.DESCRIPTOR)) {
+ if (AnnotationConstants.ForApi.isDescriptor(descriptor)) {
return new ForApiMemberVisitor(
parsingContext,
parent::accept,
@@ -508,8 +506,8 @@
bindingsHelper ->
createMethodItemContext(className, methodName, methodDescriptor, bindingsHelper));
}
- if (descriptor.equals(AnnotationConstants.UsedByReflection.DESCRIPTOR)
- || descriptor.equals(AnnotationConstants.UsedByNative.DESCRIPTOR)) {
+ if (AnnotationConstants.UsedByReflection.isDescriptor(descriptor)
+ || AnnotationConstants.UsedByNative.isDescriptor(descriptor)) {
return new UsedByReflectionMemberVisitor(
parsingContext,
parent::accept,
@@ -517,7 +515,7 @@
bindingsHelper ->
createMethodItemContext(className, methodName, methodDescriptor, bindingsHelper));
}
- if (descriptor.equals(AnnotationConstants.CheckRemoved.DESCRIPTOR)) {
+ if (AnnotationConstants.CheckRemoved.isDescriptor(descriptor)) {
return new CheckRemovedMemberVisitor(
parsingContext,
parent::accept,
@@ -526,7 +524,7 @@
createMethodItemContext(className, methodName, methodDescriptor, bindingsHelper),
KeepCheckKind.REMOVED);
}
- if (descriptor.equals(AnnotationConstants.CheckOptimizedOut.DESCRIPTOR)) {
+ if (AnnotationConstants.CheckOptimizedOut.isDescriptor(descriptor)) {
return new CheckRemovedMemberVisitor(
parsingContext,
parent::accept,
@@ -624,10 +622,10 @@
// Only the embedded annotations can be on fields.
return null;
}
- if (descriptor.equals(Edge.DESCRIPTOR)) {
+ if (Edge.isDescriptor(descriptor)) {
return new KeepEdgeVisitor(parsingContext, parent::accept, setContext);
}
- if (descriptor.equals(AnnotationConstants.UsesReflection.DESCRIPTOR)) {
+ if (AnnotationConstants.UsesReflection.isDescriptor(descriptor)) {
return new UsesReflectionVisitor(
parsingContext,
parent::accept,
@@ -635,7 +633,7 @@
bindingsHelper ->
createMemberItemContext(className, fieldName, fieldTypeDescriptor, bindingsHelper));
}
- if (descriptor.equals(ForApi.DESCRIPTOR)) {
+ if (ForApi.isDescriptor(descriptor)) {
return new ForApiMemberVisitor(
parsingContext,
parent::accept,
@@ -643,8 +641,8 @@
bindingsHelper ->
createMemberItemContext(className, fieldName, fieldTypeDescriptor, bindingsHelper));
}
- if (descriptor.equals(UsedByReflection.DESCRIPTOR)
- || descriptor.equals(AnnotationConstants.UsedByNative.DESCRIPTOR)) {
+ if (UsedByReflection.isDescriptor(descriptor)
+ || AnnotationConstants.UsedByNative.isDescriptor(descriptor)) {
return new UsedByReflectionMemberVisitor(
parsingContext,
parent::accept,
@@ -822,7 +820,7 @@
// The class context/holder is the annotated class.
visit(Item.className, className);
// The default kind is to target the class and its members.
- visitEnum(null, Kind.DESCRIPTOR, Kind.CLASS_AND_MEMBERS);
+ visitEnum(null, Kind.getDescriptor(), Kind.CLASS_AND_MEMBERS);
}
@Override
@@ -863,8 +861,8 @@
if (!getKind().isOnlyClass() && isDefaultMemberDeclaration()) {
// If no member declarations have been made, set public & protected as the default.
AnnotationVisitor v = visitArray(Item.memberAccess);
- v.visitEnum(null, MemberAccess.DESCRIPTOR, MemberAccess.PUBLIC);
- v.visitEnum(null, MemberAccess.DESCRIPTOR, MemberAccess.PROTECTED);
+ v.visitEnum(null, MemberAccess.getDescriptor(), MemberAccess.PUBLIC);
+ v.visitEnum(null, MemberAccess.getDescriptor(), MemberAccess.PROTECTED);
}
super.visitEnd();
// Currently there is no way of changing constraints on KeepForApi.
@@ -1109,7 +1107,7 @@
public void visitEnd() {
if (getKind() == null && !isDefaultMemberDeclaration()) {
// If no explict kind is set and member declarations have been made, keep the class too.
- visitEnum(null, Kind.DESCRIPTOR, Kind.CLASS_AND_MEMBERS);
+ visitEnum(null, Kind.getDescriptor(), Kind.CLASS_AND_MEMBERS);
}
super.visitEnd();
for (KeepBindingReference bindingReference : getItems()) {
@@ -1188,7 +1186,7 @@
@Override
public void visitEnum(String name, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.Kind.DESCRIPTOR)) {
+ if (!Kind.isDescriptor(descriptor)) {
super.visitEnum(name, descriptor, value);
}
KeepEdgeReader.ItemKind kind = KeepEdgeReader.ItemKind.fromString(value);
@@ -1336,7 +1334,7 @@
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
assert name == null;
- if (descriptor.equals(AnnotationConstants.Binding.DESCRIPTOR)) {
+ if (AnnotationConstants.Binding.isDescriptor(descriptor)) {
return new KeepBindingVisitor(parsingContext.annotation(descriptor), helper);
}
return super.visitAnnotation(name, descriptor);
@@ -1362,7 +1360,7 @@
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
assert name == null;
- if (descriptor.equals(Condition.DESCRIPTOR)) {
+ if (Condition.isDescriptor(descriptor)) {
return new KeepConditionVisitor(
parsingContext.annotation(descriptor), builder::addCondition, bindingsHelper);
}
@@ -1394,7 +1392,7 @@
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
assert name == null;
- if (descriptor.equals(Target.DESCRIPTOR)) {
+ if (Target.isDescriptor(descriptor)) {
return KeepTargetVisitor.create(
parsingContext.annotation(descriptor), builder::addTarget, bindingsHelper);
}
@@ -1898,7 +1896,7 @@
@Override
public void visitEnum(String name, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.Kind.DESCRIPTOR)) {
+ if (!AnnotationConstants.Kind.isDescriptor(descriptor)) {
super.visitEnum(name, descriptor, value);
}
ItemKind kind = ItemKind.fromString(value);
@@ -2177,7 +2175,7 @@
@Override
public void visitEnum(String ignore, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.MemberAccess.DESCRIPTOR)) {
+ if (!AnnotationConstants.MemberAccess.isDescriptor(descriptor)) {
super.visitEnum(ignore, descriptor, value);
}
boolean handled =
@@ -2236,7 +2234,7 @@
@Override
public void visitEnum(String ignore, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.MethodAccess.DESCRIPTOR)) {
+ if (!AnnotationConstants.MethodAccess.isDescriptor(descriptor)) {
super.visitEnum(ignore, descriptor, value);
}
boolean handled =
@@ -2265,7 +2263,7 @@
});
if (!handled) {
// Continue visitation with the "member" descriptor to allow matching the common values.
- super.visitEnum(ignore, MemberAccess.DESCRIPTOR, value);
+ super.visitEnum(ignore, MemberAccess.getDescriptor(), value);
}
}
}
@@ -2282,7 +2280,7 @@
@Override
public void visitEnum(String ignore, String descriptor, String value) {
- if (!descriptor.equals(AnnotationConstants.FieldAccess.DESCRIPTOR)) {
+ if (!AnnotationConstants.FieldAccess.isDescriptor(descriptor)) {
super.visitEnum(ignore, descriptor, value);
}
boolean handled =
@@ -2302,7 +2300,7 @@
});
if (!handled) {
// Continue visitation with the "member" descriptor to allow matching the common values.
- super.visitEnum(ignore, MemberAccess.DESCRIPTOR, value);
+ super.visitEnum(ignore, MemberAccess.getDescriptor(), value);
}
}
}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
index fa6d13a..c174fa7 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
@@ -16,7 +16,18 @@
*/
public final class AnnotationConstants {
public static final class Edge {
- public static final String DESCRIPTOR = "Lcom/android/tools/r8/keepanno/annotations/KeepEdge;";
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepEdge;";
+ private static final String DESCRIPTOR_LEGACY =
+ "Lcom/android/tools/r8/keepanno/annotations/KeepEdge;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String description = "description";
public static final String bindings = "bindings";
public static final String preconditions = "preconditions";
@@ -24,43 +35,100 @@
}
public static final class ForApi {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepForApi;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepForApi;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String description = "description";
public static final String additionalTargets = "additionalTargets";
public static final String memberAccess = "memberAccess";
}
public static final class UsesReflection {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/UsesReflection;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/UsesReflection;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String description = "description";
public static final String value = "value";
public static final String additionalPreconditions = "additionalPreconditions";
}
public static final class UsedByReflection {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/UsedByReflection;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/UsedByReflection;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String description = "description";
public static final String preconditions = "preconditions";
public static final String additionalTargets = "additionalTargets";
}
public static final class UsedByNative {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/UsedByNative;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/UsedByNative;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
// Content is the same as UsedByReflection.
}
public static final class CheckRemoved {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/CheckRemoved;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/CheckRemoved;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
}
public static final class CheckOptimizedOut {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/CheckOptimizedOut;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/CheckOptimizedOut;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
}
/** Item properties common to binding items, conditions and targets. */
@@ -123,19 +191,48 @@
}
public static final class Binding {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepBinding;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepBinding;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String bindingName = "bindingName";
}
public static final class Condition {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepCondition;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepCondition;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
}
public static final class Target {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepTarget;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepTarget;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String kind = "kind";
public static final String constraintsGroup = "constraints";
public static final String constraints = "constraints";
@@ -144,8 +241,18 @@
}
public static final class Kind {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepItemKind;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepItemKind;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String ONLY_CLASS = "ONLY_CLASS";
public static final String ONLY_MEMBERS = "ONLY_MEMBERS";
public static final String ONLY_METHODS = "ONLY_METHODS";
@@ -156,8 +263,18 @@
}
public static final class Constraints {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/KeepConstraint;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/KeepConstraint;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String LOOKUP = "LOOKUP";
public static final String NAME = "NAME";
public static final String VISIBILITY_RELAX = "VISIBILITY_RELAX";
@@ -175,8 +292,18 @@
}
public static final class MemberAccess {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/MemberAccessFlags;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/MemberAccessFlags;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String NEGATION_PREFIX = "NON_";
public static final String PUBLIC = "PUBLIC";
public static final String PROTECTED = "PROTECTED";
@@ -188,8 +315,18 @@
}
public static final class MethodAccess {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/MethodAccessFlags;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/MethodAccessFlags;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String SYNCHRONIZED = "SYNCHRONIZED";
public static final String BRIDGE = "BRIDGE";
public static final String NATIVE = "NATIVE";
@@ -198,15 +335,35 @@
}
public static final class FieldAccess {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/FieldAccessFlags;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/FieldAccessFlags;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String VOLATILE = "VOLATILE";
public static final String TRANSIENT = "TRANSIENT";
}
public static final class StringPattern {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/StringPattern;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/StringPattern;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String stringExactPatternGroup = "string-exact-pattern";
public static final String exact = "exact";
public static final String startsWith = "startsWith";
@@ -214,8 +371,18 @@
}
public static final class TypePattern {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/TypePattern;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/TypePattern;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String typePatternGroup = "type-pattern";
public static final String name = "name";
public static final String constant = "constant";
@@ -224,8 +391,18 @@
}
public static final class ClassNamePattern {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/ClassNamePattern;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/ClassNamePattern;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String classNameGroup = "class-name";
public static final String name = "name";
public static final String constant = "constant";
@@ -236,15 +413,35 @@
}
public static final class InstanceOfPattern {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/InstanceOfPattern;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/InstanceOfPattern;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String inclusive = "inclusive";
public static final String classNamePattern = "classNamePattern";
}
public static final class AnnotationPattern {
- public static final String DESCRIPTOR =
+ private static final String DESCRIPTOR = "Landroidx/annotation/keep/AnnotationPattern;";
+ private static final String DESCRIPTOR_LEGACY =
"Lcom/android/tools/r8/keepanno/annotations/AnnotationPattern;";
+
+ public static boolean isDescriptor(String descriptor) {
+ return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);
+ }
+
+ public static String getDescriptor() {
+ return DESCRIPTOR;
+ }
+
public static final String annotationNameGroup = "annotation-name";
public static final String name = "name";
public static final String constant = "constant";
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
index 314cb1e..83358f1 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
@@ -8,6 +8,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -96,7 +97,7 @@
new MethodTransformer() {
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
- assertEquals(AnnotationConstants.UsesReflection.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.UsesReflection.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(descriptor, visible)) {
@Override
@@ -105,14 +106,14 @@
return new AnnotationVisitor(ASM_VERSION, super.visitArray(name)) {
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
- assertEquals(AnnotationConstants.Target.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.Target.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(name, descriptor)) {
@Override
public AnnotationVisitor visitArray(String name) {
assertEquals(AnnotationConstants.Item.fieldAccess, name);
AnnotationVisitor visitor = super.visitArray(name);
- visitor.visitEnum(null, FieldAccess.DESCRIPTOR, config.enumValue);
+ visitor.visitEnum(null, FieldAccess.getDescriptor(), config.enumValue);
visitor.visitEnd();
return null;
}
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
index 0bb6896..9b1740b 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
@@ -8,6 +8,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -104,7 +105,7 @@
new MethodTransformer() {
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
- assertEquals(AnnotationConstants.UsesReflection.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.UsesReflection.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(descriptor, visible)) {
@Override
@@ -113,7 +114,7 @@
return new AnnotationVisitor(ASM_VERSION, super.visitArray(name)) {
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
- assertEquals(AnnotationConstants.Target.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.Target.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(name, descriptor)) {
@Override
@@ -122,7 +123,7 @@
AnnotationVisitor visitor = super.visitArray(name);
visitor.visitEnum(
null,
- AnnotationConstants.MemberAccess.DESCRIPTOR,
+ AnnotationConstants.MemberAccess.getDescriptor(),
config.enumValue);
visitor.visitEnd();
return null;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
index 2e48bee..0d4f7a8 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
@@ -8,6 +8,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -101,7 +102,7 @@
new MethodTransformer() {
@Override
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
- assertEquals(AnnotationConstants.UsesReflection.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.UsesReflection.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(descriptor, visible)) {
@Override
@@ -110,7 +111,7 @@
return new AnnotationVisitor(ASM_VERSION, super.visitArray(name)) {
@Override
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
- assertEquals(AnnotationConstants.Target.DESCRIPTOR, descriptor);
+ assertTrue(AnnotationConstants.Target.isDescriptor(descriptor));
return new AnnotationVisitor(
ASM_VERSION, super.visitAnnotation(name, descriptor)) {
@Override
@@ -119,7 +120,7 @@
AnnotationVisitor visitor = super.visitArray(name);
visitor.visitEnum(
null,
- AnnotationConstants.MethodAccess.DESCRIPTOR,
+ AnnotationConstants.MethodAccess.getDescriptor(),
config.enumValue);
visitor.visitEnd();
return null;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
index 4d24fa8..45b8aa6 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
@@ -4,6 +4,10 @@
package com.android.tools.r8.keepanno;
+import static com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary.ANDROIDX;
+import static com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary.LEGACY;
+
+import com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -28,7 +32,16 @@
return keepAnnoParams;
}
+ private KeepAnnoTestBuilder testForKeepAnno(
+ KeepAnnoParameters params, KeepAnnotationLibrary keepAnnotationLibrary) throws IOException {
+ return KeepAnnoTestBuilder.forKeepAnnoTest(params, temp, keepAnnotationLibrary);
+ }
+
public KeepAnnoTestBuilder testForKeepAnno(KeepAnnoParameters params) throws IOException {
- return KeepAnnoTestBuilder.forKeepAnnoTest(params, temp);
+ return testForKeepAnno(params, LEGACY);
+ }
+
+ public KeepAnnoTestBuilder testForKeepAnnoAndroidX(KeepAnnoParameters params) throws IOException {
+ return testForKeepAnno(params, ANDROIDX);
}
}
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index e0dd195..3598e51 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.R8PartialTestBuilder;
import com.android.tools.r8.R8PartialTestCompileResult;
import com.android.tools.r8.R8TestBuilder;
+import com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary;
import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.R8TestCompileResultBase;
import com.android.tools.r8.SingleTestRunResult;
@@ -40,24 +41,25 @@
public abstract class KeepAnnoTestBuilder {
- public static KeepAnnoTestBuilder forKeepAnnoTest(KeepAnnoParameters params, TemporaryFolder temp)
+ public static KeepAnnoTestBuilder forKeepAnnoTest(
+ KeepAnnoParameters params, TemporaryFolder temp, KeepAnnotationLibrary keepAnnotationLibrary)
throws IOException {
switch (params.config()) {
case REFERENCE:
- return new ReferenceBuilder(params, temp);
+ return new ReferenceBuilder(params, keepAnnotationLibrary, temp);
case R8_DIRECT:
case R8_NORMALIZED:
case R8_RULES:
- return new R8NativeBuilder(params, temp);
+ return new R8NativeBuilder(params, keepAnnotationLibrary, temp);
case R8_PARTIAL_DIRECT:
case R8_PARTIAL_NORMALIZED:
case R8_PARTIAL_RULES:
params.parameters().assumeR8PartialTestParameters();
- return new R8PartialNativeBuilder(params, temp);
+ return new R8PartialNativeBuilder(params, keepAnnotationLibrary, temp);
case R8_LEGACY:
- return new R8LegacyBuilder(params, temp);
+ return new R8LegacyBuilder(params, keepAnnotationLibrary, temp);
case PG:
- return new PGBuilder(params, temp);
+ return new PGBuilder(params, keepAnnotationLibrary, temp);
default:
throw new IllegalStateException("Unexpected keep anno config: " + params.config());
}
@@ -161,7 +163,10 @@
private final TestBuilder<? extends SingleTestRunResult<?>, ?> builder;
- public ReferenceBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+ public ReferenceBuilder(
+ KeepAnnoParameters params,
+ KeepAnnotationLibrary keepAnnotationLibrary,
+ TemporaryFolder temp) {
super(params);
if (parameters().isCfRuntime()) {
builder = TestBase.testForJvm(temp);
@@ -308,9 +313,12 @@
private static class R8NativeBuilder
extends R8NativeBuilderBase<R8FullTestBuilder, R8TestCompileResult> {
- private R8NativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+ private R8NativeBuilder(
+ KeepAnnoParameters params,
+ KeepAnnotationLibrary keepAnnotationLibrary,
+ TemporaryFolder temp) {
super(params, TestBase.testForR8(temp, params.getBackend()));
- builder.enableExperimentalKeepAnnotations().setMinApi(parameters());
+ builder.enableExperimentalKeepAnnotations(keepAnnotationLibrary).setMinApi(parameters());
// TODO(b/323816623): Replace the testing flag by the API call.
builder.getBuilder().setEnableExperimentalKeepAnnotations(false);
@@ -336,12 +344,15 @@
private static class R8PartialNativeBuilder
extends R8NativeBuilderBase<R8PartialTestBuilder, R8PartialTestCompileResult> {
- private R8PartialNativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+ private R8PartialNativeBuilder(
+ KeepAnnoParameters params,
+ KeepAnnotationLibrary keepAnnotationLibrary,
+ TemporaryFolder temp) {
super(params, TestBase.testForR8Partial(temp, params.getBackend()));
builder
.setR8PartialConfiguration(Builder::includeAll)
- .enableExperimentalKeepAnnotations()
+ .enableExperimentalKeepAnnotations(keepAnnotationLibrary)
.setMinApi(parameters());
// TODO(b/323816623): Replace the testing flag by the API call.
@@ -380,12 +391,16 @@
private final ExternalR8TestBuilder builder;
private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
- public R8LegacyBuilder(KeepAnnoParameters params, TemporaryFolder temp) throws IOException {
+ public R8LegacyBuilder(
+ KeepAnnoParameters params,
+ KeepAnnotationLibrary keepAnnotationLibrary,
+ TemporaryFolder temp)
+ throws IOException {
super(params);
builder =
TestBase.testForExternalR8(temp, parameters().getBackend())
.useProvidedR8(KeepAnnoTestUtils.R8_LIB)
- .addProgramFiles(KeepAnnoTestUtils.getKeepAnnoLib(temp))
+ .addProgramFiles(KeepAnnoTestUtils.getKeepAnnoLib(temp, keepAnnotationLibrary))
.setMinApi(parameters());
}
@@ -442,11 +457,15 @@
private final ProguardTestBuilder builder;
private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
- public PGBuilder(KeepAnnoParameters params, TemporaryFolder temp) throws IOException {
+ public PGBuilder(
+ KeepAnnoParameters params,
+ KeepAnnotationLibrary keepAnnotationLibrary,
+ TemporaryFolder temp)
+ throws IOException {
super(params);
builder =
TestBase.testForProguard(KeepAnnoTestUtils.PG_VERSION, temp)
- .addProgramFiles(KeepAnnoTestUtils.getKeepAnnoLib(temp))
+ .addProgramFiles(KeepAnnoTestUtils.getKeepAnnoLib(temp, keepAnnotationLibrary))
.setMinApi(parameters());
}
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
index e267bdd..016d85c 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.cfmethodgeneration.CodeGenerationBase;
import com.android.tools.r8.keepanno.annotations.KeepItemKind;
import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.StringUtils.BraceType;
@@ -523,8 +524,8 @@
writer.print('\n');
}
- private void printCopyRight(int year) {
- if (pkg.equals(ANDROIDX_ANNO_PKG)) {
+ private void printCopyRight(int year, boolean forceR8Copyright) {
+ if (pkg.equals(ANDROIDX_ANNO_PKG) && !forceR8Copyright) {
println(getHeaderString(2025, KeepItemAnnotationGenerator.class.getSimpleName()));
} else {
println(
@@ -533,6 +534,10 @@
}
}
+ private void printCopyRight(int year) {
+ printCopyRight(year, false);
+ }
+
private void printPackage() {
println("package " + this.pkg + ";");
println();
@@ -1758,7 +1763,8 @@
}
private void generateConstants() {
- printCopyRight(2023);
+ // The generated AnnotationConstants class is part of R8.
+ printCopyRight(2023, true);
println("package com.android.tools.r8.keepanno.ast;");
printImports();
DocPrinter.printer()
@@ -1807,7 +1813,17 @@
private void generateAnnotationConstants(ClassReference clazz) {
String desc = clazz.getDescriptor();
- println("public static final String DESCRIPTOR = " + quote(desc) + ";");
+ String desc_legacy =
+ "Lcom/android/tools/r8/keepanno/annotations"
+ + desc.substring(desc.lastIndexOf(DescriptorUtils.DESCRIPTOR_PACKAGE_SEPARATOR));
+ println("private static final String DESCRIPTOR = " + quote(desc) + ";");
+ println("private static final String DESCRIPTOR_LEGACY = " + quote(desc_legacy) + ";");
+ println("public static boolean isDescriptor(String descriptor) {");
+ println(" return DESCRIPTOR.equals(descriptor) || DESCRIPTOR_LEGACY.equals(descriptor);");
+ println("}");
+ println("public static String getDescriptor() {");
+ println(" return DESCRIPTOR;");
+ println("}");
}
List<Group> getKeepEdgeGroups() {
@@ -2219,7 +2235,7 @@
write);
writeFile(
- R8_ANNO_PKG,
+ ANDROIDX_ANNO_PKG,
generator -> generator.ANNOTATION_CONSTANTS,
Generator::generateConstants,
write);
diff --git a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
index 1f1a642..f6d7950 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
@@ -212,9 +212,10 @@
}
@Override
- public R8PartialTestBuilder enableExperimentalKeepAnnotations() {
+ public R8PartialTestBuilder enableExperimentalKeepAnnotations(
+ KeepAnnotationLibrary keepAnnotationLibrary) {
return addR8PartialOptionsModification(
o -> o.getTestingOptions().enableEmbeddedKeepAnnotations = true)
- .addKeepAnnoLibToClasspath();
+ .addKeepAnnoLibToClasspath(keepAnnotationLibrary);
}
}
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index 3e294f0..7b415ba 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;
+import static com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary.ANDROIDX;
+
import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
import com.android.tools.r8.R8Command.Builder;
import com.android.tools.r8.TestBase.Backend;
@@ -71,6 +73,11 @@
T extends R8TestBuilder<CR, RR, T>>
extends TestShrinkerBuilder<R8Command, Builder, CR, RR, T> {
+ public enum KeepAnnotationLibrary {
+ ANDROIDX,
+ LEGACY
+ }
+
enum AllowedDiagnosticMessages {
ALL,
ERROR,
@@ -810,20 +817,29 @@
return self();
}
- public T enableExperimentalKeepAnnotations() {
+ public T enableExperimentalKeepAnnotations(KeepAnnotationLibrary keepAnnotationLibrary) {
return addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = true)
- .addKeepAnnoLibToClasspath();
+ .addKeepAnnoLibToClasspath(keepAnnotationLibrary);
}
- public T addKeepAnnoLibToClasspath() {
+ public T enableExperimentalKeepAnnotations() {
+ return enableExperimentalKeepAnnotations(ANDROIDX);
+ }
+
+ public T addKeepAnnoLibToClasspath(KeepAnnotationLibrary keepAnnotationLibrary) {
try {
- builder.addClasspathFiles(KeepAnnoTestUtils.getKeepAnnoLib(getState().getTempFolder()));
+ builder.addClasspathFiles(
+ KeepAnnoTestUtils.getKeepAnnoLib(getState().getTempFolder(), keepAnnotationLibrary));
return self();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
+ public T addKeepAnnoLibToClasspath() {
+ return addKeepAnnoLibToClasspath(ANDROIDX);
+ }
+
public T enableProguardTestOptions() {
builder.setEnableTestProguardOptions();
return self();
diff --git a/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java b/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
index 8fba6b2..2fc4c98 100644
--- a/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
@@ -4,11 +4,13 @@
package com.android.tools.r8.keepanno;
+import static com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary.ANDROIDX;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ByteDataView;
import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.R8TestBuilder.KeepAnnotationLibrary;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
import com.android.tools.r8.keepanno.ast.KeepDeclaration;
@@ -29,16 +31,22 @@
public static ProguardVersion PG_VERSION = ProguardVersion.V7_4_1;
+ public static final String DESCRIPTOR_PREFIX = "Landroidx/annotation/keep/";
+ public static final String DESCRIPTOR_LEGACY_PREFIX =
+ "Lcom/android/tools/r8/keepanno/annotations/";
+
// Track support for R8 version 8.0.46 which is included in AGP 8.0.2
public static Path R8_LIB =
Paths.get(ToolHelper.THIRD_PARTY_DIR, "r8-releases", "8.0.46", "r8lib.jar");
- public static Path getKeepAnnoLib(TemporaryFolder temp) throws IOException {
+ public static Path getKeepAnnoLib(
+ TemporaryFolder temp, KeepAnnotationLibrary keepAnnotationLibrary) throws IOException {
Path archive = temp.newFolder().toPath().resolve("keepanno.jar");
ArchiveConsumer consumer = new ArchiveConsumer(archive);
for (Path root : ToolHelper.getBuildPropKeepAnnoRuntimePath()) {
- Path annoDir =
- root.resolve(Paths.get("com", "android", "tools", "r8", "keepanno", "annotations"));
+ String descriptorPrefix =
+ (keepAnnotationLibrary == ANDROIDX ? DESCRIPTOR_PREFIX : DESCRIPTOR_LEGACY_PREFIX);
+ Path annoDir = root.resolve(descriptorPrefix.substring(1, descriptorPrefix.length() - 1));
assertTrue(Files.isDirectory(root));
assertTrue(Files.isDirectory(annoDir));
try (Stream<Path> paths = Files.list(annoDir)) {
@@ -48,7 +56,7 @@
byte[] data = FileUtils.uncheckedReadAllBytes(p);
String fileName = p.getFileName().toString();
String className = fileName.substring(0, fileName.lastIndexOf('.'));
- String desc = "Lcom/android/tools/r8/keepanno/annotations/" + className + ";";
+ String desc = descriptorPrefix + className + ";";
consumer.accept(ByteDataView.of(data), desc, null);
}
});
@@ -58,6 +66,10 @@
return archive;
}
+ public static Path getKeepAnnoLib(TemporaryFolder temp) throws IOException {
+ return getKeepAnnoLib(temp, ANDROIDX);
+ }
+
public static List<String> extractRulesFromFiles(
List<Path> inputFiles, KeepRuleExtractorOptions extractorOptions) {
return extractRulesFromBytes(