2015-10-14 17 views
6

के साथ यादृच्छिक रूप से विफल रहता है मेरे एंड्रॉइड ऐप में मेरे पास मल्टीडेक्सिंग सक्षम है। एप्यूलेटर पर ऐप ठीक चलाता है। मैं ऐप का परीक्षण करने के लिए रोबोटियम का उपयोग कर रहा हूं। लेकिन जब मैं उपकरण परीक्षण मामलों को निष्पादित करता हूं, कभी-कभी परीक्षण पास होता है, लेकिन ज्यादातर वे सिस्टम रीबूट के बाद भी असफल होते हैं। पास होने और विफल होने के बीच कोई कोड परिवर्तन नहीं होता है।इंस्ट्रुमेंटेशन टेस्ट मल्टीडेक्सिंग सक्षम

डिफ़ॉल्ट 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" ...../> 

मैं विस्तार किया है स्टार्टअपएक्टिविटी में "android.support.multidex.MultiDex अनुप्रयोग"। बार जब उपकरण परीक्षण मामलों गिर मैं निम्नलिखित त्रुटि मिलती है:

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

} 

मैं एंड्रॉइड टेस्ट के रूप में टेस्ट केस चला रहा हूं। मैं समझने में असमर्थ हूं कि कौन सी निर्भरता कोड को गड़बड़ कर रही है। इसके अलावा, कोड की यादृच्छिक विफलताओं पर संदेह है। कृपया मदद करे।

+1

मेरी टीम के सदस्यों ने एस्प्रेसो परीक्षण और मल्टीडेक्स के संबंध में समान चीजों पर टिप्पणी की है। अधिक यह है कि यह पहचानने में विफल रहता है कि मल्टीडेक्स सक्षम के साथ चलाने के लिए परीक्षण हैं ... – OceanLife

+0

@OceanLife क्या आपको कोई समाधान मिला? – whitepearl

+0

नहीं, हमने अभी तक नहीं किया है। यह मल्टीडेक्स के बिना विश्वसनीय है इसलिए मैंने सुझाव दिया है कि हम कुछ एनालिटिक्स libs को संकलित करते हैं जो चीजों को एक अंतरिम समाधान के रूप में उछाल रहे हैं ... बस मल्टीडेक्स की आवश्यकता नहीं होने के लिए वापस जाने के लिए। आपका त्रुटि संदेश (अप्रत्याशित रूप से) मुझे जावा की एसडीके असंगतता त्रुटियों की याद दिलाता है, जिसे "VerifyError" कहा जाता है ... भारी बिट्स को हटाने के लिए कुछ प्रोजेक्टिंग प्राप्त करें ... – OceanLife

उत्तर

5

इसके लिए एक समाधान मिला, जो डेक्स सत्यापन और अनुकूलन पैरामीटर सेट कर रहा है। फ्रेमवर्क पास करने के लिए आप dalvik.vm.dexopt-flags को v = n पर भी सेट कर सकते हैं- सत्यापित करें: none -Xdexopt: सत्यापन अक्षम करने के लिए सत्यापित किया गया है।

निष्पादित करें:

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

आदेशों को क्रियान्वित करने के बाद कुछ सेकंड के लिए इंतजार करना पड़ा। मल्टीडेक्सिंग रन के साथ इंस्ट्रुमेंटेशन टेस्ट आसानी से पोस्ट करें।

+0

इसके लिए धन्यवाद - यहां ठीक काम करता है। उम्मीद है कि Google जल्द ही इसे ठीक करेगा। – x2on

0

यदि आप 1.4.0-बीटा 3 से ऊपर ग्रेडल प्लगइन का उपयोग कर रहे हैं। मल्टी-डेक्स समर्थन प्लगइन को क्रमबद्ध करने के लिए जोड़ा गया था, जिसका अर्थ है कि और 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-instrumentation (मामले में आप भी इस की जरूरत है सावधान रहना होगा) एक ही संस्करण की निर्भरता। आप शायद AndroidJUnitRunner का उपयोग करना चाहते हैं, क्योंकि इसमें अंतर्निहित बहु-डीएक्स समर्थन है। https://code.google.com/p/android/issues/detail?id=194609

1

Gradle प्लगइन के लिए आप अपने निर्माण में इस समाधान का इस्तेमाल कर सकते हैं 1.5.0:

संबंधित समस्या अभिनय करने के लिए स्वतंत्र महसूस।क्रमिक:

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

मेरे लिए यह अभी भी काम नहीं कर रहा है, यह कोड मेरे खुद के प्रोजेक्ट के निर्माण में है। –

+0

हाँ बस इसे अपने build.gradle में जोड़ें और इसे काम करना चाहिए। शायद आपके पास भी एक अन्य निर्भरता समस्या है। – x2on

संबंधित मुद्दे

 संबंधित मुद्दे