使用ProGuard + Dagger时,Firebase测试实验室失败

qwertyfinger

当满足以下条件时,仪器测试确实可以在本地仿真器和物理设备上通过,但在Firebase测试实验室上则失败:

  • ProGuard已启用调试版本;
  • 同时存在Dagger和Espresso。

FTL显示不同的测试问题:

1)如果使用API​​ 26-28,则显示Instrumentation run failed due to 'java.lang.NoClassDefFoundError'Instrumentation run failed due to 'Process crashed.'

异常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。

qwertyfinger

因此,我联系了Firebase支持人员,并得到了一个令人尴尬的简单解决方案。
将以下规则添加到proguard-rules-debug.pro

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

尚不清楚为什么在本地测试时不会出现此问题。
但是至少该解决方案有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过Android Studio使用Firebase测试实验室时如何指定超时

使用Firebase测试实验室时,如何将仿真器的ABI指定为x86_64?

Android Firebase测试实验室-使用Orchestrator进行仪器测试,其目的是什么?

使用Firebase测试实验室对Android库执行仪表化测试?

Firebase 测试实验室使用相同的上传 APK 重新运行测试

Firebase测试实验室-未经授权可使用项目

无法使用gcloud和服务帐户(403)运行Firebase测试实验室测试,没有storage.objects.create

如何使用gcloud cli在Yaml arg文件中设置环境变量以用于Firebase测试实验室

在Firebase测试实验室测试APNS

使用低规格机器建立渗透测试实验室的最佳方式

如何使用 REST API 在 ALM 的测试实验室中获取文件夹列表?

如何使用 ARM 模板触发特定的开发/测试实验室环境?

使用 cicd 管道在开发测试实验室中创建 ServiceFabric-LabCluster

Firebase 测试实验室对 Appium 的支持

使用模式实验室时,如何解决最大调用堆栈大小超出的错误?

使用matplotlib时,LaTeX方程不会在Google合作实验室中呈现

在 jupyter 实验室中使用交互式绘图时控制图形高度

Firebase测试实验室上的测试运行失败

测试在本地 AS 模拟器上通过,但在 Firebase 测试实验室上失败

测试实验室的仪器测试失败,货币符号错误

三星远程测试实验室(RTL)是否可以与Android Studio一起使用

尝试获取 Artifacts Run Powershell 脚本中使用的开发测试实验室 VM 用户名

Firebase设备测试实验室:无法创建测试矩阵

Firebase 测试实验室可以运行 Monkeyrunner 测试吗?

Google Firebase测试实验室,兼容性测试

使用 Firebase 配置 Proguard 规则

java.lang.NoClassDefFoundError:在Firebase测试实验室上运行记录的Robo测试时,Landroid / support / v7 / widget / RecyclerView的解析失败

无法使用脚本实验室共享脚本

在Google合作实验室中使用小部件