Load threading module using direct reflection.
Service loading requires all the listed providers to be present. We
explicitly want to avoid having the blocking version present.
Bug: b/304992619
Change-Id: I2053462518a4bfac9035e2ba192bc1a64828c51c
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index 46141e9..bba3b84 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -26,7 +26,6 @@
java {
sourceSets.main.configure {
java.srcDir(getRoot().resolveAll("src", "main", "java"))
- resources.srcDirs(getRoot().resolveAll("src", "main", "resources"))
resources.srcDirs(getRoot().resolveAll("third_party", "api_database", "api_database"))
}
sourceCompatibility = JvmCompatibility.sourceCompatibility
diff --git a/src/main/java/com/android/tools/r8/threading/ThreadingModule.java b/src/main/java/com/android/tools/r8/threading/ThreadingModule.java
index b839e88..25f31bd 100644
--- a/src/main/java/com/android/tools/r8/threading/ThreadingModule.java
+++ b/src/main/java/com/android/tools/r8/threading/ThreadingModule.java
@@ -5,10 +5,8 @@
package com.android.tools.r8.threading;
import com.android.tools.r8.Keep;
-import com.android.tools.r8.errors.Unreachable;
-import java.util.Iterator;
+import com.android.tools.r8.errors.CompilationError;
import java.util.List;
-import java.util.ServiceLoader;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -29,15 +27,26 @@
class Loader {
+ // Splitting up the names to make reflective identification unlikely.
+ private static final String PACKAGE = "com.android.tools.r8.threading.providers";
+ private static final String[] IMPLEMENTATIONS = {
+ "blocking.ThreadingModuleBlockingProvider",
+ "singlethreaded.ThreadingModuleSingleThreadedProvider"
+ };
+
public static ThreadingModuleProvider load() {
- ServiceLoader<ThreadingModuleProvider> providers =
- ServiceLoader.load(ThreadingModuleProvider.class);
- // Don't use `Optional findFirst()` here as it hits a desugared-library issue.
- Iterator<ThreadingModuleProvider> iterator = providers.iterator();
- if (iterator.hasNext()) {
- return iterator.next();
+ for (String implementation : IMPLEMENTATIONS) {
+ String name = PACKAGE + "." + implementation;
+ try {
+ Class<?> providerClass = Class.forName(name);
+ return (ThreadingModuleProvider) providerClass.getDeclaredConstructor().newInstance();
+ } catch (ClassNotFoundException ignored) {
+ continue;
+ } catch (ReflectiveOperationException e) {
+ throw new CompilationError("Failure creating provider for the threading module", e);
+ }
}
- throw new Unreachable("Failure to service-load a provider for the threading module");
+ throw new CompilationError("Failure to find a provider for the threading module");
}
}
}
diff --git a/src/main/resources/META-INF/services/com.android.tools.r8.threading.ThreadingModuleProvider b/src/main/resources/META-INF/services/com.android.tools.r8.threading.ThreadingModuleProvider
deleted file mode 100644
index f54c274..0000000
--- a/src/main/resources/META-INF/services/com.android.tools.r8.threading.ThreadingModuleProvider
+++ /dev/null
@@ -1,2 +0,0 @@
-com.android.tools.r8.threading.providers.blocking.ThreadingModuleBlockingProvider
-com.android.tools.r8.threading.providers.singlethreaded.ThreadingModuleSingleThreadedProvider