Version 2.1.73

Cherry pick (partial): Rewrite and prune AppServices in lock-step with AppInfoWithLiveness
CL: https://r8-review.googlesource.com/c/r8/+/54066

This cherry picks a fix from https://r8-review.googlesource.com/c/r8/+/54066 which fixes a NullPointerException in presence of missing service providers and feature splits.

Bug: 168827630
Change-Id: I00ca494e4a52e4a6e51b3b729a68e710118c2753
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index c57eb07..5c057db 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 = "2.1.72";
+  public static final String LABEL = "2.1.73";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/graph/AppServices.java b/src/main/java/com/android/tools/r8/graph/AppServices.java
index 0dbaa30..29e9041 100644
--- a/src/main/java/com/android/tools/r8/graph/AppServices.java
+++ b/src/main/java/com/android/tools/r8/graph/AppServices.java
@@ -89,12 +89,14 @@
     }
     // Check if service is defined feature
     DexProgramClass serviceClass = appView.definitionForProgramType(serviceType);
-    if (appView.options().featureSplitConfiguration.isInFeature(serviceClass)) {
+    if (serviceClass != null
+        && appView.options().featureSplitConfiguration.isInFeature(serviceClass)) {
       return true;
     }
-    for (DexType dexType : featureImplementations.get(FeatureSplit.BASE)) {
-      DexProgramClass implementationClass = appView.definitionForProgramType(dexType);
-      if (appView.options().featureSplitConfiguration.isInFeature(implementationClass)) {
+    for (DexType implementationType : featureImplementations.get(FeatureSplit.BASE)) {
+      DexProgramClass implementationClass = appView.definitionForProgramType(implementationType);
+      if (implementationClass != null
+          && appView.options().featureSplitConfiguration.isInFeature(implementationClass)) {
         return true;
       }
     }