diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java
index fa0a094..2ef79c8 100644
--- a/src/main/java/com/android/tools/r8/R8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/R8CommandParser.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.StringConsumer.FileConsumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.profile.art.ArtProfileConsumerUtils;
 import com.android.tools.r8.profile.art.ArtProfileProviderUtils;
 import com.android.tools.r8.profile.startup.StartupProfileProviderUtils;
@@ -20,15 +19,12 @@
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import java.io.File;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 
 public class R8CommandParser extends BaseCompilerCommandParser<R8Command, R8Command.Builder> {
@@ -45,7 +41,6 @@
           "--main-dex-rules",
           "--main-dex-list",
           "--feature",
-          "--android-resources",
           "--main-dex-list-output",
           "--pg-conf",
           "--pg-conf-output",
@@ -62,7 +57,7 @@
 
   // Note: this must be a subset of OPTIONS_WITH_ONE_PARAMETER.
   private static final Set<String> OPTIONS_WITH_TWO_PARAMETERS =
-      ImmutableSet.of(ART_PROFILE_FLAG, "--feature", "--android-resources");
+      ImmutableSet.of(ART_PROFILE_FLAG, "--feature");
 
   // Due to the family of flags (for assertions and diagnostics) we can't base the one/two args
   // on this setup of flags. Thus, the flag collection just encodes the descriptive content.
@@ -101,21 +96,11 @@
         .add(ParseFlagInfoImpl.getMainDexList())
         .add(
             flag2(
-                "--android-resources",
+                "--feature",
                 "<input>",
                 "<output>",
-                "Add android resource input and output to be used in resource shrinking. Both ",
-                "input and output must be specified."))
-        .add(
-            flag2(
-                "--feature",
-                "<input>[:|;<res-input>]",
-                "<output>[:|;<res-output>]",
                 "Add feature <input> file to <output> file. Several ",
-                "occurrences can map to the same output. If <res-input> and <res-output> are ",
-                "specified use these as resource shrinker input and output. Separator is : on ",
-                "linux/mac, ; on windows. It is possible to supply resource only features by ",
-                " using an empty string for <input> and <output>, e.g. --feature :in.ap_ :out.ap_"))
+                "occurrences can map to the same output."))
         .add(ParseFlagInfoImpl.getIsolatedSplits())
         .add(flag1("--main-dex-list-output", "<file>", "Output the full main-dex list in <file>."))
         .addAll(ParseFlagInfoImpl.getAssertionsFlags())
@@ -208,7 +193,7 @@
   private void parse(
       String[] args, Origin argsOrigin, R8Command.Builder builder, ParseState state) {
     String[] expandedArgs = FlagFile.expandFlagFiles(args, builder::error);
-    FeatureSplitConfigCollector featureSplitConfigCollector = new FeatureSplitConfigCollector();
+    Map<Path, List<Path>> featureSplitJars = new HashMap<>();
     for (int i = 0; i < expandedArgs.length; i++) {
       String arg = expandedArgs[i].trim();
       String nextArg = null;
@@ -305,15 +290,10 @@
         builder.setDisableDesugaring(true);
       } else if (arg.equals("--main-dex-rules")) {
         builder.addMainDexRulesFiles(Paths.get(nextArg));
-      } else if (arg.equals("--android-resources")) {
-        Path inputPath = Paths.get(nextArg);
-        Path outputPath = Paths.get(nextNextArg);
-        builder.setAndroidResourceProvider(
-            new ArchiveProtoAndroidResourceProvider(inputPath, new PathOrigin(inputPath)));
-        builder.setAndroidResourceConsumer(
-            new ArchiveProtoAndroidResourceConsumer(outputPath, inputPath));
       } else if (arg.equals("--feature")) {
-        featureSplitConfigCollector.addInputOutput(nextArg, nextNextArg);
+        featureSplitJars
+            .computeIfAbsent(Paths.get(nextNextArg), k -> new ArrayList<>())
+            .add(Paths.get(nextArg));
       } else if (arg.equals(ISOLATED_SPLITS_FLAG)) {
         builder.setEnableIsolatedSplits(true);
       } else if (arg.equals("--main-dex-list")) {
@@ -378,117 +358,20 @@
         builder.addProgramFiles(Paths.get(arg));
       }
     }
-    addFeatureSplitConfigs(builder, featureSplitConfigCollector.getConfigs());
+    featureSplitJars.forEach(
+        (outputPath, inputJars) -> addFeatureJar(builder, outputPath, inputJars));
   }
 
-  private void addFeatureSplitConfigs(
-      R8Command.Builder builder, Collection<FeatureSplitConfig> featureSplitConfigs) {
-    for (FeatureSplitConfig featureSplitConfig : featureSplitConfigs) {
-      builder.addFeatureSplit(
-          featureSplitGenerator -> {
-            if (featureSplitConfig.outputJar != null) {
-              featureSplitGenerator.setProgramConsumer(
-                  builder.createProgramOutputConsumer(
-                      featureSplitConfig.outputJar, OutputMode.DexIndexed, true));
-            }
-            for (Path inputPath : featureSplitConfig.inputJars) {
-              featureSplitGenerator.addProgramResourceProvider(
-                  ArchiveProgramResourceProvider.fromArchive(inputPath));
-            }
-            if (featureSplitConfig.inputResources != null) {
-              featureSplitGenerator.setAndroidResourceProvider(
-                  new ArchiveProtoAndroidResourceProvider(
-                      featureSplitConfig.inputResources,
-                      new PathOrigin(featureSplitConfig.inputResources)));
-            }
-            if (featureSplitConfig.outputResources != null) {
-              featureSplitGenerator.setAndroidResourceConsumer(
-                  new ArchiveProtoAndroidResourceConsumer(
-                      featureSplitConfig.outputResources, featureSplitConfig.inputResources));
-            }
-            return featureSplitGenerator.build();
-          });
-    }
-  }
-
-  // Represents a set of paths parsed from a string that may contain a ":" (";" on windows).
-  // Supported examples are:
-  //   pathA -> first = pathA, second = null
-  //   pathA:pathB -> first = pathA, second = pathB
-  //   :pathB -> first = null, second = pathB
-  //   pathA: -> first = pathA, second = null
-  private static class PossibleDoublePath {
-
-    public final Path first;
-    public final Path second;
-
-    private PossibleDoublePath(Path first, Path second) {
-      this.first = first;
-      this.second = second;
-    }
-
-    public static PossibleDoublePath parse(String input) {
-      Path first = null, second = null;
-      List<String> inputSplit = StringUtils.split(input, File.pathSeparatorChar);
-      if (inputSplit.size() == 0 || inputSplit.size() > 2) {
-        throw new IllegalArgumentException("Feature input/output takes one or two paths.");
-      }
-      String firstString = inputSplit.get(0);
-      if (!firstString.isEmpty()) {
-        first = Paths.get(firstString);
-      }
-      if (inputSplit.size() == 2) {
-        // "a:".split() gives just ["a"], so we should never get here if we don't have
-        // a second string. ":b".split gives ["", "b"] which is handled for first above.
-        assert inputSplit.get(1).length() > 0;
-        second = Paths.get(inputSplit.get(1));
-      }
-      return new PossibleDoublePath(first, second);
-    }
-  }
-
-  private static class FeatureSplitConfig {
-    private List<Path> inputJars = new ArrayList<>();
-    private Path inputResources;
-    private Path outputResources;
-    private Path outputJar;
-  }
-
-  private static class FeatureSplitConfigCollector {
-
-    private List<FeatureSplitConfig> resourceOnlySplits = new ArrayList<>();
-    private Map<Path, FeatureSplitConfig> withCodeSplits = new HashMap<>();
-
-    public void addInputOutput(String input, String output) {
-      PossibleDoublePath inputPaths = PossibleDoublePath.parse(input);
-      PossibleDoublePath outputPaths = PossibleDoublePath.parse(output);
-      FeatureSplitConfig featureSplitConfig;
-      if (outputPaths.first != null) {
-        featureSplitConfig =
-            withCodeSplits.computeIfAbsent(outputPaths.first, k -> new FeatureSplitConfig());
-        featureSplitConfig.outputJar = outputPaths.first;
-        // We support adding resources independently of the input jars, which later --feature
-        // can add, so we might have no input jars here, example:
-        //  ... --feature :input_feature.ap_ out.jar:out_feature.ap_ --feature in.jar out.jar
-        if (inputPaths.first != null) {
-          featureSplitConfig.inputJars.add(inputPaths.first);
-        }
-      } else {
-        featureSplitConfig = new FeatureSplitConfig();
-        resourceOnlySplits.add(featureSplitConfig);
-      }
-      if (Objects.isNull(inputPaths.second) != Objects.isNull(outputPaths.second)) {
-        throw new IllegalArgumentException(
-            "Both input and output for feature resources must be provided");
-      }
-      featureSplitConfig.inputResources = inputPaths.second;
-      featureSplitConfig.outputResources = outputPaths.second;
-    }
-
-    public Collection<FeatureSplitConfig> getConfigs() {
-      ArrayList<FeatureSplitConfig> featureSplitConfigs = new ArrayList<>(resourceOnlySplits);
-      featureSplitConfigs.addAll(withCodeSplits.values());
-      return featureSplitConfigs;
-    }
+  public void addFeatureJar(R8Command.Builder builder, Path outputPath, List<Path> inputJarPaths) {
+    builder.addFeatureSplit(
+        featureSplitGenerator -> {
+          featureSplitGenerator.setProgramConsumer(
+              builder.createProgramOutputConsumer(outputPath, OutputMode.DexIndexed, true));
+          for (Path inputPath : inputJarPaths) {
+            featureSplitGenerator.addProgramResourceProvider(
+                ArchiveProgramResourceProvider.fromArchive(inputPath));
+          }
+          return featureSplitGenerator.build();
+        });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index 9ad9b4b..d22f197 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.AssertionsConfiguration.AssertionTransformationScope;
 import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.androidresources.AndroidResourceTestingUtils.AndroidTestResourceBuilder;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
@@ -32,7 +31,6 @@
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.ZipUtils;
 import com.google.common.collect.ImmutableList;
-import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
@@ -48,7 +46,6 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -81,21 +78,6 @@
     return jar;
   }
 
-  private Path getTestResources() throws Exception {
-    return new AndroidTestResourceBuilder()
-        .withSimpleManifestAndAppNameString()
-        .build(temp)
-        .getResourceZip();
-  }
-
-  private Path getFeatureTestResources(TemporaryFolder temp) throws Exception {
-    return new AndroidTestResourceBuilder()
-        .withSimpleManifestAndAppNameString()
-        .setPackageId(0x7E)
-        .build(temp)
-        .getResourceZip();
-  }
-
   @Test(expected = CompilationFailedException.class)
   public void emptyBuilder() throws Throwable {
     // The builder must have a program consumer.
@@ -196,68 +178,6 @@
   }
 
   @Test
-  public void passAndroidResources() throws Throwable {
-    Path working = temp.getRoot().toPath();
-    Path input = getJarWithA();
-    Path library = ToolHelper.getDefaultAndroidJar();
-    Path output = working.resolve("classes.dex");
-    Path resourceInput = getTestResources();
-    Path resourceOutput = working.resolve("resources_out.ap_");
-    assertFalse(Files.exists(output));
-    assertFalse(Files.exists(resourceOutput));
-    ProcessResult result =
-        ToolHelper.forkR8(
-            working,
-            input.toAbsolutePath().toString(),
-            "--lib",
-            library.toAbsolutePath().toString(),
-            "--android-resources",
-            resourceInput.toAbsolutePath().toString(),
-            resourceOutput.toAbsolutePath().toString(),
-            "--no-tree-shaking");
-    assertEquals("R8 run failed: " + result.stderr, 0, result.exitCode);
-    assertTrue(Files.exists(output));
-    System.out.println(result.stdout);
-    assertTrue(Files.exists(resourceOutput));
-  }
-
-  @Test
-  public void passFeatureResources() throws Throwable {
-    Path working = temp.getRoot().toPath();
-    Path input = getJarWithA();
-    Path inputFeature = getJarWithB();
-    Path library = ToolHelper.getDefaultAndroidJar();
-    Path output = working.resolve("classes.dex");
-    Path featureOutput = working.resolve("feature.zip");
-    Path resourceInput = getTestResources();
-    Path resourceOutput = working.resolve("resources_out.ap_");
-    TemporaryFolder featureSplitTemp = ToolHelper.getTemporaryFolderForTest();
-    featureSplitTemp.create();
-    Path featureReasourceInput = getFeatureTestResources(featureSplitTemp);
-    Path featureResourceOutput = working.resolve("feature_resources_out.ap_");
-    assertFalse(Files.exists(output));
-    assertFalse(Files.exists(featureOutput));
-    String pathSeparator = File.pathSeparator;
-    ProcessResult result =
-        ToolHelper.forkR8(
-            working,
-            input.toAbsolutePath().toString(),
-            "--lib",
-            library.toAbsolutePath().toString(),
-            "--android-resources",
-            resourceInput.toAbsolutePath().toString(),
-            resourceOutput.toAbsolutePath().toString(),
-            "--feature",
-            inputFeature.toAbsolutePath() + pathSeparator + featureReasourceInput.toAbsolutePath(),
-            featureOutput.toAbsolutePath() + pathSeparator + featureResourceOutput.toAbsolutePath(),
-            "--no-tree-shaking");
-    assertEquals("R8 run failed: " + result.stderr, 0, result.exitCode);
-    assertTrue(Files.exists(output));
-    assertTrue(Files.exists(featureOutput));
-    assertTrue(Files.exists(resourceOutput));
-  }
-
-  @Test
   public void featureOnlyOneArgument() throws Throwable {
     Path working = temp.getRoot().toPath();
     Path input = getJarWithA();
diff --git a/src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java b/src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
index 880f41a..c74d4d5 100644
--- a/src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/androidresources/AndroidResourceTestingUtils.java
@@ -368,7 +368,7 @@
       return this;
     }
 
-    public AndroidTestResourceBuilder setPackageId(int packageId) {
+    AndroidTestResourceBuilder setPackageId(int packageId) {
       this.packageId = packageId;
       return this;
     }
