如何使现代 Multidex 与旧 API 上的仪器测试一起工作

How to make modern Multidex work with instrumented tests on older APIs

我有一个使用 Multidex 设置的应用程序,似乎可以在较旧的 Android APIs 上加载和工作,但是,我有时会从无法找到任何测试的检测测试运行器中得到错误。我可以找到有关如何将 multidex 添加到 Android 应用程序的详细信息,但是根据所使用的支持库有多种解决方案,并且 none 似乎可以直接解决 运行 使用 multidex 进行的测试当前推荐的 AndroidX 库。在 Android API 级别 19,我目前收到此错误:

$ ./gradlew connectedCheck
> Task :app:connectedDebugAndroidTest
Starting 0 tests on API-19(AVD) - 4.4.2

com.android.build.gradle.internal.testing.ConnectedDevice > No tests found.[API-19(AVD) - 4.4.2] FAILED 
No tests found. This usually means that your test classes are not in the form that your test runner
expects (e.g. don't inherit from TestCase or lack @Test annotations).

运行 这在具有 API 级别 21 的模拟器上成功运行所有测试。我没有启用 Proguard 或 minify。为了启用 Multidex,我进行了以下更改。我将其添加到应用程序的 build.gradle:

android {
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
}

dependencies {
    implementation "androidx.multidex:multidex:2.0.1"
    androidTestImplementation 'org.mockito:mockito-core:3.4.6'
    androidTestImplementation 'com.linkedin.dexmaker:dexmaker:2.28.0'
    androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:2.28.0'
}

我的清单定义了一个 class,它在 android:name 属性中继承自 androidx.multidex.MultiDexApplication

我看到有人提到将 multidex 测试运行器添加到测试应用程序的 AndroidManifest.xml,但我目前没有明确的清单,它似乎只在上下文中旧 Android 支持库,而不是 AndroidX。我需要做什么才能让仪器测试在 API 级别 16-19 上与 Multidex 和 AndroidX 一起工作?

My manifest defines a class that inherits from androidx.multidex.MultiDexApplication

  1. 这仅在您不覆盖代码中的应用程序 class 时有效。否则,您的应用程序 class 应该扩展 MultiDexApplication,如 documentation

    中所述
  2. 现在可以找到测试但会崩溃,我通过将测试运行程序 classes 添加到 build.gradle 来解决这个问题17=]

android {
  ...
  buildTypes {
    ...
    debug {
      multiDexKeepProguard file('multidex-config.pro')
    }
  }
}

multidex-config.pro包含:

-keep class androidx.test.** { *; }