Merge commit '089989ec29b6fed9d55a7849d569b35e8d335d17' into dev-release
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json index b0c751c..397f2c5 100644 --- a/src/library_desugar/jdk11/desugar_jdk_libs.json +++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -71,15 +71,53 @@ ], "library_flags": [ { + "api_level_below_or_equal": 10000, + "rewrite_prefix": { + "desugar.": "j$.desugar.", + "libcore.": "j$.libcore.", + "java.net.URLDecoder": "j$.net.URLDecoder", + "java.net.URLEncoder": "j$.net.URLEncoder", + "java.lang.Desugar": "j$.lang.Desugar", + "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner" + } + }, + { + "api_level_below_or_equal": 29, + "rewrite_prefix": { + "java.util.concurrent.Flow": "j$.util.concurrent.Flow" + } + }, + { "api_level_below_or_equal": 25, "rewrite_prefix": { "j$.time.": "java.time.", "java.time.": "j$.time.", + "java.io.DesugarFile" : "j$.io.DesugarFile", "java.util.Desugar": "j$.util.Desugar", "sun.misc.Desugar": "j$.sun.misc.Desugar", - "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions" + "sun.security.action.": "j$.sun.security.action.", + "jdk.internal.": "j$.jdk.internal.", + "java.nio.Desugar": "j$.nio.Desugar", + "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel", + "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel", + "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler", + "java.nio.channels.Desugar": "j$.nio.channels.Desugar", + "java.nio.file.": "j$.nio.file.", + "sun.nio.cs." : "j$.sun.nio.cs.", + "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider", + "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector", + "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder", + "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView", + "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap" + }, + "backport": { + "java.lang.DesugarDouble": "java.lang.Double", + "java.lang.DesugarInteger": "java.lang.Integer", + "java.lang.DesugarLong": "java.lang.Long", + "java.lang.DesugarMath": "java.lang.Math" }, "retarget_lib_member": { + "java.io.File#toPath": "java.io.DesugarFile", "java.util.Date#toInstant": "java.util.DesugarDate", "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar", "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone" @@ -96,17 +134,19 @@ { "api_level_below_or_equal": 23, "rewrite_prefix": { + "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface", + "java.io.DesugarInputStream": "j$.io.DesugarInputStream", "j$.util.Optional": "java.util.Optional", "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics", "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics", "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics", + "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel", "java.util.stream.": "j$.util.stream.", "java.util.function.": "j$.util.function.", "java.util.Comparators": "j$.util.Comparators", "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics", "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics", "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics", - "java.util.Objects": "j$.util.Objects", "java.util.Optional": "j$.util.Optional", "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator", "java.util.SortedSet$1": "j$.util.SortedSet$1", @@ -151,6 +191,15 @@ "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions", "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions" } + }, + { + "api_level_below_or_equal": 18, + "rewrite_prefix": { + "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets" + }, + "retarget_lib_member": { + "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter" + } } ], "program_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json index 66f3500..fca8af4 100644 --- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json +++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -71,15 +71,53 @@ ], "library_flags": [ { + "api_level_below_or_equal": 10000, + "rewrite_prefix": { + "desugar.": "j$.desugar.", + "libcore.": "j$.libcore.", + "java.net.URLDecoder": "j$.net.URLDecoder", + "java.net.URLEncoder": "j$.net.URLEncoder", + "java.lang.Desugar": "j$.lang.Desugar", + "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner" + } + }, + { + "api_level_below_or_equal": 29, + "rewrite_prefix": { + "java.util.concurrent.Flow": "j$.util.concurrent.Flow" + } + }, + { "api_level_below_or_equal": 25, "rewrite_prefix": { "j$.time.": "java.time.", "java.time.": "j$.time.", + "java.io.DesugarFile" : "j$.io.DesugarFile", "java.util.Desugar": "j$.util.Desugar", "sun.misc.Desugar": "j$.sun.misc.Desugar", - "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions" + "sun.security.action.": "j$.sun.security.action.", + "jdk.internal.": "j$.jdk.internal.", + "java.nio.Desugar": "j$.nio.Desugar", + "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel", + "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel", + "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler", + "java.nio.channels.Desugar": "j$.nio.channels.Desugar", + "java.nio.file.": "j$.nio.file.", + "sun.nio.cs." : "j$.sun.nio.cs.", + "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider", + "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector", + "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder", + "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView", + "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap" + }, + "backport": { + "java.lang.DesugarDouble": "java.lang.Double", + "java.lang.DesugarInteger": "java.lang.Integer", + "java.lang.DesugarLong": "java.lang.Long", + "java.lang.DesugarMath": "java.lang.Math" }, "retarget_lib_member": { + "java.io.File#toPath": "java.io.DesugarFile", "java.util.Date#toInstant": "java.util.DesugarDate", "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar", "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone" @@ -96,10 +134,15 @@ { "api_level_below_or_equal": 23, "rewrite_prefix": { + "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface", + "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader", + "java.io.DesugarInputStream": "j$.io.DesugarInputStream", + "java.io.UncheckedIOException": "j$.io.UncheckedIOException", "j$.util.Optional": "java.util.Optional", "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics", "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics", "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics", + "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel", "java.util.stream.": "j$.util.stream.", "java.util.function.": "j$.util.function.", "java.util.Comparators": "j$.util.Comparators", @@ -120,9 +163,7 @@ "java.util.AbstractList": "j$.util.AbstractList", "java.util.CollSer": "j$.util.CollSer", "java.util.ImmutableCollections": "j$.util.ImmutableCollections", - "java.util.KeyValueHolder": "j$.util.KeyValueHolder", - "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader", - "java.io.UncheckedIOException": "j$.io.UncheckedIOException" + "java.util.KeyValueHolder": "j$.util.KeyValueHolder" }, "retarget_lib_member": { "java.util.Arrays#stream": "java.util.DesugarArrays", @@ -134,6 +175,7 @@ "java.util.Iterator#remove" ], "emulate_interface": { + "java.lang.Iterable": "j$.lang.Iterable", "java.util.Map$Entry": "j$.util.Map$Entry", "java.util.Collection": "j$.util.Collection", "java.util.Map": "j$.util.Map", @@ -153,6 +195,15 @@ "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions", "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions" } + }, + { + "api_level_below_or_equal": 18, + "rewrite_prefix": { + "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets" + }, + "retarget_lib_member": { + "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter" + } } ], "program_flags": [ @@ -222,6 +273,7 @@ "java.util.Iterator#remove" ], "emulate_interface": { + "java.lang.Iterable": "j$.lang.Iterable", "java.util.Map$Entry": "j$.util.Map$Entry", "java.util.Collection": "j$.util.Collection", "java.util.Map": "j$.util.Map", @@ -248,7 +300,7 @@ "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { int sizeCtl; int transferIndex; long baseCount; int cellsBusy; }", "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }", "-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static final !synthetic <fields>; }", - "-keeppackagenames j$", + "-keeppackagenames j$.**", "-keepclassmembers class j$.util.IntSummaryStatistics { long count; long sum; int min; int max; }", "-keepclassmembers class j$.util.LongSummaryStatistics { long count; long sum; long min; long max; }", "-keepclassmembers class j$.util.DoubleSummaryStatistics { long count; double sum; double min; double max; }",
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java index 2013fb9..242064b 100644 --- a/src/main/java/com/android/tools/r8/D8Command.java +++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -467,7 +467,7 @@ internal.enableMainDexListCheck = enableMainDexListCheck; internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel()); internal.intermediate = intermediate; - internal.readCompileTimeAnnotations = intermediate; + internal.retainCompileTimeAnnotations = intermediate; internal.desugarGraphConsumer = desugarGraphConsumer; internal.mainDexKeepRules = mainDexKeepRules; internal.lineNumberOptimization = LineNumberOptimization.OFF;
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java index 2512782..337fad7 100644 --- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java +++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -224,6 +224,8 @@ internal.minimalMainDex = internal.debug; internal.enableEnumValueOptimization = false; internal.inlinerOptions().enableInlining = false; + assert internal.retainCompileTimeAnnotations; + internal.retainCompileTimeAnnotations = false; return internal; } }
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java index 133ca25..c0fb797 100644 --- a/src/main/java/com/android/tools/r8/L8Command.java +++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -166,7 +166,7 @@ assert !internal.minimalMainDex; internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel()); assert !internal.intermediate; - assert internal.readCompileTimeAnnotations; + assert internal.retainCompileTimeAnnotations; internal.programConsumer = getProgramConsumer(); assert internal.programConsumer instanceof ClassFileConsumer;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java index e469f0a..07e0617 100644 --- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java +++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic; import com.android.tools.r8.graph.ApplicationReaderMap; import com.android.tools.r8.graph.ClassKind; +import com.android.tools.r8.graph.DexAnnotation; import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexApplicationReadFlags; import com.android.tools.r8.graph.DexClass; @@ -379,6 +380,20 @@ } } + private boolean includeAnnotationClass(DexProgramClass clazz) { + if (!options.pruneNonVissibleAnnotationClasses) { + return true; + } + DexAnnotation retentionAnnotation = + clazz.annotations().getFirstMatching(itemFactory.retentionType); + // Default is CLASS retention, read if retained. + if (retentionAnnotation == null) { + return DexAnnotation.retainCompileTimeAnnotation(clazz.getType(), application.options); + } + // Otherwise only read runtime visible annotations. + return retentionAnnotation.annotation.toString().contains("RUNTIME"); + } + private void readClassSources( List<ProgramResource> classSources, Queue<DexProgramClass> classes) { if (classSources.isEmpty()) { @@ -386,7 +401,15 @@ } hasReadProgramResourceFromCf = true; JarClassFileReader<DexProgramClass> reader = - new JarClassFileReader<>(application, classes::add, PROGRAM); + new JarClassFileReader<>( + application, + clazz -> { + if (clazz.isAnnotation() && !includeAnnotationClass(clazz)) { + return; + } + classes.add(clazz); + }, + PROGRAM); // Read classes in parallel. for (ProgramResource input : classSources) { futures.add(
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java index 1141602..6952bf7 100644 --- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java +++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -111,7 +111,7 @@ } public static boolean retainCompileTimeAnnotation(DexType annotation, InternalOptions options) { - if (options.readCompileTimeAnnotations) { + if (options.retainCompileTimeAnnotations) { return true; } if (annotation == options.itemFactory.dalvikFastNativeAnnotation
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java index 0c78a72..b59c44f 100644 --- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java +++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -175,9 +175,8 @@ private static boolean retainCompileTimeAnnotation( String desc, JarApplicationReader application) { - return application.options.readCompileTimeAnnotations - || DexAnnotation.retainCompileTimeAnnotation( - application.getTypeFromDescriptor(desc), application.options); + return DexAnnotation.retainCompileTimeAnnotation( + application.getTypeFromDescriptor(desc), application.options); } private static DexEncodedAnnotation createEncodedAnnotation(String desc,
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java index 98c8bd2..146e33f 100644 --- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java +++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -78,6 +78,7 @@ && !getAccessFlags().isNative() && !getAccessFlags().isPrivate() && !getAccessFlags().isStatic() + && !getDefinition().isInstanceInitializer() && !appView.appInfo().isFailedResolutionTarget(getReference()); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java index 2b6c9d4..460c350 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
@@ -287,9 +287,10 @@ private DexMethod computeReturnConversion( DexMethod invokedMethod, - DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) { + DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer, + ProgramMethod context) { DexType returnType = invokedMethod.proto.returnType; - if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod)) { + if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod, context)) { DexType newReturnType = DesugaredLibraryAPIConverter.vivifiedTypeFor(returnType, appView); return wrapperSynthesizor.ensureConversionMethod( returnType, newReturnType, returnType, eventConsumer); @@ -299,12 +300,13 @@ private DexMethod[] computeParameterConversions( DexMethod invokedMethod, - DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) { + DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer, + ProgramMethod context) { DexMethod[] parameterConversions = new DexMethod[invokedMethod.getArity()]; DexType[] parameters = invokedMethod.proto.parameters.values; for (int i = 0; i < parameters.length; i++) { DexType argType = parameters[i]; - if (wrapperSynthesizor.shouldConvert(argType, invokedMethod)) { + if (wrapperSynthesizor.shouldConvert(argType, invokedMethod, context)) { DexType argVivifiedType = vivifiedTypeFor(argType, appView); parameterConversions[i] = wrapperSynthesizor.ensureConversionMethod( @@ -326,12 +328,12 @@ } if (shouldOutlineAPIConversion(invoke, context)) { DexMethod outlinedAPIConversion = - createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer); + createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer, context); return Collections.singletonList( new CfInvoke(Opcodes.INVOKESTATIC, outlinedAPIConversion, false)); } return rewriteLibraryInvokeToInlineAPIConversion( - invoke, methodProcessingContext, localStackAllocator, eventConsumer); + invoke, methodProcessingContext, localStackAllocator, eventConsumer, context); } // If the option is set, we try to outline API conversions as much as possible to reduce the @@ -354,11 +356,13 @@ CfInvoke invoke, MethodProcessingContext methodProcessingContext, LocalStackAllocator localStackAllocator, - CfInstructionDesugaringEventConsumer eventConsumer) { + CfInstructionDesugaringEventConsumer eventConsumer, + ProgramMethod context) { DexMethod invokedMethod = invoke.getMethod(); - DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer); - DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer); + DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context); + DexMethod[] parameterConversions = + computeParameterConversions(invokedMethod, eventConsumer, context); // If only the last 2 parameters require conversion, we do everything inlined. // If other parameters require conversion, we outline the parameter conversion but keep the API @@ -502,14 +506,16 @@ private DexMethod createOutlinedAPIConversion( CfInvoke invoke, MethodProcessingContext methodProcessingContext, - CfInstructionDesugaringEventConsumer eventConsumer) { + CfInstructionDesugaringEventConsumer eventConsumer, + ProgramMethod context) { DexMethod invokedMethod = invoke.getMethod(); DexProto newProto = invoke.isInvokeStatic() ? invokedMethod.proto : factory.prependTypeToProto(invokedMethod.getHolderType(), invokedMethod.getProto()); - DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer); - DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer); + DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context); + DexMethod[] parameterConversions = + computeParameterConversions(invokedMethod, eventConsumer, context); ProgramMethod outline = appView .getSyntheticItems()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java index 4269366..6aed582 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.FieldAccessFlags; import com.android.tools.r8.graph.MethodAccessFlags; +import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaring; import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer; import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer; @@ -32,6 +33,9 @@ import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterVivifiedWrapperCfCodeProvider; import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperCfCodeProvider; import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperConversionCfCodeProvider; +import com.android.tools.r8.origin.Origin; +import com.android.tools.r8.position.MethodPosition; +import com.android.tools.r8.position.Position; import com.android.tools.r8.synthesis.SyntheticClassBuilder; import com.android.tools.r8.synthesis.SyntheticMethodBuilder; import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind; @@ -109,13 +113,17 @@ } public boolean shouldConvert(DexType type, DexMethod method) { + return shouldConvert(type, method, null); + } + + public boolean shouldConvert(DexType type, DexMethod method, ProgramMethod context) { if (!appView.rewritePrefix.hasRewrittenType(type, appView)) { return false; } if (canConvert(type)) { return true; } - reportInvalidInvoke(type, method); + reportInvalidInvoke(type, method, context); return false; } @@ -173,8 +181,11 @@ || canGenerateWrapper(type); } - private void reportInvalidInvoke(DexType type, DexMethod invokedMethod) { + private void reportInvalidInvoke(DexType type, DexMethod invokedMethod, ProgramMethod context) { DexType desugaredType = appView.rewritePrefix.rewrittenType(type, appView); + Origin origin = context != null ? context.getOrigin() : Origin.unknown(); + Position position = + context != null ? new MethodPosition(context.getMethodReference()) : Position.UNKNOWN; StringDiagnostic diagnostic = new StringDiagnostic( "Invoke to " @@ -183,7 +194,9 @@ + invokedMethod.name + " may not work correctly at runtime (Cannot convert type " + desugaredType - + ")."); + + ").", + origin, + position); if (appView.options().isDesugaredLibraryCompilation()) { throw appView.options().reporter.fatalError(diagnostic); } else {
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 23e9e26..b648635 100644 --- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java +++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -76,7 +76,9 @@ } DexType dexType = clazz.type; if (isAnnotation(dexType) && isAnnotationWithEnum(dexType)) { - addAnnotationsWithEnum(clazz); + if (isVisibleAnnotation(clazz)) { + addAnnotationsWithEnum(clazz); + } continue; } // Classes with annotations must be in the same dex file as the annotation. As all @@ -93,6 +95,23 @@ } } + private boolean isVisibleAnnotation(DexProgramClass clazz) { + if (retainCompileTimeAnnotation(clazz.type)) { + return true; + } + DexAnnotation retentionAnnotation = + clazz.annotations().getFirstMatching(appView.dexItemFactory().retentionType); + // Default is CLASS retention + if (retentionAnnotation == null) { + return false; + } + return retentionAnnotation.annotation.toString().contains("RUNTIME"); + } + + private boolean retainCompileTimeAnnotation(DexType type) { + return DexAnnotation.retainCompileTimeAnnotation(type, appView.options()); + } + private boolean isAnnotationWithEnum(DexType dexType) { Boolean value = annotationTypeContainEnum.get(dexType); if (value == null) { @@ -109,15 +128,18 @@ if (proto.parameters.isEmpty()) { DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory()); if (valueType.isClassType()) { - if (isEnum(valueType)) { - value = true; - break; - } else if (isAnnotation(valueType) && isAnnotationWithEnum(valueType)) { - value = true; - break; - } + assert !value; + boolean notLibraryOrTakeBootClasspath = + !appInfo().definitionFor(valueType).isLibraryClass() + || !appView.options().ignoreBootClasspathEnumsForMaindexTracing; + value = + (isEnum(valueType) && notLibraryOrTakeBootClasspath) + || (isAnnotation(valueType) && isAnnotationWithEnum(valueType)); } } + if (value) { + break; + } } } annotationTypeContainEnum.put(dexType, value);
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java index 78aab7d..0fdc11c 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -518,7 +518,11 @@ // Skipping min_api check and compiling an intermediate result intended for later merging. // Intermediate builds also emits or update synthesized classes mapping. public boolean intermediate = false; - public boolean readCompileTimeAnnotations = true; + public boolean retainCompileTimeAnnotations = true; + public boolean ignoreBootClasspathEnumsForMaindexTracing = + System.getProperty("com.android.tools.r8.ignoreBootClasspathEnumsForMaindexTracing") != null; + public boolean pruneNonVissibleAnnotationClasses = + System.getProperty("com.android.tools.r8.pruneNonVissibleAnnotationClasses") != null; public List<String> logArgumentsFilter = ImmutableList.of(); // Flag to turn on/offLoad/store optimization in the Cf back-end.
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java index 634cfe8..853c057 100644 --- a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java +++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -32,6 +32,12 @@ }); } + public final GenerateMainDexListRunResult inspectMainDexClasses( + Consumer<List<ClassReference>> consumer) { + consumer.accept(getMainDexList()); + return self(); + } + public GenerateMainDexListRunResult inspectDiagnosticMessages( Consumer<TestDiagnosticMessages> consumer) { consumer.accept(state.getDiagnosticsMessages());
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java index 0d02a13..8f3b1e4 100644 --- a/src/test/java/com/android/tools/r8/ToolHelper.java +++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1342,6 +1342,14 @@ D8.runForTesting(command.getInputApp(), internalOptions); } + public static List<String> runGenerateMainDexList( + GenerateMainDexListCommand command, Consumer<InternalOptions> optionsConsumer) + throws CompilationFailedException { + InternalOptions internalOptions = command.getInternalOptions(); + optionsConsumer.accept(internalOptions); + return GenerateMainDexList.runForTesting(command.getInputApp(), internalOptions); + } + public static AndroidApp runDexer(String fileName, String outDir, String... extraArgs) throws IOException { List<String> args = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java new file mode 100644 index 0000000..9d5f2f1 --- /dev/null +++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java
@@ -0,0 +1,162 @@ +// Copyright (c) 2021, 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 com.android.tools.r8.maindexlist; + +import static com.android.tools.r8.maindexlist.MainDexRuntimeAndProgramEnumInAnnotationTest.EnumForAnnotation.TEST; +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.references.Reference; +import com.android.tools.r8.utils.BooleanUtils; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class MainDexRuntimeAndProgramEnumInAnnotationTest extends TestBase { + + Set<Class<?>> CUSTOM_CLASSES = + ImmutableSet.of( + B.class, + Main.class, + EnumForAnnotation.class, + RuntimeRetentionAnnotationWithProgramEnum.class); + Set<Class<?>> DEFAULT_CLASSES = + Sets.union( + CUSTOM_CLASSES, + ImmutableSet.of( + C.class, + RuntimeRetentionAnnotationWithRuntimeEnum.class, + RuntimeRetentionAnnotationWithoutEnum.class)); + + @Parameter(0) + public TestParameters parameters; + + @Parameter(1) + public boolean ignoreBootclasspathEnumsForMaindexTracing; + + @Parameters(name = "{0}, ignoreBootclasspathEnumsForMaindexTracing: {1}") + public static List<Object[]> parameters() { + return buildParameters( + getTestParameters() + .withDexRuntimes() + .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport()) + .build(), + BooleanUtils.values()); + } + + @Test + public void testMainDex() throws Exception { + testForMainDexListGenerator(temp) + .addInnerClasses(getClass()) + .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) + .addMainDexRules( + "-keep class " + Main.class.getTypeName() + " {", + " public static void main(java.lang.String[]);", + "}") + .applyIf( + ignoreBootclasspathEnumsForMaindexTracing, + builder -> + builder.addOptionsModification( + options -> { + options.ignoreBootClasspathEnumsForMaindexTracing = true; + })) + .run() + .inspectMainDexClasses( + mainDexList -> { + assertEquals( + (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES) + .stream().map(Reference::classFromClass).collect(Collectors.toSet()), + new HashSet<>(mainDexList)); + }); + } + + @Test + public void testD8() throws Exception { + testForD8(temp) + .addInnerClasses(getClass()) + .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) + .setMinApi(parameters.getApiLevel()) + .applyIf( + ignoreBootclasspathEnumsForMaindexTracing, + builder -> + builder.addOptionsModification( + options -> options.ignoreBootClasspathEnumsForMaindexTracing = true)) + .collectMainDexClasses() + .addMainDexRules( + "-keep class " + Main.class.getTypeName() + " {", + " public static void main(java.lang.String[]);", + "}") + .compile() + .inspectMainDexClasses( + mainDexClasses -> { + assertEquals( + (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES) + .stream().map(TestBase::typeName).collect(Collectors.toSet()), + mainDexClasses); + }); + } + + public enum EnumForAnnotation { + TEST + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface RuntimeRetentionAnnotationWithoutEnum {} + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface RuntimeRetentionAnnotationWithProgramEnum { + + EnumForAnnotation value() default TEST; + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface RuntimeRetentionAnnotationWithRuntimeEnum { + + ElementType value(); + } + + @RuntimeRetentionAnnotationWithoutEnum + public static class A { + + public static void main(String[] args) {} + } + + @RuntimeRetentionAnnotationWithProgramEnum + public static class B { + + public static void main(String[] args) {} + } + + @RuntimeRetentionAnnotationWithRuntimeEnum(ElementType.TYPE) + public static class C { + + public static void main(String[] args) {} + } + + public static class Main { + + public static void main(String[] args) { + System.out.println("Hello, world!"); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java index 74cc91d..089f670 100644 --- a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java +++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
@@ -8,11 +8,9 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.references.ClassReference; import com.android.tools.r8.references.Reference; -import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.BooleanUtils; import com.google.common.collect.ImmutableSet; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -21,82 +19,106 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class MainDexSourceAndClassRetentionTest extends TestBase { - private final TestParameters parameters; + private static final Set<Class<?>> MAINDEX_CLASSES = ImmutableSet.of(Main.class); - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters() - .withDexRuntimes() - .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport()) - .build(); - } + @Parameter(0) + public TestParameters parameters; - public MainDexSourceAndClassRetentionTest(TestParameters parameters) { - this.parameters = parameters; + @Parameter(1) + public boolean pruneNonVisibleAnnotationClasses; + + @Parameters(name = "{0}, pruneNonVisibleAnnotationClasses: {1}") + public static List<Object[]> parameters() { + return buildParameters( + getTestParameters() + .withDexRuntimes() + .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport()) + .build(), + BooleanUtils.values()); } @Test public void testMainDex() throws Exception { - List<ClassReference> mainDexList = - testForMainDexListGenerator(temp) - .addInnerClasses(getClass()) - .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.B)) - .addMainDexRules( - "-keep class " + Main.class.getTypeName() + " {", - " public static void main(java.lang.String[]);", - "}") - .run() - .getMainDexList(); - // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included. - assertEquals( - ImmutableSet.of( - Reference.classFromClass(Foo.class), - Reference.classFromClass(Bar.class), - Reference.classFromClass(Main.class), - Reference.classFromClass(ClassRetentionAnnotation.class), - Reference.classFromClass(SourceRetentionAnnotation.class)), - new HashSet<>(mainDexList)); + testForMainDexListGenerator(temp) + .addInnerClasses(getClass()) + .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) + .addMainDexRules( + "-keep class " + Main.class.getTypeName() + " {", + " public static void main(java.lang.String[]);", + "}") + .applyIf( + pruneNonVisibleAnnotationClasses, + builder -> { + builder.addOptionsModification( + options -> options.pruneNonVissibleAnnotationClasses = true); + }) + .run() + .inspectMainDexClasses( + mainDexList -> { + assertEquals( + MAINDEX_CLASSES.stream() + .map(Reference::classFromClass) + .collect(Collectors.toSet()), + new HashSet<>(mainDexList)); + }); } @Test public void testD8() throws Exception { - Set<String> mainDexClasses = - testForD8(temp) - .addInnerClasses(getClass()) - .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) - .setMinApi(parameters.getApiLevel()) - .collectMainDexClasses() - .addMainDexRules( - "-keep class " + Main.class.getTypeName() + " {", - " public static void main(java.lang.String[]);", - "}") - .compile() - .getMainDexClasses(); - // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included. - assertEquals( - ImmutableSet.of( - typeName(Foo.class), - typeName(Bar.class), - typeName(Main.class), - typeName(ClassRetentionAnnotation.class), - typeName(SourceRetentionAnnotation.class)), - mainDexClasses); + testForD8(temp) + .addInnerClasses(getClass()) + .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) + .setMinApi(parameters.getApiLevel()) + .applyIf( + pruneNonVisibleAnnotationClasses, + builder -> { + builder.addOptionsModification( + options -> options.pruneNonVissibleAnnotationClasses = true); + }) + .collectMainDexClasses() + .addMainDexRules( + "-keep class " + Main.class.getTypeName() + " {", + " public static void main(java.lang.String[]);", + "}") + .allowStdoutMessages() + .compile() + .inspect( + inspector -> { + // Source and class retention annotation classes are still in the output, but does not + // annotate anything. + assertEquals( + pruneNonVisibleAnnotationClasses, + !inspector.clazz(SourceRetentionAnnotation.class).isPresent()); + assertEquals( + pruneNonVisibleAnnotationClasses, + !inspector.clazz(ClassRetentionAnnotation.class).isPresent()); + assertEquals(0, inspector.clazz(Main.class).annotations().size()); + assertEquals(0, inspector.clazz(A.class).annotations().size()); + }) + .inspectMainDexClasses( + mainDexClasses -> { + assertEquals( + MAINDEX_CLASSES.stream().map(TestBase::typeName).collect(Collectors.toSet()), + new HashSet<>(mainDexClasses)); + }); } public enum Foo { - TEST; + TEST } public enum Bar { - TEST; + TEST } @Retention(RetentionPolicy.SOURCE) @@ -115,6 +137,13 @@ @SourceRetentionAnnotation(Foo.TEST) @ClassRetentionAnnotation(Bar.TEST) + public static class A { + + public static void main(String[] args) {} + } + + @SourceRetentionAnnotation(Foo.TEST) + @ClassRetentionAnnotation(Bar.TEST) public static class Main { public static void main(String[] args) {}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java index 4ea9a82..2d74926 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -110,6 +110,11 @@ } @Override + public List<AnnotationSubject> annotations() { + throw new Unreachable("Cannot determine if an absent class has annotations"); + } + + @Override public AnnotationSubject annotation(String name) { return new AbsentAnnotationSubject(); }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java index 6d7067a..8d91f3c 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.graph.DexValue; import com.android.tools.r8.naming.MemberNaming.Signature; import com.android.tools.r8.references.FieldReference; +import java.util.List; public class AbsentFieldSubject extends FieldSubject { @@ -59,6 +60,11 @@ } @Override + public List<AnnotationSubject> annotations() { + throw new Unreachable("Cannot determine if an absent field has annotations"); + } + + @Override public AnnotationSubject annotation(String name) { return new AbsentAnnotationSubject(); }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java index 9299e7f..4ffcdb4 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.naming.MemberNaming.MethodSignature; import com.android.tools.r8.naming.MemberNaming.Signature; +import java.util.List; public class AbsentMethodSubject extends MethodSubject { @@ -116,6 +117,11 @@ } @Override + public List<AnnotationSubject> annotations() { + throw new Unreachable("Cannot determine if an absent method has annotations"); + } + + @Override public AnnotationSubject annotation(String name) { return new AbsentAnnotationSubject(); }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java index 2dc0774..754b470 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
@@ -6,9 +6,12 @@ import com.android.tools.r8.graph.AccessFlags; import java.lang.annotation.Annotation; +import java.util.List; public abstract class ClassOrMemberSubject extends Subject { + public abstract List<AnnotationSubject> annotations(); + public abstract AnnotationSubject annotation(String name); public final AnnotationSubject annotation(Class<? extends Annotation> clazz) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java index 318f0d9..a0839d8 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -349,6 +349,15 @@ } @Override + public List<AnnotationSubject> annotations() { + List<AnnotationSubject> result = new ArrayList<>(); + for (DexAnnotation annotation : dexClass.annotations().annotations) { + result.add(new FoundAnnotationSubject(annotation)); + } + return result; + } + + @Override public AnnotationSubject annotation(String name) { // Ensure we don't check for annotations represented as attributes. assert !name.endsWith("EnclosingClass")
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java index 023c088..2ea0107 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.utils.codeinspector; +import com.android.tools.r8.errors.Unimplemented; import com.android.tools.r8.graph.AccessFlags; import com.android.tools.r8.graph.DexAnnotation; import com.android.tools.r8.graph.DexEncodedField; @@ -15,6 +16,7 @@ import com.android.tools.r8.naming.signature.GenericSignatureParser; import com.android.tools.r8.references.FieldReference; import com.android.tools.r8.references.Reference; +import java.util.List; public class FoundFieldSubject extends FieldSubject { @@ -112,6 +114,11 @@ } @Override + public List<AnnotationSubject> annotations() { + throw new Unimplemented(); + } + + @Override public AnnotationSubject annotation(String name) { DexAnnotation annotation = codeInspector.findAnnotation(name, dexField.annotations()); return annotation == null
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java index d781ef5..7c882b4 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -325,6 +325,11 @@ } @Override + public List<AnnotationSubject> annotations() { + throw new Unimplemented(); + } + + @Override public AnnotationSubject annotation(String name) { DexAnnotation annotation = codeInspector.findAnnotation(name, dexMethod.annotations()); return annotation == null
diff --git a/third_party/bazel.tar.gz.sha1 b/third_party/bazel.tar.gz.sha1 index b1968d5..1bf5a5d 100644 --- a/third_party/bazel.tar.gz.sha1 +++ b/third_party/bazel.tar.gz.sha1
@@ -1 +1 @@ -83891f00eacc568434eb59a43ba2ee31ac5c4342 \ No newline at end of file +5b62e958e734266ebf0e136ee23e440a99b508e1 \ No newline at end of file
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 index 64f4609..4e9a38b 100644 --- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 +++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@ -112c4e2bbfdd1e825ee02a98416ba385ad5433d0 \ No newline at end of file +ae9eb01960d396ab603c611960f456d14ce7a1a8 \ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py index d2c1ef1..a44524e 100755 --- a/tools/archive_desugar_jdk_libs.py +++ b/tools/archive_desugar_jdk_libs.py
@@ -33,6 +33,10 @@ def ParseOptions(argv): result = optparse.OptionParser() + result.add_option('--variant', + help='.', + choices = ['jdk8', 'jdk11'], + default='jdk8') result.add_option('--dry-run', '--dry_run', help='Running on bot, use third_party dependency.', default=False, @@ -90,7 +94,11 @@ raise Exception('Variant ' + variant + 'is not supported') with utils.ChangedWorkingDirectory(checkout_dir): bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel') - cmd = [bazel, 'build', 'maven_release' + ('_jdk11' if variant == 'jdk11' else '')] + cmd = [ + bazel, + '--bazelrc=/dev/null', + 'build', + 'maven_release' + ('_jdk11' if variant == 'jdk11' else '')] utils.PrintCmd(cmd) subprocess.check_call(cmd) cmd = [bazel, 'shutdown'] @@ -108,7 +116,7 @@ maven_zip = os.path.join( checkout_dir, 'bazel-bin', - LIBRARY_NAME + ('_jdk11' if variant != 'jdk11' else '') +'.zip') + LIBRARY_NAME + ('_jdk11' if variant == 'jdk11' else '') +'.zip') return (library_jar, maven_zip) @@ -138,7 +146,7 @@ if options.build_only: with utils.TempDir() as checkout_dir: CloneDesugaredLibrary(options.github_account, checkout_dir) - (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8") + (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant) shutil.copyfile( library_jar, os.path.join(options.build_only, os.path.basename(library_jar))) @@ -160,7 +168,7 @@ raise Exception( 'Target archive directory %s already exists' % destination) - (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8") + (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant) storage_path = LIBRARY_NAME + '/' + version # Upload the jar file with the library.