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