Pertanyaan Tidak menemukan kelas "android.support.multidex.MultiDexApplication" di jalur: DexPathList


Saya mencoba yang baru Dukungan MultiDex pada aplikasi saya dan sejauh ini saya telah berhasil mengkompilasi aplikasi saya dengan benar, tetapi ketika menjalankannya, saya mendapatkan pengecualian berikut:

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)

Ini adalah file gradle saya:

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

Dan AndroidManifest.xml saya:

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

Saya tidak mengerti apa masalahnya. Saya pikir saya melakukan semuanya sesuai dengan dokumentasi. Apakah ada hal lain yang saya lewatkan? Saya memastikan saya memiliki pustaka dukungan terbaru dan repo yang dipasang dari pengelola SDK.


32
2017-11-05 17:44


asal


Jawaban:


Konfigurasi saya:

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

Sayangnya, saya punya masalah yang sama. Tapi saya menemukan situasi yang aneh:

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

apk unzip, build / output / 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

Di apk, kelas-kelas utama class.dex harus lebih besar dari classes2.dex, tetapi tidak. Saya juga dex2jar & unzip jar untuk memeriksa kelas, kelas aplikasi tidak ada di kelas.dex, di kelas2.dex sebaliknya.

Namun, saya harus memperbaikinya. Berikut adalah plugin Android gradle patch yang dapat Anda coba:

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

Tambalan itu di: https://github.com/yongjhih/android-gradle-plugin/commit/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bf atau https://android-review.googlesource.com/#/c/113331/

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

Tambalan resmi adalah https://android-review.googlesource.com/#/c/113201/ yang sudah digabungkan, saya pikir itu mungkin diperbaiki dalam versi berikutnya.

Sudah diperbaiki 0.14.2 (2014/11/10). (dari 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.

16
2017-11-06 14:35



Saya menggunakan Android Studio terbaru dan mengikuti dokumen resmi untuk menambahkan dukungan ke multidex https://developer.android.com/studio/build/multidex.html . Tapi saya masih mendapat pengecualian yang sama. Saya menghabiskan banyak waktu untuk memecahkannya. Akhirnya, saya menemukan penyebabnya adalah saya mengaktifkan "Java Exception Breakpoints - Terkecuali", dan "Exception Breakpoints - Ketika ada yang dilemparkan". Setelah saya menonaktifkannya, aplikasi berjalan tanpa masalah.

Cukup ikuti dokumen resmi tentang multidex https://developer.android.com/studio/build/multidex.html . Berhasil.


3
2018-06-05 09:43



Saya baru saja mengalami masalah ini. Meskipun tidak ada perubahan pada konfigurasi saya, kesalahan ini mulai terjadi. Saya mencoba semua solusi yang disarankan termasuk menghapus perangkat virtual dan membuat yang baru.

Namun, saya memperhatikan bahwa jika saya membangun sebuah APK dan menyeretnya ke emulator untuk dipasang, itu berfungsi dengan baik.

Pada akhirnya membersihkan proyek dan menjalankan kembali dan kemudian berhasil.


1
2017-10-04 23:51



Menyiapkan proyek aplikasi Anda untuk menggunakan konfigurasi multidex mengharuskan Anda melakukan modifikasi berikut pada proyek aplikasi Anda, tergantung pada versi Android minimum yang didukung aplikasi Anda.

Jika minSdkVersion Anda disetel ke 21 atau lebih tinggi, yang perlu Anda lakukan adalah mengatur multiDexEnabled menjadi true di file build.gradle tingkat modul Anda, seperti yang ditunjukkan di sini:

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

Namun, jika minSdkVersion Anda disetel ke 20 atau lebih rendah, Anda harus menggunakan pustaka dukungan multidex sebagai berikut:

  • Ubah file build.gradle level-modul untuk mengaktifkan multidex dan tambahkan pustaka multidex sebagai dependensi, seperti yang ditunjukkan di sini:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    
  • Bergantung pada apakah Anda mengganti kelas Aplikasi, lakukan salah satu dari yang berikut:

    • Jika Anda tidak mengganti kelas Aplikasi, edit file manifes Anda untuk mengatur android: nama di tag sebagai berikut:

      <?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>
      
    • Jika Anda mengganti kelas Aplikasi, ubah untuk memperpanjang MultiDexApplication (jika mungkin) sebagai berikut:

      public class MyApplication extends MultiDexApplication { ... }
      
    • Atau jika Anda mengganti kelas Aplikasi tetapi tidak mungkin untuk mengubah kelas dasar, maka Anda dapat mengganti metode attachBaseContext () dan memanggil MultiDex.install (ini) untuk mengaktifkan multidex:

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

0
2017-07-11 14:06