ข้อผิดพลาด: ไม่สามารถจัดคลาสที่ร้องขอในไฟล์ dex ไฟล์เดียวลองส่งรายการ main-dex # วิธีการ: 72477> 65536


309

ฉันต้องการเพิ่มบริการระบุตำแหน่งแบบผสม แต่มันแสดงข้อผิดพลาดบางอย่างให้ฉัน ช่วยฉันด้วย.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'

คำตอบ:


385

ไม่มีคำตอบที่พวกเขาให้คุณครบถ้วนสมบูรณ์ ปัญหาอยู่ใน Multidex คุณต้องเพิ่มห้องสมุดในแอป gradle:

implementation 'com.android.support:multidex:1.0.3'

หลังจากเพิ่มใน defaultConfig ของแอพ gradle:

multiDexEnabled true

แอปพลิเคชันของคุณต้องเป็นประเภท Multidex .. คุณต้องเขียนในไฟล์ Manifest:

android:name=".MyApplication"

"MyApplication" ต้องเป็นคลาส Multidex หรือต้องขยายออก


5
งั้นMyApplication extends android.support.multidex.MultiDexApplicationเหรอ?
บ้านจีโอเอ็นจิเนียริ่ง

2
ฉันได้ลองใช้วิธีแก้ไขปัญหานี้แล้ว แต่จบลงด้วยปัญหาใหม่นี้: stackoverflow.com/questions/49518115/…
ห้าม geoengineering

22
นี่คือหน้าเอกสาร Android อย่างเป็นทางการที่ให้คำอธิบายเพิ่มเติมเกี่ยวกับสาเหตุที่เกิดขึ้นและวิธีการทำให้รุ่นวางจำหน่ายดีขึ้น apk: developer.android.com/studio/build/multidex
Vrakfall

2
ไม่ใช่วิธีที่ดีในการแก้ปัญหาดีกว่าที่จะลบรหัสและไลบรารีที่ไม่ได้ใช้ออกให้ดีขึ้นให้ปรับโครงสร้างรหัสโครงการของคุณใหม่
user25

5
การไม่มีวิธี 80000 จะเป็นวิธีแก้ปัญหาที่ดีถ้าห้องสมุด googles ไม่มีวิธี 80000 (เหตุผลทั้งหมดว่าทำไมพวกเขาเพิ่ม multidex ก็เพราะห้องสมุดบริการของตัวเองที่พวกเขาต้องการให้ทุกคนใช้มีหมื่นวิธี)
Lassi Kinnunen

195

ฉันแก้ไขปัญหาด้วยวิธีแก้ปัญหาด้านล่าง:

ใน Gradle build file เพิ่มการพึ่งพา:

การใช้งาน 'com.android.support:multidex:1.0.3'

จากนั้นในส่วน "defaultConfig" ให้เพิ่ม:

multiDexEnabled จริง


8
ทำงานให้ฉัน คำแนะนำโดยละเอียดเกี่ยวกับการกำหนดค่าที่นี่: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel

การเปิดใช้งานการรองรับ Multidex นั้นไม่จำเป็นในแอปพลิเคชั่นส่วนใหญ่ คุณควรพิจารณาลบไลบรารี่ที่ไม่ได้ใช้ออกโปรดดูคำตอบของฉันด้านล่าง
นักพัฒนา MG

106

แก้ไขแอพหรือโมดูลของคุณ build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

ตามเอกสารอย่างเป็นทางการ

รองรับ Multidex สำหรับ Android 5.0 ขึ้นไป

Android 5.0 (API ระดับ 21) ขึ้นไปใช้รันไทม์ชื่อ ART ซึ่งรองรับการโหลดไฟล์ DEX หลายไฟล์จากไฟล์ APK ART ทำการรวบรวมล่วงหน้า ณ เวลาที่ติดตั้งแอปซึ่งจะสแกนหาไฟล์ classesN.dex และรวบรวมเป็นไฟล์. oat เดียวสำหรับการใช้งานโดยอุปกรณ์ Android ดังนั้นหาก minSdkVersion ของคุณคือ 21 หรือสูงกว่าคุณไม่จำเป็นต้องมีไลบรารีการสนับสนุน multidex

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรันไทม์ Android 5.0 ให้อ่าน ART และ Dalvik

https://developer.android.com/studio/build/multidex


59

ไฟล์ dex คืออะไร: ไฟล์แอป Android (APK) มีไฟล์ bytecode ที่สามารถเรียกใช้งานได้ในรูปแบบของไฟล์ Dalvik Executable (DEX) ซึ่งมีรหัสที่คอมไพล์ซึ่งใช้ในการรันแอพของคุณ

เหตุผลสำหรับข้อยกเว้นนี้:ข้อกำหนด DEX จำกัด จำนวนวิธีการทั้งหมดที่สามารถอ้างอิงได้ภายในไฟล์ DEX เดียวที่ 65,536 (ข้อ จำกัด การอ้างอิง 64K) - รวมถึงวิธีการกรอบ Android, วิธีห้องสมุดและวิธีการในรหัสของคุณเอง

ขั้นตอนที่ 01. เพิ่มการพึ่งพาต่อไปนี้ดังต่อไปนี้

สำหรับผู้ใช้ที่ไม่ใช่ Androidx

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

สำหรับผู้ใช้ Androidx

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

ขั้นตอนที่ 02:

หลังจากเพิ่มโครงการ Sync เหล่านั้นและก่อนที่คุณจะรันโครงการตรวจสอบให้แน่ใจว่าได้สร้างโครงการก่อนที่จะรัน มิฉะนั้นคุณจะได้รับข้อยกเว้น


53

คุณสามารถปฏิบัติตามนี้

รุ่นของแพลตฟอร์มก่อน Android 5.0 (API ระดับ 21) ใช้รันไทม์ Dalvik สำหรับการรันโค้ดแอป โดยค่าเริ่มต้น Dalvik จำกัด แอพไว้ที่ไฟล์ classdex bytecode ไฟล์เดียวต่อ APK เพื่อหลีกเลี่ยงข้อ จำกัด นี้คุณสามารถเพิ่มไลบรารีการสนับสนุน multidex ในโครงการของคุณ:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

หาก minSdkVersion ของคุณถูกตั้งค่าเป็น 21 หรือสูงกว่าสิ่งที่คุณต้องทำคือตั้งค่า multiDexEnabled เป็น true ในไฟล์ build.gradle ระดับโมดูลของคุณดังแสดงที่นี่:

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

34

เมื่อคุณใช้การพึ่งพาดังนั้นวิธีการของคุณเพิ่มขึ้น! google มีทางออกสำหรับสิ่งนั้น ที่เรียกว่า Multidex!

หมายเหตุ: ต้องแน่ใจว่า min SDK มีค่าเกิน 14

ใน build.gradle ของคุณ:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}



  dependencies {
      implementation 'com.android.support:multidex:1.0.3'
    }

สำหรับ androidX USE:

 def multidex_version = "2.0.1"
 implementation 'androidx.multidex:multidex:$multidex_version'

สำหรับข้อมูลเพิ่มเติมโปรดไปที่ลิงค์เดิม:

https://developer.android.com/studio/build/multidex


สุดยอดทางออก! แก้ไขปัญหาของฉัน
Vaibhav Herugu

29

สวัสดีปัญหาอยู่ที่นี่ลบออก

compile 'com.google.android.gms:play-services:11.8.0'

ทำไม?

หมายเหตุ:อย่าใช้เป้าหมาย play-services ที่รวมกัน มันนำมาซึ่งห้องสมุดนับสิบใบ ระบุเฉพาะ API บริการของ Google Play ที่แอปของคุณใช้แทน

และใช้สิ่งที่คุณต้องการ https://developers.google.com/android/guides/setup

ชอบบริการบอกตำแหน่ง

com.google.android.gms:play-services-location:11.8.0

สำหรับ Cloud Messaging

com.google.android.gms:play-services-gcm:11.8.0

ใช่ตอนนี้ฉันกำลังประสบปัญหาปุ่มเรียกใช้ของฉันถูกปิดใช้งาน
มูฮัมหมัด Adil Sattar

27

หากคุณกำลังสร้างDEBUG APKให้เพิ่ม:

debug {
            multiDexEnabled true
        }

ภายใน buildTypes

และถ้าคุณกำลังสร้างRELEASE APKให้เพิ่ม multiDexEnabled trueใน release block as-

release {
                ...
                multiDexEnabled true
                ...
        }

25

สำหรับโครงการที่กระพือคุณสามารถแก้ปัญหานี้ได้

เปิด \ android \ app \ build.gradle ของคุณ

คุณควรจะมีสิ่งต่อไปนี้:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

หาก minSdkVersion ของคุณถูกตั้งค่าเป็น 21 หรือสูงกว่าสิ่งที่คุณต้องทำคือตั้งค่าmultiDexEnabled เป็น trueใน defaultConfig แบบนี้

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

ถ้า minSdkVersion ของคุณถูกตั้งค่าเป็น 20 หรือต่ำกว่าเพิ่มmultiDexEnabled จริงเพื่อ defaultConfig

และกำหนดการนำไปปฏิบัติ

dependencies {
  implementation 'com.android.support:multidex:1.0.3'// or 2.0.1
}

ในตอนท้ายคุณควรจะมี:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

สำหรับข้อมูลเพิ่มเติมอ่านได้ที่: https://developer.android.com/studio/build/multidex


1
hhahaha! ฉันมีความสุขที่ได้ช่วยคุณ!
Richardd

18

เพียงทำต่อไปนี้:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

และเพิ่มการพึ่งพาด้านล่างในbuild.gradleไฟล์ระดับแอปของคุณ

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 

13
multiDexEnabled true

โปรดลองเพิ่มลงใน defaultConfig ของแอพของคุณซึ่งจะช่วยฉันในการแก้ปัญหา


12

ใน Gradle build file เพิ่มการพึ่งพา:

implementation 'com.android.support:multidex:1.0.2'

หรือ

implementation 'com.android.support:multidex:1.0.3'

หรือ

implementation 'com.android.support:multidex:2.0.0'

จากนั้นในส่วน "defaultConfig" ให้เพิ่ม:

multiDexEnabled true

ภายใต้ targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

ตอนนี้ถ้าคุณพบข้อผิดพลาดนี้

ข้อผิดพลาด: ไม่สามารถแก้ไขได้: เปิดไฟล์มัลติอุปกรณ์

คุณต้องเปลี่ยน gradle เป็น 3.0.1

        classpath 'com.android.tools.build:gradle:3.0.1'

และใส่รหัสต่อไปนี้ในไฟล์ gradle-wrapper.properties

distributionUrl = https: //services.gradle.org/distributions/gradle-4.1-all.zip

ในที่สุด

เพิ่มคลาส Applition ในโครงการและแนะนำให้รู้จักกับ AndroidManifest ซึ่งขยายจาก MultiDexApplication

public class App extends MultiDexApplication {

@Override
public void onCreate( ) {
    super.onCreate( );
}

}

เรียกใช้โครงการก่อนเพื่อสร้างข้อผิดพลาดจากนั้นทำความสะอาดโครงการ

ในที่สุดเปิดตัวโครงการใหม่และสนุกกับมัน


ฉันยังคงมี "ล้มเหลวในการแก้ไข: เครื่องมือ
ทวีคูณ

11

หากคุณใช้ minifyEnabled กับ Proguard คุณอาจไม่จำเป็นต้องเปิดใช้งาน multi-dex ฉันเห็นด้วยกับ MG Developer ว่าคุณควรพยายามหลีกเลี่ยงการใช้งานหลาย dex หากเป็นไปได้ โซลูชันของฉันคือเปิดใช้งาน multi-dex สำหรับการดีบักบิลด์เท่านั้น minifyEnabled แก้ปัญหาสำหรับรุ่นบิลด์

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}

ข้อเสียของการใช้ multidex มีอะไรบ้างถ้าเราต้องทำ?
isJulian00

1
เป็นคำถามที่ดีมากซึ่งฉันไม่ได้รับคำตอบจริงๆ อ่านสิ่งต่อไปนี้หากคุณยังไม่ได้: ที่developer.android.com/studio/build/multidex#mdex-gradle ดูเหมือนว่าสำหรับ API> = 21 ไม่มีปัญหามากนัก สำหรับ <21 ดูเหมือนว่า Android จะต้องสร้างฟุตเทจแฟนซีที่อาจมีปัญหา เนื่องจากหลายคนจำเป็นต้องเปิดใช้งานการคาดเดาของฉันคือว่า Android ทำงานได้ดีดังนั้นฉันจึงไม่ต้องกังวลกับมันมากเกินไป ฉันชอบที่จะอนุรักษ์ที่เป็นไปได้
เออร์นี่ Thomason

10

ฉันไม่รู้ว่าทำไมบางทีอาจเป็นเพราะฉันพัฒนาใน Kotlin แต่เพื่อแก้ไขข้อผิดพลาดนี้ในที่สุดฉันก็ต้องสร้างคลาสที่มีMultiDexApplicationลักษณะดังนี้:

class MyApplication : MultiDexApplication() {
}

และในฉันManifest.xmlฉันต้องตั้งค่า

<application
        ...
        android:name=".MyApplication">

เพื่อไม่ให้สับสนใครก็ทำ:

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

สำหรับ androidx มันใช้ได้กับฉันด้วย:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

ไม่ได้ผลสำหรับฉัน


อย่าลืมทำโครงการให้สะอาดและสร้างใหม่หลังจากตั้งค่า multiDexEnabled จริง สิ่งนี้แก้ไขได้สำหรับฉัน
pseudozach

การเปลี่ยนแอ็ตทริบิวต์ชื่อแอปพลิเคชันในรายการไม่ได้ผลสำหรับฉัน แต่การเปิดใช้งาน multiDex ในไฟล์ build gradle และการเพิ่มการใช้งานก็ใช้งานได้ ดูเหมือนว่าเป็นตัวเลือกในการเปลี่ยนแท็กชื่อรายการหรือไม่
โคดี้

9

คุณมีวิธีการมากเกินไป ไฟล์ Android dex มีข้อ จำกัด 65536 วิธีที่คุณได้รับอนุญาต

สำหรับผู้เริ่มต้นหากคุณไม่ต้องการ API บริการ Google Play ทั้งหมดและเพียงตำแหน่งให้เปลี่ยน

compile 'com.google.android.gms:play-services:11.8.0'

กับ

compile 'com.google.android.gms:play-services-location:11.8.0'

คุณสามารถอ้างถึงหน้านี้สำหรับวิธีการหลีกเลี่ยงหรือหากจำเป็นต้องอนุญาตเพิ่มเติม: https://developer.android.com/studio/build/multidex.html


ใช่ แต่ไม่ใช่ปัญหาจริง ฉันคิดว่าฉันกำลังเพิ่มการพึ่งพาเหมือนกัน หนึ่งรายการสำหรับ Firebase และอีกรายการหนึ่งสำหรับตำแหน่งตรวจสอบการร้องสองบรรทัด
มูฮัมหมัด Adil Sattar

6

สิ่งที่ฉันต้องทำคือตั้งค่า SDK ขั้นต่ำเป็น 21 ในไฟล์> โครงสร้างโครงการ> แอป> Flavours


6

เพิ่มไฟล์android / app / build.gradle ของคุณ

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }

5

ฉันพบข้อผิดพลาดนี้สองครั้งและวิธีแก้ปัญหาสำหรับเรื่องนี้คือ ตรวจสอบไฟล์แอป gradle ของคุณเพื่อดู SDk เป้าหมายของคุณหากเป็น 20 หรือสูงกว่าเพียงเพิ่มหนึ่งบรรทัดในของคุณdefaultconfig { multiDexEnabled true }

มิฉะนั้นถ้า targetSDK ของคุณน้อยกว่า 20 ให้เพิ่มบรรทัดใน defaultConfig ของคุณและเพิ่มการพึ่งพา

implementation 'com.android.support:multidex:1.0.3'.

ตรวจสอบลิงค์นี้เพื่อเพิ่มเติม

https://developer.android.com/studio/build/multidex#mdex-gradle


5

การใช้การสนับสนุนหลายไฟล์ควรเป็นทางเลือกสุดท้าย ตามค่าเริ่มต้น gradle build จะรวบรวมการพึ่งพาสกรรมกริยาสำหรับ APK ของคุณเป็นจำนวนมาก ตามที่แนะนำในGoogle Developers Docsก่อนอื่นให้พยายามลบการอ้างอิงที่ไม่จำเป็นออกจากโครงการของคุณ

การใช้บรรทัดคำสั่งนำทางไปยังรูทโครงการ Android คุณจะได้รับต้นไม้พึ่งพาการรวบรวมดังนี้

gradlew app:dependencies --configuration debugCompileClasspath

คุณสามารถรับรายการการพึ่งพาต้นไม้ทั้งหมด

gradlew app:dependencies

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นลบการอ้างอิงที่ไม่จำเป็นหรือสกรรมกริยาออกจาก build.gradle แอปของคุณ ตัวอย่างเช่นหากแอปของคุณใช้การอ้างอิงที่เรียกว่า 'com.google.api-client' คุณสามารถยกเว้นไลบรารี / โมดูลที่คุณไม่ต้องการ

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

จากนั้นใน Android Studio เลือกสร้าง> วิเคราะห์ APK ... เลือกไฟล์การเปิดตัว / ดีบั๊ก APK เพื่อดูเนื้อหา สิ่งนี้จะให้วิธีการและการอ้างอิงแก่คุณดังนี้

วิเคราะห์ APK


1
ข้อเสียของการใช้ multidex คืออะไรถ้าเราต้อง
isJulian00

2

กำลังสร้าง: แอป

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'

1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

นี่ก็เพียงพอแล้วสำหรับฉันเช่นกัน
nyxee

1

ข้อผิดพลาดเกิดจากจำนวนการอ้างอิงคลาสที่คุณมีในไฟล์ Gradle แอปของคุณ หากคลาสมีมากกว่า 72,400 คุณอาจต้องการใช้ multidex เป็นวิธีแก้ปัญหาเพื่อจัดการการสร้างดัชนีไฟล์ที่ดีขึ้น ค้นหาข้อมูลเพิ่มเติมได้จากที่นี่: https://developer.android.com/studio/build/multidex

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.