2014-11-05 4 views
31

Ich bin die neue MultiDex Support auf meine app versucht, und bisher habe ich es geschafft, meine app richtig zu kompilieren, aber wenn es läuft, ich erhalten die folgende Ausnahme:Haben Sie nicht gefunden Klasse „android.support.multidex.MultiDexApplication“ auf dem Weg: DexPathList

java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me..main-2, /vendor/lib, /system/lib]] 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:507) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4382) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5086) 
    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:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me.myapp.main-2, /vendor/lib, /system/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 
    at android.app.Instrumentation.newApplication(Instrumentation.java:998) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:502) 

das ist mein gradle Datei:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.0" 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
     debug { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

repositories { 
    mavenCentral() 
    mavenLocal() 
} 


dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:support-v4:21.0.0' 
    compile 'com.android.support:support-v13:21.0.0' 
    compile 'com.android.support:appcompat-v7:21.0.0' 
} 

Und mein AndroidManifest.xml:

<application 
android:name="android.support.multidex.MultiDexApplication"> 

Ich verstehe nicht, was das Problem ist. Ich denke, ich mache alles nach der Dokumentation. Gibt es noch etwas, das ich vermisse? Ich stellte sicher, dass ich die neueste Support-Bibliothek und Repo vom SDK-Manager installiert hatte.

+0

Haben Sie auch sichergestellt, dass Sie die neueste Build Tools-Version haben? Können Sie auch angeben, ob der Stack-Trace vom Debug- oder Release-Build stammt? – PaulR

+1

@PaulR Ich habe die Version 21.1 Build Tools und der Stack-Trace gehört zur Debug-Version. –

+0

@dustedrob Seltsam. Überprüfen Sie zuerst, dass MultiDexApplication Teil Ihrer Hauptliste ist. Diese Textdatei befindet sich unter /app/build/intermediates/multi-dex/{debug/release}/maindexlist.txt –

Antwort

16

Meine Konfiguration:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.14.+' // 0.14.1, 2014-11-6 
    } 
} 

dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
} 

android { 
    compileSdkVersion = 21 
    buildToolsVersion = "21.1.0" 

    defaultConfig { 
     minSdkVersion 14 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 
} 

Leider habe ich das gleiche Problem. Aber ich fand eine seltsame Situation:

build/Zwischenprodukte/dex/debug:

-rw-rw-r-- 1 andrew andrew 2221176 Nov 6 20:18 classes2.dex 
-rw-rw-r-- 1 andrew andrew 8357596 Nov 6 20:18 classes.dex 

unzip apk, bauen/Ausgänge/apk:

-rw-rw-r-- 1 andrew andrew 8357596 Nov 6 20:18 classes2.dex 
-rw-rw-r-- 1 andrew andrew 2221176 Nov 6 20:18 classes.dex 

In apk, die wichtigsten Klassen von Klassen .dex sollte größer als classes2.dex sein, aber es ist nicht. Ich mache auch dex2jar & entpacken Glas, um Klassen zu überprüfen, ist die Anwendung Klasse nicht in classes.dex, seine in classes2.dex im Gegensatz.

Allerdings sollte ich es behoben haben. Hier ist meine gepatchte android gradle Plugin können Sie versuchen:

buildscript { 
    repositories { 
     mavenCentral() 
     maven { url 'https://github.com/yongjhih/android-gradle-plugin.m2/raw/master/' } 
    } 
    dependencies { 
     classpath 'com.infstory.tools.build:gradle:0.14.+' 
    } 
} 

Der Patch ist in: https://github.com/yongjhih/android-gradle-plugin/commit/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bf oder https://android-review.googlesource.com/#/c/113331/

Ausgabe: https://code.google.com/p/android/issues/detail?id=78761

Der offizielle Patch ist https://android-review.googlesource.com/#/c/113201/ die bereits zusammengeführt, I denke, es könnte in der nächsten Version behoben werden.

Bereits festgelegt 0.14.2 (2014/11/10). (von http://tools.android.com/tech-docs/new-build-system)

Release notes: 

0.14.2 (2014/11/10) 

Fix potential multi-dex issue where the dex files could be renamed during packaging, leading to the wrong main dex file being used. 
Fix versionNameSuffix support 
Fix BuildType.initWith to copy shrinkResources flag 
setup default proguard rule file if none are provided (SDK/tools/proguard/proguard-android.txt) 
BuildType.pseudoLocalesEnabled flag to include fake locales in apk. 
+0

Ja! Das hat funktioniert! Danke für Ihre Hilfe. –

+8

Ich verwende 1.1.0 und bin gerade auf dieses Problem gestoßen ... – Sam

+0

Hey @ Andrew Chen und @Roberto Betancourt, ich habe versucht, die Abhängigkeit und die Repositories, aber ich bekomme einen Fehler auf Build, die 'Error (1,0) TEST_SDK_DIR' offene Datei ist. –

3

ich die neueste Android Studio wurde mit und nach dem offiziellen Dokument Unterstützung hinzufügen https://developer.android.com/studio/build/multidex.html multidex. Aber ich habe immer noch die selbe Ausnahme. Ich habe viel Zeit damit verbracht, es zu lösen. Endlich fand ich die Ursache, dass ich "Java Exception Breakpoints - Any exception" und "Exception Breakpoints - Wenn irgendwas geworfen wurde" aktivierte. Nachdem ich sie deaktiviert hatte, lief die App ohne Probleme.

Folgen Sie einfach dem offiziellen Dokument über multidex https://developer.android.com/studio/build/multidex.html. Es klappt.

0

Wenn Sie Ihr App-Projekt für die Verwendung einer Multidex-Konfiguration einrichten, müssen Sie abhängig von der von Ihrer App unterstützten Android-Mindestversion die folgenden Änderungen an Ihrem App-Projekt vornehmen.

Wenn Ihr minSdkVersion auf 21 oder höher eingestellt ist, alles, was Sie tun müssen, um multiDexEnabled auf true in Ihrer Modulebene build.gradle Datei festgelegt wird, wie hier gezeigt:

android { 
    defaultConfig { 
     ... 
     minSdkVersion 21 
     targetSdkVersion 26 
     multiDexEnabled true 
    } 
    ... 
} 

Allerdings, wenn Ihr minSdkVersion eingestellt auf 20 oder niedriger ist, dann müssen Sie die multidex Support-Bibliothek verwenden, wie folgt:

  • die Modulebene build.gradle Datei ändern multidex zu aktivieren und die multidex Bibliothek als Abhängigkeit hinzufügen, wie hier gezeigt:

    android { 
        defaultConfig { 
         ... 
         minSdkVersion 15 
         targetSdkVersion 26 
         multiDexEnabled true 
        } 
        ... 
    } 
    
    dependencies { 
        compile 'com.android.support:multidex:1.0.1' 
    } 
    
  • Je nachdem, ob Sie die Anwendungsklasse außer Kraft setzen, führen Sie eine der folgenden Möglichkeiten:

    • Wenn Sie die Application-Klasse nicht außer Kraft setzen, bearbeiten Sie Ihre Manifest-Datei Android zu setzen: in der Tag-Namen folgt:

      :

      <?xml version="1.0" encoding="utf-8"?> 
      <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="com.example.myapp"> 
          <application 
            android:name="android.support.multidex.MultiDexApplication" > 
           ... 
          </application> 
      </manifest> 
      
    • wenn Sie die Anwendungsklasse tun außer Kraft setzen, es MultiDexApplication (wenn möglich) wie folgt zu erweitern ändern

      public class MyApplication extends MultiDexApplication { ... } 
      
    • Oder wenn Sie die Application-Klasse außer Kraft zu tun, aber es ist nicht möglich, die Basisklasse ändern, dann können Sie stattdessen die attachBaseContext() -Methode außer Kraft setzen und rufen MultiDex.install (this) ermöglichen multidex:

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

Vor kurzem hatte ich dieses Problem. Trotz der Änderung meiner Konfiguration trat dieser Fehler auf. Ich habe alle vorgeschlagenen Lösungen ausprobiert, darunter das Löschen des virtuellen Geräts und das Erstellen eines neuen.

Allerdings habe ich bemerkt, dass, wenn ich ein APK erstellt und es in den Emulator zum Installieren zog, es gut funktionierte.

In der Endreinigung des Projekts und erneut ausgeführt und dann hat es funktioniert.

Verwandte Themen