2015-07-23 2 views
1

Я использую MultiDex в своем приложении для поддержки более 65 тыс. Методов. Над api 21 он работает хорошо, потому что он делает сборку predex. Под апи 21 У меня есть сбой в моем Application с этим StackTrace:java.lang.VerifyError с API <21

java.lang.VerifyError: mypackage/com/myapp/MyAppApplication 
      at java.lang.Class.newInstanceImpl(Native Method) 
      at java.lang.Class.newInstance(Class.java:1215) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:990) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:975) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:502) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4537) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1402) 
      at android.os.Handler.dispatchMessage(Handler.java:110) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5322) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
      at dalvik.system.NativeStart.main(Native Method) 

Это мой gradle файл (упрощенно) с различными вкусами для компиляции с predex в отладке:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "mypackage.com.myapp" 
     targetSdkVersion 22 
     versionCode Integer.parseInt(new Date().format("yyMMddHH")) 
     versionName "1.0" 
     multiDexEnabled = true 
    } 

    productFlavors { 
     normal { 
      minSdkVersion 21 
     } 

     beta { 
      minSdkVersion 16 
      versionName "1.0.0_beta" 
     } 

     prod { 
      minSdkVersion 16 
     } 
    } 

    dexOptions { 
     javaMaxHeapSize "4g" 
    } 

    buildTypes { 
     debug { 
      minifyEnabled false 
      debuggable true 
     } 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:multidex:1.0.0' 
} 

И это мой Application:

public class MyApplication extends CustomLibraryApplication { 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     MultiDex.install(this); 
    } 
} 

И в моем манифесте под <application> я есть android:name=".MyApplication"

Решения, такие как «исключить некоторые сервисы Google Play» или «расширить MultiDexApplication», в данном случае не являются полезными.

+0

«Решения, такие как:« исключить некоторые сервисы Google Play »или« расширить MultiDexApplication », в данном случае не являются полезными». - Почему это не полезно? Я бы предложил запустить Proguard, чтобы избавиться от некоторых из ваших лишних классов. – Booger

+0

@Booger «исключает некоторые сервисы Google Play», потому что я знаю, как их исключить, но я хочу попробовать этот подход с несколькими приложениями. «Расширьте MultiDexApplication», потому что теперь я расширяю стороннюю библиотеку, которую я не могу изменить. Я думал также запустить Proguard, но это будет последнее решение, прежде чем я хочу только понять, почему эта ошибка происходит, мне действительно не нужно «альтернативное» решение. Мой вопрос состоял в том, чтобы лучше понять, как работает multidex. –

ответ

2

решаемые

Проблема была ... барабанная дробь ... buildToolsVersion!

Я изменил buildToolsVersion в моем Gradle (только buildToolsVersion) от 22.0.1 к 23 rc3 (последний из предварительного просмотра канала), и она работала хорошо с апите < 21 с multidex.

Смежные вопросы