diff --git a/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java b/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
index 5358794..3206494 100644
--- a/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
+++ b/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
@@ -38,6 +38,7 @@
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.suite.BaseTestSuite;
 import com.android.tradefed.testtype.suite.SuiteTestFilter;
+import com.android.tradefed.util.AbiUtils;
 import com.android.tradefed.util.QuotationAwareTokenizer;
 import com.android.tradefed.util.TestRecordInterpreter;
 
@@ -222,10 +223,28 @@
         } else {
             types.add(mRetryType);
         }
+
+        // Expand the exclude-filter in case no abi is specified.
+        Set<String> extendedExcludeRetryFilters = new HashSet<>();
+        for (String excludeFilter : mExcludeFilters) {
+            SuiteTestFilter suiteFilter = SuiteTestFilter.createFrom(excludeFilter);
+            // Keep the current exclude-filter
+            extendedExcludeRetryFilters.add(excludeFilter);
+            if (suiteFilter.getAbi() == null) {
+                // If no abi is specified, exclude them all.
+                Set<String> abis = AbiUtils.getAbisSupportedByCompatibility();
+                for (String abi : abis) {
+                    SuiteTestFilter namingFilter =
+                            new SuiteTestFilter(abi, suiteFilter.getName(), suiteFilter.getTest());
+                    extendedExcludeRetryFilters.add(namingFilter.toString());
+                }
+            }
+        }
+
         // Prepare exclusion filters
         for (TestRunResult moduleResult : results.getMergedTestRunResults()) {
             // If the module is explicitly excluded from retries, preserve the original results.
-            if (!mExcludeFilters.contains(moduleResult.getName())
+            if (!extendedExcludeRetryFilters.contains(moduleResult.getName())
                     && RetryResultHelper.shouldRunModule(moduleResult, types)) {
                 if (types.contains(RetryType.NOT_EXECUTED)) {
                     // Clear the run failure since we are attempting to rerun all non-executed
diff --git a/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java b/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
index 23d219c..380e75c 100644
--- a/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
+++ b/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
@@ -35,6 +35,8 @@
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.result.proto.ProtoResultReporter;
 import com.android.tradefed.result.proto.TestRecordProto.TestRecord;
+import com.android.tradefed.testtype.Abi;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.suite.BaseTestSuite;
 
 import org.easymock.EasyMock;
@@ -345,6 +347,50 @@
         verify(mSuite).setExcludeFilter(excludeRun1);
     }
 
+    /**
+     * Test that if an exclude-filter is provided without abi, we are still able to exclude all the
+     * matching modules for all abis.
+     */
+    @Test
+    public void testReschedule_excludeFilters_abi() throws Exception {
+        OptionSetter setter = new OptionSetter(mTest);
+        // We specify to exclude "run1"
+        setter.setOptionValue(BaseTestSuite.EXCLUDE_FILTER_OPTION, "run1");
+        populateFakeResults(2, 2, 1, 0, 0, false, new Abi("armeabi-v7a", "32"));
+        mMockLoader.init();
+        EasyMock.expect(mMockLoader.getCommandLine()).andReturn("previous_command");
+        EasyMock.expect(mMockFactory.createConfigurationFromArgs(EasyMock.anyObject()))
+                .andReturn(mRescheduledConfiguration);
+        EasyMock.expect(mMockLoader.loadPreviousRecord()).andReturn(mFakeRecord);
+
+        mRescheduledConfiguration.setTests(EasyMock.anyObject());
+        EasyMock.expectLastCall().times(1);
+
+        EasyMock.expect(mMockRescheduler.scheduleConfig(mRescheduledConfiguration)).andReturn(true);
+        EasyMock.replay(
+                mMockRescheduler,
+                mMockLoader,
+                mMockFactory,
+                mRescheduledConfiguration,
+                mMockCommandOptions);
+        mTest.run(null);
+        EasyMock.verify(
+                mMockRescheduler,
+                mMockLoader,
+                mMockFactory,
+                mRescheduledConfiguration,
+                mMockCommandOptions);
+
+        Set<String> excludeRun0 = new HashSet<>();
+        // Run with the abi are excluded
+        excludeRun0.add("armeabi-v7a run0 test.class#testPass0");
+        verify(mSuite).setExcludeFilter(excludeRun0);
+        Set<String> excludeRun1 = new HashSet<>();
+        // Even if run1 had failed test cases, it was excluded so it's not running.
+        excludeRun1.add("armeabi-v7a run1");
+        verify(mSuite).setExcludeFilter(excludeRun1);
+    }
+
     /** Test rescheduling a configuration when no parameterized tests previously failed. */
     @Test
     public void testReschedule_parameterized_nofail() throws Exception {
@@ -452,6 +498,18 @@
             int assumpFailure,
             int parameterized,
             boolean failedParam) {
+        populateFakeResults(
+                numModule, numTests, failedTests, assumpFailure, parameterized, failedParam, null);
+    }
+
+    private void populateFakeResults(
+            int numModule,
+            int numTests,
+            int failedTests,
+            int assumpFailure,
+            int parameterized,
+            boolean failedParam,
+            IAbi abi) {
         ProtoResultReporter reporter =
                 new ProtoResultReporter() {
                     @Override
@@ -464,7 +522,11 @@
         context.addDeviceBuildInfo(ConfigurationDef.DEFAULT_DEVICE_NAME, new BuildInfo());
         reporter.invocationStarted(context);
         for (int i = 0; i < numModule; i++) {
-            reporter.testRunStarted("run" + i, numTests);
+            String runName = "run" + i;
+            if (abi != null) {
+                runName = abi.getName() + " " + runName;
+            }
+            reporter.testRunStarted(runName, numTests);
             for (int j = 0; j < numTests - failedTests - assumpFailure - parameterized; j++) {
                 TestDescription test = new TestDescription("test.class", "testPass" + j);
                 reporter.testStarted(test);
