首页 > 解决方案 > 在 2 个仿真器上运行仪器测试时 - connectedProStagingDebugAndroidTest 失败 - INSTALL_FAILED_INVALID_APK -/base.apk 代码丢失

问题描述

我尝试在 2 个模拟器上运行 Instrumentation 测试,在 CI 机器上使用 2 个不同的测试套件和下面的 shell 脚本,该机器使用 Jenkins 运行该作业。

startTest(){
  ./gradlew installProStagingDebug
  ./gradlew installProStagingDebugAndroidTest

 pids=
  env ANDROID_SERIAL=emulator-5554 ./gradlew -Pandroid.testInstrumentationRunnerArguments.class=com.app.appname.TestSuiteOne connectedproStagingDebugAndroidTest \
  &
  pids+=" $!"

echo "PID 1st is $pids"
  env ANDROID_SERIAL=emulator-5556 ./gradlew -Pandroid.testInstrumentationRunnerArguments.class=com.app.appname.TestSuiteTwo connectedproStagingDebugAndroidTest \
   &
  pids+=" $!"

  echo "PID 2nd is $pids"

  wait $pids || { echo "there were errors" >&2; exit 1; }
  exit 0
}

在运行startTest()方法之前,如果SDK不可用,我将下载它,然后启动这些模拟器。

模拟器的配置是

使用上面的脚本,我无法在两个设备上运行 Instrumentation 测试。

[05:03:33]: ▸ [35m> Task :app:connectedProStagingDebugAndroidTest FAILED[0m
[05:03:33]: ▸ [35mUnable to install /home/ubuntu/workspace/AndroidInstrumentationTest/app/build/outputs/apk/proStaging/debug/app-proStaging-debug.apk[0m
[05:03:33]: ▸ [35mcom.android.ddmlib.InstallException: INSTALL_FAILED_INVALID_APK: Scanning Failed.: Package /data/app/com.app.appnamestaging-YtqaUiatT==/base.apk code is missing[0m
[05:03:33]: ▸ [35mat com.android.ddmlib.Device.installRemotePackage(Device.java:1143)[0m
[05:03:33]: ▸ [35mat com.android.ddmlib.Device.installPackage(Device.java:973)[0m
[05:03:33]: ▸ [35mat com.android.ddmlib.Device.installPackage(Device.java:949)[0m
[05:03:33]: ▸ [35mat com.android.ddmlib.Device.installPackage(Device.java:938)[0m
[05:03:33]: ▸ [35mat com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:126)[0m
[05:03:33]: ▸ [35mat com.android.builder.internal.testing.SimpleTestRunnable.run(SimpleTestRunnable.java:148)[0m
[05:03:33]: ▸ [35mat com.android.ide.common.workers.ExecutorServiceAdapter$submit$submission$1.run(ExecutorServiceAdapter.kt:68)[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386)[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)[0m
[05:03:33]: ▸ [35mcom.android.builder.testing.ConnectedDevice > runTests[Nexus_5_29(AVD) - 10] [31mFAILED [0m
[05:03:33]: ▸ [35mcom.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_INVALID_APK: Scanning Failed.: Package /data/app/com.app.appnamestaging-YtqaUiatT==/base.apk code is missing[0m
[05:03:33]: ▸ [35mat com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:132)[0m
[05:03:33]: ▸ [35m[no message defined][0m
[05:03:33]: ▸ [35mjava.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_INVALID_APK: Scanning Failed.: Package /data/app/com.app.appnamestaging-YtqaUiatT==/base.apk code is missing[0m
[05:03:33]: ▸ [35mat java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006)[0m
[05:03:33]: ▸ [35mat com.android.ide.common.workers.ExecutorServiceAdapter.await(ExecutorServiceAdapter.kt:102)[0m
[05:03:33]: ▸ [35mat com.android.builder.testing.BaseTestRunner.runTests(BaseTestRunner.java:204)[0m
[05:03:33]: ▸ [35mat com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.lambda$doTaskAction$2(DeviceProviderInstrumentTestTask.java:198)[0m
[05:03:33]: ▸ [35mat com.android.builder.testing.api.DeviceProvider.use(DeviceProvider.java:53)[0m
[05:03:33]: ▸ [35mat com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:188)[0m
……..
[35m67 actionable tasks: 15 executed, 52 up-to-date[0m
[05:03:35]: ▸ [35m> Task :app:mergeProjectDexProStagingDebug[0m
[05:03:36]: ▸ [35m> Task :app:mergeExtDexProStagingDebug[0m
[05:03:37]: ▸ [35m> Task :app:packageProStagingDebug[0m
[05:03:41]: ▸ [35m> Task :app:connectedProStagingDebugAndroidTest[0m
[05:03:41]: ▸ [35mStarting 0 tests on Nexus_5_29_2(AVD) - 10[0m
[05:03:41]: ▸ [35mTests on Nexus_5_29_2(AVD) - 10 failed: Instrumentation run failed due to 'Process crashed.'[0m
[05:03:41]: ▸ [35mcom.android.builder.testing.ConnectedDevice > No tests found.[Nexus_5_29_2(AVD) - 10] [31mFAILED [0m
[05:03:41]: ▸ 

有时一些测试在我的两个模拟器上运行,但在运行 3 5 个测试后,其中一个模拟器停止运行测试,logcat 显示进程崩溃。

在单个 Emulator 上,上面的脚本工作正常。

注意:我没有使用分片选项或任何像勺子这样的库,因为测试是随机分布在设备上的,在我的场景中,每个测试类都需要执行登录测试 1st。

任何人都可以知道如何解决这个问题?

标签: androidjenkinsgradleandroid-espressoinstrumented-test

解决方案


推荐阅读