Android 启用多重索引时,仪器测试随机失败

Android 启用多重索引时,仪器测试随机失败,android,gradle,robotium,android-multidex,android-instrumentation,Android,Gradle,Robotium,Android Multidex,Android Instrumentation,在我的android应用程序中,我启用了多重索引。该应用程序在模拟器上运行良好。我正在使用robotium测试应用程序。但是,当我执行插装测试用例时,有时测试会通过,但大多数情况下,它们在系统重新启动后也会失败。在经过和失败之间没有代码更改 默认渐变配置: android { defaultConfig { applicationId "com.example.androidapp" minSdkVersion 16 targetS

在我的android应用程序中,我启用了多重索引。该应用程序在模拟器上运行良好。我正在使用robotium测试应用程序。但是,当我执行插装测试用例时,有时测试会通过,但大多数情况下,它们在系统重新启动后也会失败。在经过和失败之间没有代码更改

默认渐变配置:

android {
        defaultConfig {
        applicationId "com.example.androidapp"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
        testProguardFile "proguard-test.txt"
    }
}
还为测试添加依赖项:

androidTestCompile fileTree(dir: 'libs', include:'robotium-solo-5.3.0.jar') 

androidTestCompile ('com.android.support:multidex-instrumentation:1.0.1') {
         exclude group: 'com.android.support', module: 'multidex' }
在AndroidManifest.xml中,我提到了应用程序标记:

<application
        android:name="StartupActivity"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" ...../>
logcat中的错误消息为:

W/dalvikvm﹕ Class resolved by unexpected DEX: Lcom/example/androidapp/StartupActivity;(0xa695df08):0x9910e000 ref [Landroid/support/multidex/MultiDexApplication;] Landroid/support/multidex/MultiDexApplication;(0xa695df08):0x99a2c000
W/dalvikvm﹕ (Lcom/example/androidapp/StartupActivity; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification)
W/dalvikvm﹕ Unable to resolve superclass of Lcom/example/androidapp/StartupActivity; (540)
W/dalvikvm﹕ Link of class 'Lcom/example/androidapp/StartupActivity;' failed
D/AndroidRuntime﹕ Shutting down VM
W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa628c288)
测试类看起来有点像:

public class HelloActivityTest extends ActivityInstrumentationTestCase2<HelloActivity> {
private Solo solo;
public HelloActivityTest() {
    super(HelloActivityTest.class);
}
  @Override
  public void setUp() throws Exception {
    setActivityInitialTouchMode(false);
    solo = new Solo(getInstrumentation(), getActivity());
  }

  public void test1() {}

  public void test2() {}

}
公共类HelloActivityTest扩展了ActivityInstrumentationTestCase2{
私人独奏;
公共HelloActivityTest(){
超级(HelloActivityTest.class);
}
@凌驾
public void setUp()引发异常{
setActivityInitialTouchMode(假);
solo=新的solo(getInstrumentation(),getActivity());
}
public void test1(){}
public void test2(){}
}

我将测试用例作为android测试运行。我无法理解是哪个依赖项把代码搞乱了。除此之外,代码的随机故障也是值得怀疑的。请提供帮助。

找到了同样的解决方案,即设置dex验证和优化参数。您还可以将dalvik.vm.dexopt-flags设置为v=n,使框架通过-Xverify:none-Xdexopt:verified以禁用验证

执行:

adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd

执行命令后必须等待几秒钟。如果您使用的是1.4.0-beta3以上的gradle插件,那么使用multidexing的仪器测试将顺利运行。

。gradle插件中添加了多索引支持,这意味着
multidex
multidex instrumentation
依赖项已经包含在内,您不必显式指定它们。不幸的是,在棒棒糖制作之前的设备上似乎有缺陷,看起来目标和测试应用程序使用了不同版本的
MultiDexApplication
。因此,检测无法运行,logcat会提供类似的信息:

W/dalvikvm: Class resolved by unexpected DEX: Lcom/example/dexproof/App;(0x43893f90):0x64d46000 ref [Landroid/support/multidex/MultiDexApplication;] Landroid/support/multidex/MultiDexApplication;(0x43893f90):0x5de01000
W/dalvikvm: (Lcom/example/dexproof/App; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification)
W/dalvikvm: Unable to resolve superclass of Lcom/example/dexproof/App; (457)
W/dalvikvm: Link of class 'Lcom/example/dexproof/App;' failed
E/AndroidRuntime: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
解决方案是使用1.3.1 gradle插件,并小心地明确指定同一版本的
multidex
multidex instrumentation
(如果您也需要)依赖关系。您可能还想使用AndroidJUnitRunner,因为它具有内置的多索引支持


请随时关注相关问题:

对于gradle插件1.5.0,您可以在构建中使用此解决方案。gradle:

// Workaround for Multidex bug in gradle-android-plugin
// Replace Multidex dependency with some dummy dependency to avoid dex problems
// @see https://code.google.com/p/android/issues/detail?id=194609
project.getConfigurations().all { config ->
    if (config.name.contains("AndroidTest")) {
        config.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.name == "multidex") {
                details.useTarget("de.felixschulze.teamcity:teamcity-status-message-helper:1.2")
            }
        }
    }
}

我的团队成员对浓缩咖啡测试和multidex也有类似的评论。更重要的是,它无法确定是否存在启用多索引的测试…@OceanLife找到解决方案了吗?没有,我们还没有。没有multidex是可靠的,因此我建议我们编译出一些分析LIB,作为一个临时解决方案,这些LIB正在扩展…只是为了回到不需要multidex的状态。您的错误消息(意外的impl)提醒我Java的SDK不兼容错误,即所谓的“VerifyError”(s)。。。在移动过程中获得一些进展,以移除笨重的部分…@whitepearl可能是的副本?@AlexLipov我没有面临MultiDexTestRunner的问题。问题在于错误的随机性。谢谢你-在这里工作很好。希望谷歌很快就能解决这个问题。对我来说,它仍然不起作用,这段代码进入了我自己项目的build.gradle?是的,只要将它添加到你的build.gradle中,它就会起作用。也许您还存在其他依赖性问题。
// Workaround for Multidex bug in gradle-android-plugin
// Replace Multidex dependency with some dummy dependency to avoid dex problems
// @see https://code.google.com/p/android/issues/detail?id=194609
project.getConfigurations().all { config ->
    if (config.name.contains("AndroidTest")) {
        config.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.name == "multidex") {
                details.useTarget("de.felixschulze.teamcity:teamcity-status-message-helper:1.2")
            }
        }
    }
}