java.lang.NoClassDefFoundError: android / graphics / drawable / Icon


95

Cho đến nay, tôi chỉ gặp lỗi này đối với một người dùng sử dụng điện thoại đã root (SM-G900R7 Android 4.4.2). Lỗi như sau:

Fatal Exception: java.lang.NoClassDefFoundError: android/graphics/drawable/Icon
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:870)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)

Tôi không bao giờ sử dụng android.graphics.drawable.Icon trong mã của mình, tất cả các cách sử dụng đều từ đó android.support.v4.graphics.drawable.IconCompatvà tôi cũng không bao giờ sử dụng lớp đó trong mã của mình ...

Btw thư viện hỗ trợ của tôi là version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Cảm ơn


4
Vấn đề tương tự đối với tôi. Cùng một thiết bị đã root, cùng một phiên bản Android. Bạn đã tìm thấy một giải pháp?
Chris

24
Hãy để tôi đoán? Các thiết bị Samsung chạy Android 4?
Noman Rafique

7
@NomanRafique Samsung S5, 4.4.2, đã được root.
Vaiden

2
Tôi đang gặp phải điều tương tự, cùng một thiết bị được báo cáo qua crashlyitcs. Một phiên bản gần như mọi phiên bản mới và gần như ngay lập tức sau khi xuất bản. Ứng dụng của tôi có multidex.
djxstream

6
trình theo dõi vấn đề của google: Issuetracker.google.com/issues/63151548
tabjsina

Câu trả lời:


40

Cập nhật

Sự cố được khắc phục trong thư viện hỗ trợ 27.0.0. Nếu bạn cập nhật, đừng quên thay đổi compileSdkVersion 27.

Điều gì đang xảy ra?

Các thiết bị Samsung chạy Android 4.4 gặp sự cố như thế này khi các lớp mở rộng Viewxác định các phương thức trả về hoặc lấy các tham số của các loại không có trên classpath.

Bắt đầu với phiên bản thư viện hỗ trợ 25.4.0 AppCompatImageViewvà phương pháp AppCompatImageButtonghi đè không chính xác setImageIcon(Icon). Kể từ khi Iconlớp được giới thiệu trong API 23, ứng dụng bị treo trên các thiết bị Samsung có API 19.

Điều tương tự cũng xảy ra khi bạn cố gắng ghi đè View.onApplyWindowInsets(WindowInsets).

Giải pháp cho thư viện hỗ trợ 26.1.0

Cho đến khi điều này được khắc phục một cách chính thức, Nếu bạn gặp khó khăn với phiên bản cũ hơn của thư viện hỗ trợ, tôi đã tạo một phiên bản sửa đổi appcompat-v7để setImageIconxóa tất cả dấu vết của các phương pháp. Điều này có nghĩa là nó sẽ không gặp sự cố trên Samsung chạy Android 4.4.

Đặt cái này ở cuối build.gradle của ứng dụng:

repositories {
    maven { url "https://dl.bintray.com/consp1racy/maven" }
}

configurations.all {
    resolutionStrategy.eachDependency { details ->
        def requested = details.requested
        if (requested.group == 'com.android.support' && requested.name == 'appcompat-v7') {
            details.useTarget 'net.xpece.android:support-appcompat-v7-fixed:26.1.0-1'
        }
    }
}

Mã này sẽ thay thế appcompat-v7sự phụ thuộc bằng tạo tác được sửa đổi được mô tả.

Hiện tại, phiên bản sửa lỗi duy nhất được hỗ trợ là 26.1.0.

Cảnh báo: Hiểu mã trước khi sao chép và dán và luôn thận trọng khi lấy mã từ các nguồn không xác định!


điều gì sẽ xảy ra trong tương lai nếu tôi phải cập nhật thư viện hỗ trợ lên> 26.1.0? Tôi nghĩ rằng sửa chữa của bạn sẽ bị lỗi thời, phải không?
Dika

2
@Dika Đừng lo lắng, nó sẽ được sửa trong bản phát hành tiếp theo.
Eugen Pechanec

1
@Chisko Không sử dụng nhiều phiên bản của các thư viện hỗ trợ khác nhau. Tôi nghĩ rằng bạn có thể cập nhật một cách an toàn tất cả các lib hỗ trợ của mình lên 26.1.0. Bản sửa lỗi chỉ được phát hành cho một phiên bản đó.
Eugen Pechanec

1
@Chisko đó chỉ là thói quen. Nhiều người không biết rằng các thư viện hỗ trợ được kết nối với nhau và có thể bị lỗi nếu sử dụng các phiên bản khác nhau. Chỉ cần đảm bảo rằng bạn làm :)
Eugen Pechanec

1
@Alex Tôi vừa xem qua nguồn của AppCompat 27.0.0 và nó chính xác. Hai tùy chọn: 1) Bằng cách nào đó, bạn vẫn đang sử dụng thư viện hỗ trợ cũ hơn. Kiểm tra các phụ thuộc đã giải quyết của bạn. 2) Ngoại lệ tương tự được ném ở nơi khác và vì một lớp khác. Bạn có thể chia sẻ báo cáo sự cố hoặc dấu vết ngăn xếp không? Tôi sẽ xem xét nó.
Eugen Pechanec

14

Sự cố này đã được giải quyết trong thư viện hỗ trợ 27.0.0:

Trình cắm Android Gradle 3.x:

implementation 'com.android.support:appcompat-v7:27.0.0'
implementation 'com.android.support:support-v4:27.0.0'

Trình cắm Android Gradle 2.x:

compile 'com.android.support:appcompat-v7:27.0.0'
compile 'com.android.support:support-v4:27.0.0'

Lưu ý rằng bạn cũng sẽ cần phải biên dịch theo SDK cấp 27.


1

Sự cố này liên quan đến phiên bản 25.4.0 của thư viện hỗ trợ.

Sử dụng phiên bản 25.3.1 .

Thay thế

compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.android.support:support-v4:25.4.0'

Với:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'

Cần lưu ý rằng điều này sẽ khóa bạn compileSdkVersion 25, không có API Android O và không có tính năng thư viện hỗ trợ nào được giới thiệu kể từ ngày 25.4.0 (ví dụ: tô màu các bảng vẽ của chế độ xem hình ảnh và cổng chuyển đổi hình ảnh đường dẫn vector). Đây là thư viện hỗ trợ changelog developer.android.com/topic/libraries/support-library/…
Eugen Pechanec

-1

Có 2 lựa chọn:

  1. Bạn đã thay đổi phiên bản thư viện hỗ trợ chưa? đây là vấn đề thư viện khá cổ điển khi các tài nguyên đôi khi không được 'lưu' với cùng một tên hoặc hoàn toàn. Nó không phải bạn, nó là google. Hãy thử sử dụng hỗ trợ lib 25 và xem lỗi này có còn xảy ra không.
  2. Cố gắng làm sạch dự án và xây dựng lại. Có thể bạn đang giữ một số phiên bản thư viện cũ trong thư mục xây dựng của mình và khi bạn xây dựng dự án của mình, dự án sẽ lấy các giá trị cũ từ nó.

1
cảm ơn bạn đã trả lời, cho 2. Tôi đã xóa đầy đủ gradle nhiều lần. cho 1. targetSdkVersion của tôi là 26, Android Studio hiển thị cảnh báo nếu không nhắm mục tiêu API mới nhất và Android Studio cũng hiển thị lỗi nếu tôi sử dụng phiên bản hỗ trợ lib cũ hơn targetSdkVersion.
cn123h

1
Vấn đề tương tự sau khi cập nhật lên SDK 26.
sáng

@ cn123h bạn đang sử dụng phiên bản thư viện hỗ trợ nào?
Sufian

@amouly và phiên bản lib hỗ trợ của bạn là?
Sufian
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.