2015-10-14 16 views
6

Nella mia app Android ho attivato il multidexing. L'app funziona perfettamente con gli emulatori. Sto usando robotium per testare l'app. Ma quando eseguo test cases di strumentazione, a volte il test passa, ma soprattutto falliscono anche dopo il riavvio del sistema. Non c'è alcun cambiamento di codice tra il tempo che passa e fallisce.Test di strumentazione fallito in modo casuale con multidexing abilitato

predefinito di configurazione Gradle:

android { 
     defaultConfig { 
     applicationId "com.example.androidapp" 
     minSdkVersion 16 
     targetSdkVersion 23 
     multiDexEnabled true 
     testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner" 
     testProguardFile "proguard-test.txt" 
    } 
} 

anche l'aggiunta di dipendenze per il test:

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' } 

In AndroidManifest.xml ho menzionato il tag applicazione come:

<application 
     android:name="StartupActivity" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" ...../> 

Ho esteso "android.support.multidex.MultiDexApplication" in StartupActivity. I tempi in cui i casi di test strumentazione cadono ottengo il seguente errore:

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 

Il messaggio di errore nel 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) 

La classe di test si presenta un po 'come:

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

} 

I sto eseguendo il test case come un test di Android. Non riesco a capire quale dipendenza sta incasinando il codice. Oltre a questo, i guasti casuali del codice sono scettici. Per favore aiuto.

+1

I membri del mio team hanno osservato cose simili riguardo ai test dell'espresso e al multidex. Più che non riesce a identificare che ci sono test da eseguire con multidex abilitato ... – OceanLife

+0

@OceanLife Hai trovato qualche soluzione? – whitepearl

+0

No, non ancora. È affidabile senza multidex, quindi ho suggerito di compilare alcune delle librerie di analisi che stanno trasformando le cose in una soluzione provvisoria ... solo per tornare a non richiedere il multidex. Il tuo messaggio di errore (impl inaspettato) mi ricorda gli errori di incompatibilità dell'SDK di Java, i cosiddetti "VerifyError" ... Prendi un po 'di proguarding in movimento per rimuovere i bit ingombranti ... – OceanLife

risposta

5

Trovato una soluzione per lo stesso, che sta impostando i parametri di verifica e ottimizzazione dex. È anche possibile impostare dalvik.vm.dexopt-flags su v = n per ottenere il passaggio del framework -Xverify: none -Xdexopt: verificato per disabilitare la verifica.

Esegui:

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

dovuto aspettare per alcuni secondi dopo l'esecuzione dei comandi. Test di strumentazione con multidossing eseguito senza problemi.

+0

Grazie per quello - funziona bene. Spero che Google lo risolverà presto. – x2on

0

Se si utilizza il plug-in gradle sopra 1.4.0-beta3. Il supporto multi-Dex è stato aggiunto al plugin gradle, il che significa che le dipendenze e multidex-instrumentation sono già incluse e non è necessario specificarle esplicitamente. Sfortunatamente, sembra essere buggato su dispositivi pre-Lollipop, sembra che diverse versioni di MultiDexApplication vengano utilizzate per l'applicazione di destinazione e di test. Come risultato Strumentazione non riesce a correre e logcat ti dà qualcosa di simile a questo:

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 

La soluzione sarebbe quella di utilizzare 1.3.1 plug Gradle e fare attenzione a specificare esplicitamente e multidex-instrumentation (nel caso in cui è necessario anche questo dipendenze della stessa versione. Probabilmente vorresti anche usare AndroidJUnitRunner, dato che ha il supporto multi-dex integrato.

Sentitevi liberi di recitare il relativo problema: https://code.google.com/p/android/issues/detail?id=194609

1

per il plugin Gradle 1.5.0 è possibile utilizzare questa soluzione nel 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") 
      } 
     } 
    } 
} 
+0

Per me non funziona ancora, questo codice va nel build.gradle del mio progetto? –

+0

Sì, basta aggiungerlo a build.gradle e dovrebbe funzionare. forse hai anche un altro problema di dipendenza. – x2on