Android Studio - NGOẠI LỆ CẤP ĐỘ CAO NHẤT:


82

Tôi đã tạo một dự án mới trong Android Studio bằng cách sử dụng các mẫu dự án mới được cung cấp như một phần của công cụ. Tất cả mã đã được tạo bởi Studio Tôi chưa thực hiện bất kỳ sửa đổi nào.

Tôi đang cố gắng chạy mã nhưng ứng dụng không thành công với các lỗi sau, không rõ sự cố là gì nên mọi người giúp đỡ đánh giá cao.

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\RichardKavanagh\AppData\Local\Android\android-sdk\build-tools\19.0.1\dx.bat --dex --output D:\Android\Projects\MyHealthRecord\app\build\libs\app-debug.dex D:\Android\Projects\MyHealthRecord\app\build\classes\debug D:\Android\Projects\MyHealthRecord\app\build\dependency-cache\debug D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\android-support-v7-appcompat-5a78dab7e2789bbe64f4bc80d106ca75c04dcf6f.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\classes-f9b947272e9f33ba50355b52d82755584f9c0c58.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\support-v4-19.0.0-31a2c13df80d37d62ca50fec3bde6da0ca706223.jar
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)



* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 12.948 secs

Đăng build.gradle của bạn.
Gabriele Mariotti

Hãy thử Giải pháp này , Nó đã hiệu quả với tôi, tôi đã thử những gì pyus13 nói nhưng điều này đã hiệu quả.
Joshua G

Sức này cũng sẽ xảy ra khi bạn có phụ thuộc trùng lặp trong thư viện của bạn, để giải quyết thấy điều này stackoverflow.com/a/30649660/1979347
Rohan Kandwal

i giải quyết cùng một vấn đề bằng cách loại bỏ các libs theo, bởi vì chúng ta quên rằng thêm vào trước mới bằng cách phụ thuộc gradle
tom nhà quý tộc

Câu trả lời:


117

Giống như những người khác đã nói ở đây, thư viện hỗ trợ ( com.android.support) đang được đưa vào dự án của bạn nhiều lần. Hãy thử thêm điều này vào của bạn build.gradleở cấp cơ sở và nó sẽ loại trừ việc xuất thư viện hỗ trợ qua các phụ thuộc dự án khác.

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

Nếu bạn có nhiều hơn một lib hỗ trợ được bao gồm trong các phần phụ thuộc như thế này, bạn có thể muốn xóa một trong số chúng:nhập mô tả hình ảnh ở đây


1
đây chính xác là những gì đã khắc phục sự cố này
andreimarinescu

@iTapAndroid: Tôi cần thêm vào build.gradletệp nào? nộp vào Modulehoặc Project(có dòng này classpath 'com.android.tools.build:gradle:0.9.+')? Xin vui lòng cho tôi biết, tôi không thể sửa chữa điều này.
Huy Tower

Bạn muốn thêm nó vào tệp gradle mô-đun của mình. Đây sẽ là tệp mà bạn đang thêm tất cả các phụ thuộc của mình.
iTapAndroid

@iTapAndroid Nếu dự án nhật thực của tôi không có build.gradle, tôi có thể làm gì để giải quyết vấn đề này?
Kill Console

4
Điều này chỉ không làm việc cho tôi, tôi có cùng một vấn đề. Khi tôi thêm mã được đề cập, tôi không thể nhập android.support.v4.app.ActionBarDrawerToggle;
NathofGod

18

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

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Điều này sẽ mâu thuẫn nếu bạn có hỗ trợ jar trong thư mục libs của mình. Nếu bạn có hỗ trợ jar trong thư mục libs dự án của mình và bạn đã thêm phụ thuộc vào mô-đun để biên dịch 'com.android.support:support-v4:13.0.+', ngoại lệ UNEXPECTED_TOPLEVEL_DEPENDANCY sẽ được ném ra. cấu trúc thư mục xung đột và build.gradle


Bài viết tuyệt vời, cảm ơn bạn. Những gì đã làm cho tôi là compile fileTree(dir: 'libs', include: ['*.jar'])một phần trong ảnh chụp màn hình của bạn. Đã nhận xét ra tất cả các phụ thuộc riêng lẻ và cắm nó vào và nó đã khắc phục sự cố của tôi.
user1003916

9

Bởi vì bạn có thể bao gồm hai lib giống nhau trong dự án của mình. kiểm tra tệp build.gradle của bạn.

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile files('libs/android-support-v4.jar') 
 }

nếu tệp của bạn bao gồm biên dịch 'com.android.support:appcompat-v7:+'compile files('libs/android-support-v4.jar'), nó sẽ có vấn đề này. xóa câu này: biên dịch tệp ('libs / android-support-v4.jar')

Đó là cách tôi khắc phục sự cố này.


8

Lỗi xảy ra khi bạn có cùng một thư viện / thư mục được bao gồm nhiều lần trong các phần phụ thuộc của build.gradle. Ok, giả sử bạn có cấu trúc Ứng dụng giống như sau:

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

Vì vậy, bạn có "ứng dụng" chính và sau đó bạn có một loạt các ứng dụng phụ / mô-đun / thư viện. Các thư viện là: 1) gene_test_library, 2) gene_nine_old_androids_library, & 3) vuốt_list_view_library.

Tên tôi là Gene, vì vậy đó là lý do tại sao có tất cả các thư viện "gene" này.

Bên trong build.gradle cho “ứng dụng”, tôi có:

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

    compile project(':libraries:gene_test_library')
    //compile project(':libraries:genes_nine_old_androids_library')
    compile project(':libraries:swipe_list_view_library')
}

Bên trong build.gradle cho gene_test_library, tôi không có gì:

dependencies {
}

Bên trong build.gradle cho gene_nine_old_androids_library, tôi có:

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

Bên trong build.gradle cho vuốt_list_view_library, tôi có:

dependencies {
    compile 'com.nineoldandroids:library:2.4.0+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

Dòng mã này “compile fileTree (dir: 'libs', include: ['* .jar'])" chỉ có nghĩa là "này, xem bên trong thư mục 'libs' bên trong mô-đun này để biết bất kỳ tệp jar nào. Tôi không có bất kỳ thứ gì trong thư mục libs của bất kỳ mô-đun nào nên bạn có thể bỏ qua dòng mã đó.

Vì vậy, giả sử tôi bỏ ghi chú // dự án biên dịch (': architects: gien_nine_old_androids_library') trong build.gradle cho mô-đun "ứng dụng". Sau đó, tôi sẽ nhận được lỗi "NGOẠI LỆ CẤP ĐỘ CHƯA TỪNG CÓ:". Tại sao vậy?

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

Chà, việc viết // compile project (': architects: architects_nine_old_androids_library') bên trong build.gradle cho “ứng dụng”, cũng giống như việc lấy các phụ thuộc xây dựng của mô-đun “gene_nine_old_androids_library” và đặt nó ở đó. Vì vậy, bỏ ghi chú câu lệnh // compile project (': architects: gene_nine_old_androids_library'), câu lệnh build.gradle cho mô-đun "app" sẽ trở thành:

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

    compile project(':libraries:gene_test_library')
    ***compile fileTree(dir: 'libs', include: ['*.jar'])***
    ***compile 'com.android.support:appcompat-v7:21.0.0'***
    compile project(':libraries:swipe_list_view_library')
}

Lưu ý rằng "biên dịch" com.android.support:appcompat-v7:21.0.0 '"hiện nay hiển thị như thế nào. Đó là lỗi đến từ đâu.


3
"Lỗi xảy ra khi bạn có cùng một thư viện / thư mục được bao gồm nhiều lần." Điều này đã cứu ngày của tôi.
Subin Sebastian

@Gene, trong appbạn compile project(':libraries:swipe_list_view_library')và swap_list_view_library cũng bao gồm appcompat-v7. Vì vậy, bạn sẽ có 2 appcompat-v7 được biên dịch trong app. Tại sao cái này không có lỗi?
azizbekian

Ừm ... Tôi đã viết bài này cách đây nhiều năm ... Tôi nghĩ lỗi mà nó ném là NGOẠI LỆ CẤP ĐỘ CHƯA TỪNG CÓ.
Gene

5

Tôi tìm thấy 2 lý do cho vấn đề này:

  1. Đôi khi là do có nhiều thư viện bao gồm. Ví dụ bạn thêm

    biên dịch 'com.nineoldandroids: library: 2.4.0'

trong gradle của bạn và thêm một thư viện khác mà nó cũng sử dụng "nineoldandroids" trong gradle của nó!

  1. Như trang web chính thức của nhà phát triển Android cho biết:

Nếu bạn đã xây dựng một ứng dụng Android và nhận được lỗi này, thì xin chúc mừng, bạn có rất nhiều mã!

Vậy tại sao?

Đặc tả Dalvik Executable giới hạn tổng số phương thức có thể được tham chiếu trong một tệp DEX là 65.536, bao gồm các phương thức khung Android, phương thức thư viện và phương thức trong mã của riêng bạn. Để vượt qua giới hạn này, bạn yêu cầu định cấu hình quy trình xây dựng ứng dụng của mình để tạo nhiều tệp DEX, được gọi là cấu hình multidex.

Sau đó bạn nên làm gì?

  • Tránh giới hạn 65 nghìn - Làm thế nào?

    1. Xem lại phần phụ thuộc trực tiếp và bắc cầu của ứng dụng - Đảm bảo bất kỳ phần phụ thuộc thư viện lớn nào mà bạn đưa vào ứng dụng của mình đều được sử dụng theo cách lớn hơn số lượng mã được thêm vào ứng dụng. Một cách chống mẫu phổ biến là bao gồm một thư viện rất lớn vì một vài phương pháp tiện ích rất hữu ích. Giảm sự phụ thuộc vào mã ứng dụng của bạn thường có thể giúp bạn tránh được giới hạn tham chiếu dex.
    2. Xóa mã không sử dụng với ProGuard - Định cấu hình cài đặt ProGuard cho ứng dụng của bạn để chạy ProGuard và đảm bảo bạn đã bật tính năng thu nhỏ cho các bản phát hành. Việc bật tính năng thu nhỏ đảm bảo bạn không gửi mã chưa sử dụng cùng với các APK của mình.
  • Định cấu hình ứng dụng của bạn cho Multidex với Gradle - Làm thế nào? 1.Thay đổi cấu hình bản dựng Gradle của bạn để kích hoạt multidex.

đặt

multiDexEnabled true

trong phần defaultConfig, buildType hoặc productFlavor của tệp xây dựng Gradle của bạn.

2. Trong tệp kê khai của bạn, hãy thêm lớp MultiDexApplication từ thư viện hỗ trợ multidex vào phần tử ứng dụng.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>
</manifest>

Lưu ý: Nếu ứng dụng của bạn sử dụng mở rộng lớp Ứng dụng, bạn có thể ghi đè phương thức attachmentBaseContext () và gọi MultiDex.install (this) để bật multidex. Để biết thêm thông tin, hãy xem tài liệu tham khảo MultiDexApplication.


Ngoài ra mã này có thể giúp bạn:

dexOptions {
    javaMaxHeapSize "4g"
}

Đặt trong gradle của bạn (android {...}).


Lý do sử dụng javaMaxHeapSize là gì?
IgorGanapolsky

4

Xin chào tất cả, tôi đã gặp sự cố tương tự do tệp hỗ trợ trùng lặp phiên bản 4 mà tôi đã đưa vào trong khi cố gắng tích hợp phân tích cú pháp. Đã xóa phần bổ sung khỏi thư mục libs và hiện nó hoạt động tốt!


bằng cách sử dụng kho lưu trữ Maven, tôi đã phải xóa cả "compile 'com.android.support:appcompat-v7:23.0.1'" và "compile 'com.android.support:support-v4:23.+'" khỏi khối phụ thuộc.
Mahya

3

Điều này xảy ra khi một thư viện được biên dịch hai lần (tức là nó được thêm hai lần). Nó có thể là thư viện hỗ trợ hoặc bất kỳ thứ gì khác, điều đó không quan trọng.
Trường hợp phổ biến là bạn đã thêm một câu lệnh biên dịch của một thư viện đã có trong libs/thư mục của bạn . Tất cả các *.jartệp được biên dịch tự động. Do đó, việc thêm một câu lệnh biên dịch sẽ gây ra lỗi. Xóa câu lệnh đó có thể khắc phục sự cố này. Nếu điều này không áp dụng được thì chúng tôi đã có một số câu trả lời tuyệt vời.


3

Đây có thể là câu trả lời ngớ ngẩn nhất, nhưng điều này phù hợp với tôi:

  • Tôi đã xóa và thêm tất cả các thư viện trong dự án của mình theo cách thủ công. (Cái này đến cái kia) Và thì đấy, nó đã hoạt động.
  • Xây dựng -> Xây dựng lại dự án

Lưu ý: Không có thư viện nào của tôi được biên dịch hai lần.


2

Đảm bảo rằng bạn đã tải xuống Hỗ trợ kho lưu trữ để sử dụng phụ thuộc thư viện hỗ trợ trong build.gradle.

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

Nếu tất cả những thứ này đều đã được cài đặt, hãy đồng bộ hóa dự án của bạn với gradle khi sử dụng nút có sẵn.

nút đồng bộ


0

Trong trường hợp của tôi NGOẠI LỆ CẤP ĐỘ CAO đã bị ném vì một ký tự đặc biệt trong đường dẫn dự án. Chỉ cần đóng dự án, thay đổi "á" thành "a" và mở lại dự án. Làm!


0

Đột nhiên, không có bất kỳ thay đổi lớn nào trong dự án của tôi, tôi cũng mắc phải lỗi này.

Tất cả những điều trên không hoạt động với tôi, vì tôi cần cả hai libs hỗ trợ V4 và V7.

Cuối cùng, vì cách đây 2 giờ dự án được biên dịch không có vấn đề gì, tôi chỉ đơn giản yêu cầu Android Studio REBUILD dự án và lỗi đã biến mất.


0

Tôi đã gặp sự cố tương tự khi cố gắng tạo apk đã ký cho ứng dụng của mình.

Thật kỳ lạ, nó chỉ xảy ra khi tôi muốn xây dựng một apk phát hành , trong khi trên apk gỡ lỗi, mọi thứ đều hoạt động tốt.

Cuối cùng, tìm kiếm trên chuỗi này, tôi đã kiểm tra các bản sao thư viện hỗ trợ trong build.gradle và loại bỏ mọi bản sao nhưng điều này vẫn chưa đủ ..

Tôi đã phải thực hiện một dự án sạch sẽ và chỉ sau đó cuối cùng tôi mới làm được việc.


0

Tôi biết rằng vấn đề đã được giải đáp, nhưng điều này có thể xảy ra một lần nữa và giải pháp của tôi hơi khác so với những giải pháp tôi đã tìm thấy. Trong trường hợp của tôi, giải pháp không liên quan đến việc bao gồm hai thư viện khác nhau trong dự án của tôi. Xem mã bên dưới:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Mã này gây ra lỗi "Ngoại lệ cấp cao nhất không mong muốn". Tôi sửa mã thực hiện các thay đổi sau:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Phiên bản Java có liên quan gì với DexMerger ?
IgorGanapolsky

0

Tôi đã giải quyết vấn đề của mình bằng cách thêm những thứ này vào lớp xây dựng:

   defaultConfig {
   multiDexEnabled true


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

một giải pháp khác có thể là xóa các thư viện không cần thiết


Tại sao bạn bật multidex?
IgorGanapolsky

1
@IgorGanapolsky của nó vì để giải quyết các vấn đề như trên của nhiều thư viện được bao gồm. Trong android studio: đặc tả Dalvik Executable 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 là 65.536, bao gồm các phương thức khung Android, phương thức thư viện và phương thức trong mã của riêng bạn. Để vượt qua giới hạn này, bạn yêu cầu định cấu hình quy trình xây dựng ứng dụng của mình để tạo nhiều tệp DEX, được gọi là cấu hình multidex.
Bishnu Dudhraj
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.