Remove remaining reflection usage in compiledump
Bug: b/377606434
Change-Id: I2bfd766db01ea78305c1e90e80d2932e42de217b
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
index 684dab3..0cf82dc 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
@@ -7,32 +7,13 @@
import com.android.tools.r8.BaseCompilerCommand;
import com.android.tools.r8.utils.compiledump.ArtProfileDumpUtils;
import java.io.IOException;
-import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.function.Consumer;
public class CompileDumpBase {
- static void setEnableExperimentalMissingLibraryApiModeling(
- Object builder, boolean enableMissingLibraryApiModeling) {
- getReflectiveBuilderMethod(
- builder, "setEnableExperimentalMissingLibraryApiModeling", boolean.class)
- .accept(new Object[] {enableMissingLibraryApiModeling});
- }
-
- static void setAndroidPlatformBuild(Object builder, boolean androidPlatformBuild) {
- getReflectiveBuilderMethod(builder, "setAndroidPlatformBuild", boolean.class)
- .accept(new Object[] {androidPlatformBuild});
- }
-
- static void setIsolatedSplits(Object builder, boolean isolatedSplits) {
- getReflectiveBuilderMethod(builder, "setEnableIsolatedSplits", boolean.class)
- .accept(new Object[] {isolatedSplits});
- }
-
static void addArtProfilesForRewriting(
BaseCompilerCommand.Builder<?, ?> builder, Map<Path, Path> artProfileFiles) {
for (Entry<Path, Path> inputOutput : artProfileFiles.entrySet()) {
@@ -44,24 +25,6 @@
}
}
- static Consumer<Object[]> getReflectiveBuilderMethod(
- Object builder, String setter, Class<?>... parameters) {
- try {
- Method declaredMethod = builder.getClass().getMethod(setter, parameters);
- return args -> {
- try {
- declaredMethod.invoke(builder, args);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
- } catch (NoSuchMethodException e) {
- System.out.println(setter + " is not available on the compiledump version.");
- // The option is not available so we just return an empty consumer
- return args -> {};
- }
- }
-
@SuppressWarnings({"CatchAndPrintStackTrace", "DefaultCharset"})
// We cannot use StringResource since this class is added to the class path and has access only
// to the public APIs.
@@ -84,4 +47,20 @@
System.out.println(onMissing);
}
}
+
+ protected static class BooleanBox {
+ public boolean value = false;
+
+ public BooleanBox(boolean value) {
+ this.value = value;
+ }
+
+ public void set(boolean value) {
+ this.value = value;
+ }
+
+ public boolean get() {
+ return value;
+ }
+ }
}
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
index d13ef27..ef8e947 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.utils.compiledump.CompilerCommandDumpUtils;
import com.android.tools.r8.utils.compiledump.ResourceShrinkerDumpUtils;
import com.android.tools.r8.utils.compiledump.StartupProfileDumpUtils;
import java.nio.file.Path;
@@ -96,9 +97,9 @@
Path androidResourcesOutput = null;
int minApi = 1;
int threads = -1;
- boolean enableMissingLibraryApiModeling = false;
- boolean androidPlatformBuild = false;
- boolean isolatedSplits = false;
+ BooleanBox enableMissingLibraryApiModeling = new BooleanBox(false);
+ BooleanBox androidPlatformBuild = new BooleanBox(false);
+ BooleanBox isolatedSplits = new BooleanBox(false);
for (int i = 0; i < args.length; i++) {
String option = args[i];
if (VALID_OPTIONS.contains(option)) {
@@ -124,13 +125,13 @@
break;
}
case "--enable-missing-library-api-modeling":
- enableMissingLibraryApiModeling = true;
+ enableMissingLibraryApiModeling.set(true);
break;
case "--android-platform-build":
- androidPlatformBuild = true;
+ androidPlatformBuild.set(true);
break;
case ISOLATED_SPLITS_FLAG:
- isolatedSplits = true;
+ isolatedSplits.set(true);
break;
default:
throw new IllegalArgumentException("Unimplemented option: " + option);
@@ -244,9 +245,19 @@
() -> StartupProfileDumpUtils.addStartupProfiles(startupProfileFiles, commandBuilder),
"Could not add startup profiles.");
}
- setAndroidPlatformBuild(commandBuilder, androidPlatformBuild);
- setIsolatedSplits(commandBuilder, isolatedSplits);
- setEnableExperimentalMissingLibraryApiModeling(commandBuilder, enableMissingLibraryApiModeling);
+ runIgnoreMissing(
+ () ->
+ CompilerCommandDumpUtils.setAndroidPlatformBuild(
+ commandBuilder, androidPlatformBuild.get()),
+ "Android platform flag not available.");
+ runIgnoreMissing(
+ () -> CompilerCommandDumpUtils.setIsolatedSplits(commandBuilder, isolatedSplits.get()),
+ "Isolated splits flag not available.");
+ runIgnoreMissing(
+ () ->
+ CompilerCommandDumpUtils.setEnableExperimentalMissingLibraryApiModeling(
+ commandBuilder, enableMissingLibraryApiModeling.get()),
+ "Missing library api modeling not available.");
if (desugaredLibJson != null) {
commandBuilder.addDesugaredLibraryConfiguration(readAllBytesJava7(desugaredLibJson));
}
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
index 27ee2f1..e9ce914 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.D8Command;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.utils.compiledump.CompilerCommandDumpUtils;
import com.android.tools.r8.utils.compiledump.StartupProfileDumpUtils;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -72,8 +73,8 @@
List<Path> startupProfileFiles = new ArrayList<>();
int minApi = 1;
int threads = -1;
- boolean enableMissingLibraryApiModeling = false;
- boolean androidPlatformBuild = false;
+ BooleanBox enableMissingLibraryApiModeling = new BooleanBox(false);
+ BooleanBox androidPlatformBuild = new BooleanBox(false);
for (int i = 0; i < args.length; i++) {
String option = args[i];
if (VALID_OPTIONS.contains(option)) {
@@ -94,10 +95,10 @@
break;
}
case "--enable-missing-library-api-modeling":
- enableMissingLibraryApiModeling = true;
+ enableMissingLibraryApiModeling.set(true);
break;
case "--android-platform-build":
- androidPlatformBuild = true;
+ androidPlatformBuild.set(true);
break;
default:
throw new IllegalArgumentException("Unimplemented option: " + option);
@@ -183,8 +184,16 @@
() -> StartupProfileDumpUtils.addStartupProfiles(startupProfileFiles, commandBuilder),
"Could not add startup profiles.");
}
- setAndroidPlatformBuild(commandBuilder, androidPlatformBuild);
- setEnableExperimentalMissingLibraryApiModeling(commandBuilder, enableMissingLibraryApiModeling);
+ runIgnoreMissing(
+ () ->
+ CompilerCommandDumpUtils.setAndroidPlatformBuild(
+ commandBuilder, androidPlatformBuild.get()),
+ "Android platform flag not available.");
+ runIgnoreMissing(
+ () ->
+ CompilerCommandDumpUtils.setEnableExperimentalMissingLibraryApiModeling(
+ commandBuilder, enableMissingLibraryApiModeling.get()),
+ "Missing library api modeling not available.");
if (desugaredLibJson != null) {
commandBuilder.addDesugaredLibraryConfiguration(readAllBytesJava7(desugaredLibJson));
}
diff --git a/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java b/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java
new file mode 100644
index 0000000..3a7f051
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2024, 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.utils.compiledump;
+
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.R8Command;
+
+// Simple boolean commands directly on compiler command builders
+public class CompilerCommandDumpUtils {
+ public static void setEnableExperimentalMissingLibraryApiModeling(
+ R8Command.Builder builder, boolean enable) {
+ builder.setEnableExperimentalMissingLibraryApiModeling(enable);
+ }
+
+ public static void setEnableExperimentalMissingLibraryApiModeling(
+ D8Command.Builder builder, boolean enable) {
+ builder.setEnableExperimentalMissingLibraryApiModeling(enable);
+ }
+
+ public static void setAndroidPlatformBuild(
+ R8Command.Builder builder, boolean androidPlatformBuild) {
+ builder.setAndroidPlatformBuild(androidPlatformBuild);
+ }
+
+ public static void setAndroidPlatformBuild(
+ D8Command.Builder builder, boolean androidPlatformBuild) {
+ builder.setAndroidPlatformBuild(androidPlatformBuild);
+ }
+
+ public static void setIsolatedSplits(R8Command.Builder builder, boolean isolatedSplits) {
+ builder.setEnableIsolatedSplits(isolatedSplits);
+ }
+}