Version 1.0.19 Merge: Analyze field and method annotations for main dex list CL: https://r8-review.googlesource.com/c/r8/+/17660 Change-Id: Ide42bca32ad0ec11d602e2627eee534f9e036e62
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java index 8badad0..4c52353 100644 --- a/src/main/java/com/android/tools/r8/Version.java +++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@ // This field is accessed from release scripts using simple pattern matching. // Therefore, changing this field could break our release scripts. - public static final String LABEL = "v1.0.18"; + public static final String LABEL = "v1.0.19"; private Version() { }
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java index 2295c16..fb7ea0b 100644 --- a/src/main/java/com/android/tools/r8/graph/DexClass.java +++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -145,6 +145,46 @@ return result; } + /** + * For all annotations on the class and all annotations on its methods and fields apply the + * specified consumer. + */ + public void forEachAnnotation(Consumer<DexAnnotation> consumer) { + for (DexAnnotation annotation : annotations.annotations) { + consumer.accept(annotation); + } + for (DexEncodedMethod method : directMethods()) { + for (DexAnnotation annotation : method.annotations.annotations) { + consumer.accept(annotation); + } + for (DexAnnotationSet parameterAnnotations : method.parameterAnnotations.values) { + for (DexAnnotation annotation : parameterAnnotations.annotations) { + consumer.accept(annotation); + } + } + } + for (DexEncodedMethod method : virtualMethods()) { + for (DexAnnotation annotation : method.annotations.annotations) { + consumer.accept(annotation); + } + for (DexAnnotationSet parameterAnnotations : method.parameterAnnotations.values) { + for (DexAnnotation annotation : parameterAnnotations.annotations) { + consumer.accept(annotation); + } + } + } + for (DexEncodedField field : instanceFields()) { + for (DexAnnotation annotation : field.annotations.annotations) { + consumer.accept(annotation); + } + } + for (DexEncodedField field : staticFields()) { + for (DexAnnotation annotation : field.annotations.annotations) { + consumer.accept(annotation); + } + } + } + public void forEachField(Consumer<DexEncodedField> consumer) { for (DexEncodedField field : staticFields()) { consumer.accept(field);
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java index de21187..5c51786 100644 --- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java +++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -85,13 +85,13 @@ addMainDexType(dexType); continue; } - for (DexAnnotation annotation : clazz.annotations.annotations) { - if (annotation.visibility == DexAnnotation.VISIBILITY_RUNTIME + clazz.forEachAnnotation(annotation -> { + if (!mainDexTypes.contains(dexType) + && annotation.visibility == DexAnnotation.VISIBILITY_RUNTIME && isAnnotationWithEnum(annotation.annotation.type)) { addMainDexType(dexType); - break; } - } + }); } }
diff --git a/src/test/examples/multidex002/AnnotatedDirectMethod.java b/src/test/examples/multidex002/AnnotatedDirectMethod.java new file mode 100644 index 0000000..761ea9a --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedDirectMethod.java
@@ -0,0 +1,12 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +public class AnnotatedDirectMethod { + + @AnnotationWithEnum3(AnnotationWithEnum3.Value3.VAL3_2) + private void foo() { + } +}
diff --git a/src/test/examples/multidex002/AnnotatedInstanceField.java b/src/test/examples/multidex002/AnnotatedInstanceField.java new file mode 100644 index 0000000..0209f44 --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedInstanceField.java
@@ -0,0 +1,11 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +public class AnnotatedInstanceField { + + @AnnotationWithEnum3(AnnotationWithEnum3.Value3.VAL3_2) + public String value = "myValue"; +}
diff --git a/src/test/examples/multidex002/AnnotatedMethodParameter.java b/src/test/examples/multidex002/AnnotatedMethodParameter.java new file mode 100644 index 0000000..49a9e6d --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedMethodParameter.java
@@ -0,0 +1,11 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +public class AnnotatedMethodParameter { + + public void foo(@AnnotationWithEnum3(AnnotationWithEnum3.Value3.VAL3_2) String val) { + } +}
diff --git a/src/test/examples/multidex002/AnnotatedNotKept.java b/src/test/examples/multidex002/AnnotatedNotKept.java new file mode 100644 index 0000000..500e7f0 --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedNotKept.java
@@ -0,0 +1,10 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +@AnnotationWithoutEnum +public class AnnotatedNotKept { + +}
diff --git a/src/test/examples/multidex002/AnnotatedStaticField.java b/src/test/examples/multidex002/AnnotatedStaticField.java new file mode 100644 index 0000000..385d1d9 --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedStaticField.java
@@ -0,0 +1,9 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +public class AnnotatedStaticField { + @AnnotationWithEnum3(AnnotationWithEnum3.Value3.VAL3_2) public static String sValue = "myValue"; +}
diff --git a/src/test/examples/multidex002/AnnotatedVirtualMethod.java b/src/test/examples/multidex002/AnnotatedVirtualMethod.java new file mode 100644 index 0000000..569bf84 --- /dev/null +++ b/src/test/examples/multidex002/AnnotatedVirtualMethod.java
@@ -0,0 +1,13 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +public class AnnotatedVirtualMethod { + + @AnnotationWithEnum3(AnnotationWithEnum3.Value3.VAL3_2) + public void foo() { + + } +}
diff --git a/src/test/examples/multidex002/AnnotationWithEnum3.java b/src/test/examples/multidex002/AnnotationWithEnum3.java new file mode 100644 index 0000000..a8f8344 --- /dev/null +++ b/src/test/examples/multidex002/AnnotationWithEnum3.java
@@ -0,0 +1,19 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface AnnotationWithEnum3 { + + enum Value3 { + VAL3_1, + VAL3_2, + } + + Value3 value(); +}
diff --git a/src/test/examples/multidex002/AnnotationWithoutEnum.java b/src/test/examples/multidex002/AnnotationWithoutEnum.java new file mode 100644 index 0000000..5244971 --- /dev/null +++ b/src/test/examples/multidex002/AnnotationWithoutEnum.java
@@ -0,0 +1,13 @@ +// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package multidex002; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface AnnotationWithoutEnum { + +}
diff --git a/src/test/examples/multidex002/ref-list-1.txt b/src/test/examples/multidex002/ref-list-1.txt index 26dae34..922d417 100644 --- a/src/test/examples/multidex002/ref-list-1.txt +++ b/src/test/examples/multidex002/ref-list-1.txt
@@ -1,8 +1,15 @@ Lmultidex002/Annotated2; Lmultidex002/Annotated; +Lmultidex002/AnnotatedDirectMethod; +Lmultidex002/AnnotatedInstanceField; +Lmultidex002/AnnotatedMethodParameter; +Lmultidex002/AnnotatedStaticField; +Lmultidex002/AnnotatedVirtualMethod; Lmultidex002/AnnotationWithClass; Lmultidex002/AnnotationWithEnum2; +Lmultidex002/AnnotationWithEnum3; Lmultidex002/AnnotationWithEnum; +Lmultidex002/AnnotationWithoutEnum; Lmultidex002/InterfaceWithEnum; Lmultidex002/IntermediateClass; Lmultidex002/MainActivity;