Firebase Test Lab не работает при использовании ProGuard + Dagger - PullRequest
0 голосов
/ 11 октября 2018

Инструментированные тесты проходят локальные эмуляторы и физические устройства, но не проходят тестовую проверку Firebase, когда выполняются следующие условия:

  • ProGuard включен для отладочных сборок;
  • Существуют как зависимости Dagger, так и Espresso.

FTL показывает различные проблемы с тестами:

1) В случае API 26-28 он показывает либо Instrumentation run failed due to 'java.lang.NoClassDefFoundError', либо Instrumentation run failed due to 'Process crashed.' * 1013.*

Исключение stacktrace выглядит следующим образом, оно не всегда отображается в Firebase, но всегда присутствует в logcat:

Rejecting re-init on previously-failed class java.lang.Class<androidx.test.espresso.core.internal.deps.dagger.internal.Factory>:
java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/inject/Provider;

FATAL EXCEPTION: Instr: androidx.test.runner.AndroidJUnitRunner
Process: com.example.debug, PID: 11425
java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/inject/Provider;
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:453)
    at androidx.test.internal.runner.TestLoader.doCreateRunner(TestLoader.java:72)
    at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.java:104)
    at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:789)
    at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:544)
    at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:387)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2145)
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.inject.Provider" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.example.debug.test-9kvw--JgNKzmuQurRdDbCQ==/base.apk", zip file "/data/app/com.example.debug-sz-oCUGs05zlEadCzyqsDA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.debug.test-9kvw--JgNKzmuQurRdDbCQ==/lib/arm64, /data/app/com.example.debug-sz-oCUGs05zlEadCzyqsDA==/lib/arm64, /system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    ... 8 more

2) Я также провел один тест API 21, в котором был только один NoClassDefFoundError в журналах,Однако это исключение также присутствует в API 26-28, но является частью исключения, показанного выше.Возможно, есть какая-то разница между тем, как он регистрируется на разных уровнях API.

java.lang.NoClassDefFoundError: androidx.test.espresso.core.internal.deps.dagger.internal.Factory

FATAL EXCEPTION: Instr: androidx.test.runner.AndroidJUnitRunner
Process: com.example.debug, PID: 5691
java.lang.NoClassDefFoundError: androidx.test.espresso.core.internal.deps.dagger.internal.Factory
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:308)
    at androidx.test.internal.runner.TestLoader.doCreateRunner(Unknown Source)
    at androidx.test.internal.runner.TestLoader.getRunnersFor(Unknown Source)
    at androidx.test.internal.runner.TestRequestBuilder.build(Unknown Source)
    at androidx.test.runner.AndroidJUnitRunner.buildRequest(Unknown Source)
    at androidx.test.runner.AndroidJUnitRunner.onStart(Unknown Source)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)

Некоторые соответствующие строки из конфигурации build.gradle:

android {
  defaultConfig {
    testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
  }

  buildTypes {
    debug {
      minifyEnabled true
      useProguard true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-debug.pro'
      testProguardFile 'proguard-rules-test.pro'
    }
  }
}

dependencies {
  testImplementation 'junit:junit:4.12'

  androidTestImplementation 'androidx.test:core:1.0.0-beta01'
  androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-beta01') {
    //  exclude module: 'javax.inject' - Exclusion doesn't help
  }
  // androidTestImplementation 'javax.inject:javax.inject:1' - Inclusion doesn't help either
  androidTestImplementation('androidx.test.ext:junit:1.0.0-beta01') {
    exclude group: "org.junit"
  }
  androidTestImplementation 'androidx.test:runner:1.1.0-beta01'
  androidTestImplementation 'androidx.test:rules:1.1.0-beta01'
  androidTestImplementation 'org.mockito:mockito-android:2.22.0'

  implementation 'com.google.dagger:dagger:2.16'
  kapt 'com.google.dagger:dagger-compiler:2.16'
}

proguard-rules-test.pro:

-ignorewarnings
-dontshrink
-dontoptimize
-dontobfuscate

После отключения ProGuard или удаления зависимости от Dagger тесты начинают проходить на FTL.

1 Ответ

0 голосов
/ 24 октября 2018

Поэтому я связался со службой поддержки Firebase и получил смущающее простое решение.
Добавьте следующее правило в proguard-rules-debug.pro

-keep class javax.inject.** { *; }

До сих пор не ясно, почему эта проблема не решается.возникают при локальном тестировании.
Но по крайней мере это решение работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...