2014-10-22 14 views
19

Thêm Hỗ trợ đa dex với sự hỗ trợ v4-R21 sử dụng def gradle (https://plus.google.com/+IanLake/posts/JW9x4pcB1rj)Sử dụng MultiDexApplication gây thử nghiệm Robolectric cho lớp ứng dụng để phá vỡ

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 19 
buildToolsVersion "20.0.0" 

defaultConfig { 
    applicationId "info.osom.multidex" 
    minSdkVersion 19 
    targetSdkVersion 19 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     runProguard false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

dexOptions { 
    preDexLibraries = false 
} 

afterEvaluate { 
    tasks.matching { 
    it.name.startsWith('dex') 
    }.each { dx -> 
    if (dx.additionalParameters == null) { 
     dx.additionalParameters = [] 
    } 
    dx.additionalParameters += '--multi-dex' 
    dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString() 
} 

Bây giờ công trình này cho các ứng dụng riêng của mình và tôi có thể để xây dựng và triển khai nhưng khi tôi chạy thử nghiệm robolectric cho lớp Ứng dụng của mình, tôi nhận được một lỗi từ ZipUtils (được bắt gặp trong MultiDex.java). Các thử nghiệm khác đang chạy tốt. Đây là dấu vết -

Gây ra bởi: java.lang.RuntimeException: Cài đặt đa dex không thành công (/ Người dùng/Mã/android-code/android /. (Là thư mục)). tại android.support.multidex.MultiDex.install (MultiDex.java:178) tại android.support.multidex.MultiDexApplication.attachBaseContext (MultiDexApplication.java:39) tại android.app.Application.attach (Application.java: 181) tại org.fest.reflect.method.Invoker.invoke (Invoker.java:112) tại org.robolectric.internal.ParallelUniverse.setUpApplicationState (ParallelUniverse.java:155) tại org.robolectric.RobolectricTestRunner.setUpApplicationState (RobolectricTestRunner.java:430) tại org.robolectric.RobolectricTestRunner $ 2.evaluate (RobolectricTestRunner.java:236) tại org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:271) tại org.junit.runners.BlockJUnit4ClassRunner .runChild (BlockJUnit4ClassRunner.java:70) tại org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:50) tại org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:238) tại org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:63) tại org.junit.runners.ParentRunner.runChildren (ParentRunner.java:236) tại org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:53) tại org.junit.runners .ParentRunner $ 2.đánh giá (ParentRunner.java:229) tại org.robolectric.RobolectricTestRunner $ 1.evaluate (RobolectricTestRunner.java:177) tại org.junit.runners.ParentRunner.run (ParentRunner.java:309) tại tổ chức .gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass (JUnitTestClassExecuter.java:86) tại org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute (JUnitTestClassExecuter.java:49) tại org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass (JUnitTestClassProcessor.java: 69) tại org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass (SuiteTestClassProcessor.java:48) tại org.gradle.messaging.dispatch.ReflectionDispatch.dispatch (ReflectionDispatch.java:35) tại tổ chức. gradle.messaging.dispatch.ReflectionDispatch.dispatch (ReflectionDispatch.java:24) tại org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch (ContextClassLoaderDispatch.java:32) tại org.gradle.messaging.dispatch.ProxyDispatchAdapter $ DispatchingInvocationHandler. gọi (ProxyDispatchAdapter.java:93) tại com.sun.proxy . $ Proxy2.processTestClass (Unknown Source) tại org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass (TestWorker.java:105)

+0

Tôi nghĩ tìm kiếm gói ứng dụng nhưng tìm thư mục gốc của dự án thay vì – Rickster

+0

Không ai có ý tưởng nào? – Rickster

Trả lời

3

Bạn cần tạo lớp Ứng dụng kế thừa từ MultiDexApplication attachBaseContext (Bối cảnh) là Ghi đè và đè bẹp ngoại lệ nếu chạy trên JavaVM.

import android.content.Context; 
    import android.support.multidex.MultiDexApplication; 

    public class Application extends MultiDexApplication { 

     @Override 
     protected void attachBaseContext(Context base) { 
      try { 
      super.attachBaseContext(base); 
      } catch (Exception e) { 
      String vmName = System.getProperty("java.vm.name"); 
      if (!vmName.startsWith("Java")) { 
       throw e; 
      } 
      } 
     } 
    } 
49

Thêm bóng đa dex như sự phụ thuộc của bạn:

testCompile "org.robolectric:shadows-multidex:3.0" 

này sẽ nhạo báng MultiDex.install cuộc gọi và không làm gì cả, vì không có dex trong Robolectric

+3

đã giúp, cảm ơn. chỉ cần đảm bảo rằng phiên bản trong dòng này giống với phiên bản trong: testCompile 'org.robolectric: robolectric: 3.0' (Nếu không nó sẽ không hoạt động) – user2924714

+0

Điều này làm việc cho tôi! như đã nói ở trên, hãy đảm bảo các phiên bản của bạn khớp với nhau. –

Các vấn đề liên quan