2015-10-14 66 views
6

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

默认配置的gradle:

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" ...../> 

我已经扩展“StartupActivity”中的“android.support.multidex.MultiDexApplication”。的时候,仪器测试的情况下跌倒了,我得到以下错误:

INSTRUMENTATION_RESULT: shortMsg=java.lang.IllegalAccessError 
INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
INSTRUMENTATION_CODE: 0 

在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() {} 

} 

我我正在运行测试用例作为android测试。我无法理解哪个依赖关系搞乱了代码。除此之外,代码的随机失败是怀疑的。请帮忙。

+1

我的团队成员对espresso测试和multidex有类似的评论。更多的是,它没有确定有测试运行multidex使能... – OceanLife

+0

@OceanLife你有没有找到任何解决方案? – whitepearl

+0

不,我们还没有。没有multidex,它是可靠的,因此我建议我们编译出一些分析库,这些库是作为临时解决方案来扩充的......只是为了回到不需要multidex。你的错误信息(意外的impl)让我想起了Java的SDK不兼容性错误,所谓的“VerifyError”(s)...在旅途中得到一些proguarding去除庞大的位... – OceanLife

回答

5

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

执行:

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

只好执行命令后,等待几秒钟。使用多分辨率的仪器测试可以顺利运行。

+0

谢谢你 - 在这里工作的很好。希望谷歌能尽快解决这个问题。 – x2on

0

如果您使用的是1.4.0-beta3以上的gradle插件。 Multi-Dex支持已添加到gradle插件,这意味着和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 

解决办法是使用的gradle 1.3.1插件,并且要小心明确指定和multidex-instrumentation(如果你还需要这)相同版本的依赖关系。您也可能想要使用AndroidJUnitRunner,因为它具有内置的multi-dex支持。

随意明星相关的问题:https://code.google.com/p/android/issues/detail?id=194609

1

对于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") 
      } 
     } 
    } 
} 
+0

对我来说,它仍然不起作用,这段代码会进入我自己项目的build.gradle中? –

+0

是的只是将它添加到您的build.gradle,它应该工作。也许你也有其他的依赖问题。 – x2on