Lỗi: Không thể phù hợp với các lớp được yêu cầu trong một tệp dex. Hãy thử cung cấp danh sách chính-dex. # phương thức: 72477> 65536


309

Tôi muốn thêm các dịch vụ định vị hợp nhất nhưng nó cho tôi thấy một số lỗi. Giúp tôi.

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'

Câu trả lời:


385

Không có câu trả lời nào họ đưa ra cho bạn là đầy đủ. Vấn đề nằm ở Multidex. Bạn phải thêm thư viện trong lớp ứng dụng:

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

Sau đó, thêm vào defaultConfig của lớp ứng dụng:

multiDexEnabled true

Ứng dụng của bạn phải thuộc loại Multidex .. Bạn phải viết nó trong tệp kê khai:

android:name=".MyApplication"

"MyApplication" phải là lớp Multidex hoặc nó phải mở rộng nó.


5
Vậy MyApplication extends android.support.multidex.MultiDexApplicationsao
ban-geengineering

2
Tôi đã thử giải pháp này, nhưng tôi kết thúc với vấn đề mới này: stackoverflow.com/questions/49518115/iêu
ban-Geoengineering

22
Đây là trang tài liệu Android chính thức cung cấp nhiều giải thích về lý do tại sao điều này xảy ra và cách tạo apk phiên bản phát hành tốt hơn: developer.android.com/studio/build/multidex
Vrakfall

2
Đó không phải là một phương pháp tốt để giải quyết vấn đề, tốt hơn là xóa các mã và thư viện không sử dụng, tái cấu trúc mã dự án của bạn
user25

5
không có 80000 phương thức sẽ là một giải pháp tốt nếu các thư viện của Google không có 80000 phương thức (toàn bộ lý do tại sao họ thêm multidex là vì thư viện dịch vụ riêng của họ mà họ muốn mọi người sử dụng có hàng chục nghìn phương thức).
Lassi Kinnunen

195

Tôi đã khắc phục sự cố của mình bằng giải pháp bên dưới:

Trong tập tin xây dựng Gradle, thêm phụ thuộc:

triển khai 'com.android.support:multidex:1.0.3'

Và sau đó trong phần "defaultConfig", thêm:

multiDexEnables đúng


8
Đã làm cho tôi. Hướng dẫn chi tiết về cấu hình tại đây: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel

Kích hoạt hỗ trợ multidex là không cần thiết trong hầu hết các ứng dụng. Bạn nên xem xét loại bỏ các thư viện không sử dụng, xin vui lòng xem câu trả lời của tôi dưới đây.
Nhà phát triển MG

106

sửa đổi ứng dụng hoặc mô-đun của bạn build.gradle

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

Theo tài liệu chính thức

Hỗ trợ đa điểm cho Android 5.0 trở lên

Android 5.0 (API cấp 21) trở lên sử dụng thời gian chạy có tên ART, vốn hỗ trợ tải nhiều tệp DEX từ các tệp APK. ART thực hiện quá trình biên dịch trước khi cài đặt ứng dụng, quét các tệp classN.dex và biên dịch chúng thành một tệp .oat duy nhất để thiết bị Android thực thi. Do đó, nếu minSdkVersion của bạn từ 21 trở lên, bạn không cần thư viện hỗ trợ multidex.

Để biết thêm thông tin về thời gian chạy Android 5.0, hãy đọc ART và Dalvik.

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


59

Các tệp dex là gì: Các tệp ứng dụng Android (APK) chứa các tệp mã byte thực thi dưới dạng tệp Dalvik Executable (DEX), chứa mã được biên dịch được sử dụng để chạy ứng dụng của bạn.

Lý do cho ngoại lệ này: Đặc tả DEX giới hạn tổng số phương thức có thể được tham chiếu trong một tệp DEX duy nhất ở mức 65.536 (giới hạn tham chiếu 64K) trong việc bao gồm các phương thức khung, phương thức thư viện và phương thức trong mã riêng của bạn.

Bước 01. Thêm các phụ thuộc sau như sau

Đối với người dùng không dùng Androidx,

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

Đối với người dùng Androidx,

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

Bước 02:

Sau khi thêm các dự án Sync đó và trước khi bạn chạy dự án, hãy đảm bảo Xây dựng dự án trước khi chạy. nếu không, bạn sẽ nhận được một ngoại lệ.


53

Bạn có thể làm theo điều này .

Các phiên bản của nền tảng trước Android 5.0 (API cấp 21) sử dụng thời gian chạy Dalvik để thực thi mã ứng dụng. Theo mặc định, Dalvik giới hạn các ứng dụng trong một tệp mã byte lớp.dex trên mỗi APK. Để vượt qua giới hạn này, bạn có thể thêm thư viện hỗ trợ multidex vào dự án của mình:

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

Nếu minSdkVersion của bạn được đặt thành 21 hoặc cao hơn, tất cả những gì bạn cần làm là đặt multiDexEnables thành true trong tệp build.gradle cấp mô-đun của bạn, như được hiển thị ở đây:

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

34

khi bạn đang sử dụng phụ thuộc để phương pháp của bạn tăng lên! google có một giải pháp cho điều đó. cái đó gọi là Multidex!

LƯU Ý: hãy chắc chắn rằng SDK tối thiểu trên 14.

trong bản dựng của bạn.gradle:

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



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

CHO SỬ DỤNG androidX:

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

Để biết thêm thông tin xin vui lòng đi đến liên kết ban đầu:

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


Giải pháp tuyệt vời! đã khắc phục sự cố của tôi
Vaibhav Herugu

29

Hi vấn đề là ở đây loại bỏ nó

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

tại sao?

Lưu ý: Không sử dụng mục tiêu dịch vụ kết hợp. Nó mang lại hàng tá thư viện, làm đầy ứng dụng của bạn. Thay vào đó, chỉ chỉ định API dịch vụ cụ thể của Google Play mà ứng dụng của bạn sử dụng.

Và sử dụng những gì bạn cần. https://developers.google.com/android/guides/setup

Thích dịch vụ định vị

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

Đối với nhắn tin trên đám mây

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

yup bây giờ tôi đang đối mặt với vấn đề nút chạy của tôi đã bị vô hiệu hóa.
Muhammad Adil Sattar

27

Nếu bạn đang xây dựng APK DEBUG , chỉ cần thêm:

debug {
            multiDexEnabled true
        }

phía trong buildTypes

và nếu bạn đang xây dựng APK LIÊN QUAN , hãy thêm multiDexEnabled truevào khối phát hành như-

release {
                ...
                multiDexEnabled true
                ...
        }

25

Đối với các dự án rung, bạn cũng có thể giải quyết vấn đề này

mở \ android \ app \ build.gradle của bạn

bạn có thể có những điều sau đây:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Nếu minSdkVersion của bạn được đặt thành 21 hoặc cao hơn, tất cả những gì bạn cần làm là đặt multiDexEnables thành true trong defaultConfig. Như thế này

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

    }

}

nếu minSdkVersion của bạn được đặt thành 20 hoặc thấp hơn, hãy thêm multiDexEnables đúng vào defaultConfig

Và xác định việc thực hiện

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

Cuối cùng, bạn nên có:

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

}

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

Để biết thêm thông tin hãy đọc điều này: https://developer.android.com/studio/build/multidex


1
hahahaha Tôi rất vui vì nó đã giúp bạn!
Richardd

18

Chỉ cần làm như sau:

xây dựng. nâng cấp

(module:app)


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

Và thêm phụ thuộc bên dưới vào build.gradletệp cấp ứng dụng của bạn

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

13
multiDexEnabled true

Vui lòng thử thêm phần này vào ứng dụng defaultConfig {}. Điều này giúp tôi giải quyết vấn đề


12

Trong tập tin xây dựng Gradle, thêm phụ thuộc:

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

hoặc là

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

hoặc là

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

Và sau đó trong phần "defaultConfig", thêm:

multiDexEnabled true

Theo mục tiêuSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Bây giờ nếu bạn gặp phải lỗi này

Lỗi: Không thể giải quyết: Multidex-instrumentation Open File

Bạn cần thay đổi cấp độ của bạn thành 3.0.1

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

Và đặt đoạn mã sau vào tập tin gradle-wrapper.properies

phân phốiUrl = https: //service.gradle.org/distribution/gradle-4.1-all.zip

Cuối cùng

thêm lớp Ứng dụng trong dự án Và giới thiệu nó với AndroidManifest được mở rộng từ MultiDexApplication

public class App extends MultiDexApplication {

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

}

Chạy dự án trước để tạo lỗi, sau đó xóa dự án

Cuối cùng, khởi động lại dự án và tận hưởng nó


Tôi vẫn còn "Không thể giải quyết: đa dụng cụ"
Makalele

11

Nếu bạn đang sử dụng minifyEnables với Proguard, có thể bạn sẽ không cần phải bật multi-dex. Tôi đồng ý với MG Developer rằng bạn nên cố gắng tránh đa dex nếu có thể. Giải pháp của tôi là chỉ kích hoạt multi-dex cho các bản dựng gỡ lỗi. minifyEnables giải quyết vấn đề cho các bản dựng phát hành

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

một số nhược điểm của việc sử dụng multidex là gì?
isJulian00

1
Câu hỏi rất hay, mà tôi không thực sự có câu trả lời. Đọc phần sau nếu bạn chưa biết: tại developer.android.com/studio/build/multidex#mdex-gradle Có vẻ như đối với API> = 21, không có vấn đề gì nhiều. Đối với <21, dường như Android phải thực hiện một số bước chân ưa thích có khả năng có vấn đề. Vì nhiều người cần phải bật cái này lên, tôi đoán là Android đã làm cho nó hoạt động tốt, vì vậy tôi sẽ không lo lắng về nó quá nhiều. Tôi chỉ muốn được bảo thủ khi có thể.
Ernie Thomason

10

Tôi không biết tại sao, có thể là do tôi phát triển trong Kotlin nhưng để khắc phục lỗi này, cuối cùng tôi phải tạo một lớp mở rộng MultiDexApplicationnhư thế này:

class MyApplication : MultiDexApplication() {
}

và trong tôi Manifest.xmlphải đặt

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

để không nhầm lẫn bất cứ ai, tôi cũng làm:

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

đối với androidx, điều này cũng hoạt động với tôi:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

không làm việc cho tôi


nhớ làm sạch dự án và xây dựng lại sau khi thiết lập multiDexEnables true. CÁi này đã sửa nó giúp tôi.
pseudozach

việc thay đổi thuộc tính tên ứng dụng trong tệp kê khai cũng không hiệu quả với tôi, nhưng cho phép multiDex trong tệp xây dựng lớp và thêm việc thực hiện đã có hiệu quả. Có vẻ như bây giờ là tùy chọn để thay đổi thẻ tên tệp kê khai?
Cody

9

Bạn có quá nhiều phương pháp tính. Tệp dex Android có giới hạn 65536 phương thức bạn được phép có.

Để bắt đầu, nếu bạn không cần tất cả API dịch vụ google play và chỉ vị trí, hãy thay thế

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

với

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

Bạn có thể tham khảo trang này để biết cách tránh hoặc nếu cần để cho phép nhiều hơn: https://developer.android.com/studio/build/multidex.html


yup nhưng nó không phải là vấn đề thực sự Tôi nghĩ rằng tôi đang thêm phụ thuộc tương tự. Một cho Firebase và một cho vị trí Kiểm tra hai dòng dưới đây.
Muhammad Adil Sattar

6

Tất cả những gì tôi phải làm là đặt Phiên bản SDK tối thiểu thành 21 trong Tệp> Cấu trúc dự án> Ứng dụng> Hương vị


6

thêm tệp android / app / build.gradle của bạn

 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

Tôi đã gặp lỗi này hai lần và giải pháp cho việc này là; Kiểm tra tệp lớp ứng dụng của bạn để xem SDk mục tiêu của bạn, nếu nó là 20 hoặc cao hơn, chỉ cần thêm một dòng vàodefaultconfig { multiDexEnabled true }

Khác nếu mục tiêu của bạn nhỏ hơn 20, hãy thêm dòng vào defaultConfig của bạn và cũng thêm một phụ thuộc

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

Kiểm tra liên kết này để biết thêm.

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


5

Sử dụng hỗ trợ multidex nên là phương sách cuối cùng. Theo mặc định, lớp xây dựng sẽ thu thập rất nhiều phụ thuộc bắc cầu cho APK của bạn. Theo khuyến nghị trong Google Developers Docs , trước tiên hãy cố gắng loại bỏ các phụ thuộc không cần thiết khỏi dự án của bạn.

Sử dụng dòng lệnh điều hướng đến Android Project Root. Bạn có thể lấy cây phụ thuộc biên dịch như sau.

gradlew app:dependencies --configuration debugCompileClasspath

Bạn có thể nhận được danh sách đầy đủ của cây phụ thuộc

gradlew app:dependencies

nhập mô tả hình ảnh ở đây

Sau đó xóa các phụ thuộc không cần thiết hoặc quá độ khỏi ứng dụng build.gradle của bạn. Ví dụ: nếu ứng dụng của bạn sử dụng phụ thuộc được gọi là 'com.google.api-client', bạn có thể loại trừ các thư viện / mô-đun bạn không cần.

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

Sau đó, trong Android Studio Chọn Build> Phân tích APK ... Chọn tệp APK phát hành / gỡ lỗi để xem nội dung. Điều này sẽ cung cấp cho bạn các phương pháp và tài liệu tham khảo được tính như sau.

Phân tích APK


1
một số nhược điểm của việc sử dụng multidex là gì nếu chúng ta phải
isJulian00

2

Trong bản dựng: ứng dụng

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
    }

điều này là đủ cho tôi quá
nyxee

1

Lỗi xảy ra do số lượng phụ thuộc lớp bạn có trong tệp Gradle ứng dụng của bạn. Nếu các lớp vượt quá 72.400, bạn có thể muốn sử dụng multidex như một giải pháp để xử lý tốt hơn việc lập chỉ mục tệp. Tìm hiểu thêm từ đây: https://developer.android.com/studio/build/multidex

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.