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


95

จนถึงตอนนี้ฉันได้รับข้อผิดพลาดนี้เฉพาะสำหรับผู้ใช้รายเดียวที่ใช้โทรศัพท์ที่รูท (SM-G900R7 Android 4.4.2) ข้อผิดพลาดเป็นดังนี้:

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)

ฉันไม่เคยใช้ android.graphics.drawable.Icon ในรหัสของฉันการใช้งานทั้งหมดมาจากandroid.support.v4.graphics.drawable.IconCompatและฉันก็ไม่เคยใช้คลาสนั้นในรหัสของฉัน ...

Btw ห้องสมุดสนับสนุนของฉันคือ version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

ขอบคุณ


4
ปัญหาเดียวกันสำหรับฉัน อุปกรณ์ที่รูทเดียวกันเวอร์ชัน Android เดียวกัน คุณพบวิธีแก้ปัญหาหรือไม่?
คริส

24
ให้ฉันเดา? อุปกรณ์ Samsung ที่ใช้ Android 4?
Noman Rafique

7
@NomanRafique Samsung S5, 4.4.2, รูทแล้ว
Vaiden

2
ฉันประสบปัญหาเดียวกันอุปกรณ์เดียวกันรายงานผ่าน crashlyitcs หนึ่งอินสแตนซ์เกือบทุกเวอร์ชันใหม่และเกือบจะทันทีหลังจากเผยแพร่ แอพของฉันมี multidex
djxstream

6
ตัวติดตามปัญหาของ Google: issueetracker.google.com/issues/63151548
tabjsina

คำตอบ:


40

อัปเดต

ปัญหาได้รับการแก้ไขแล้วในไลบรารีการสนับสนุน 27.0.0 หากคุณอัปเดตอย่าลืมเปลี่ยนcompileSdkVersion 27ด้วย

เกิดอะไรขึ้น?

อุปกรณ์ Samsung ที่ใช้ Android 4.4 ขัดข้องเช่นนี้เมื่อคลาสขยายViewกำหนดวิธีการที่ส่งคืนหรือรับพารามิเตอร์ของประเภทที่ไม่ได้อยู่ในคลาสพา ธ

เริ่มต้นด้วยไลบรารีสนับสนุนเวอร์ชัน 25.4.0 AppCompatImageViewและวิธีการAppCompatImageButtonแทนที่ไม่ถูกต้อง setImageIcon(Icon)เนื่องจากIconคลาสถูกนำมาใช้ใน API 23 แอปขัดข้องบนอุปกรณ์ Samsung ที่มี API 19

View.onApplyWindowInsets(WindowInsets)สิ่งที่คล้ายกันเกิดขึ้นเมื่อคุณพยายามที่จะแทนที่

วิธีแก้ปัญหาสำหรับไลบรารีสนับสนุน 26.1.0

จนกว่าสิ่งนี้จะได้รับการแก้ไขอย่างเป็นทางการหากคุณติดอยู่กับไลบรารีการสนับสนุนเวอร์ชันเก่าฉันได้ทำการแก้ไขเวอร์ชันappcompat-v7ที่มีsetImageIconการลบร่องรอยของวิธีการทั้งหมด ซึ่งหมายความว่าจะไม่เกิดปัญหากับ Samsung ที่ใช้ Android 4.4

วางไว้ที่ด้านล่างของ build.gradle ของแอปของคุณ:

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

รหัสนี้จะแทนที่การappcompat-v7อ้างอิงด้วยสิ่งประดิษฐ์ที่แก้ไขตามที่อธิบายไว้

ขณะนี้การแก้ไขเวอร์ชันเดียวที่รองรับคือ 26.1.0

คำเตือน:ทำความเข้าใจรหัสก่อนคัดลอกและใช้ความระมัดระวังเมื่อรับรหัสจากแหล่งที่ไม่รู้จัก!


จะเกิดอะไรขึ้นในอนาคตหากฉันต้องอัปเดตไลบรารีการสนับสนุนเป็น> 26.1.0 ฉันคิดว่าการแก้ไขของคุณจะล้าสมัยใช่ไหม?
ฎีกา

2
@Dika ไม่ต้องกังวลควรแก้ไขในรุ่นถัดไป
Eugen Pechanec

1
@Chisko อย่าใช้ไลบรารีการสนับสนุนที่แตกต่างกันหลายเวอร์ชัน ฉันคิดว่าคุณสามารถอัปเดต libs สนับสนุนทั้งหมดของคุณเป็น 26.1.0 ได้อย่างปลอดภัย การแก้ไขจะถูกนำออกใช้สำหรับเวอร์ชันเดียวเท่านั้น
Eugen Pechanec

1
@ ชิสโกมันเป็นเพียงพลังแห่งความเคยชิน หลายคนไม่ทราบว่าไลบรารีที่รองรับนั้นเชื่อมต่อถึงกันและอาจขัดข้องหากใช้เวอร์ชันอื่น แค่ทำให้แน่ใจว่าคุณทำ :)
Eugen Pechanec

1
@Alex ฉันเพิ่งไปหาแหล่งที่มาของ AppCompat 27.0.0 และถูกต้อง สองตัวเลือก: 1) อย่างไรก็ตามคุณยังคงใช้ไลบรารีการสนับสนุนรุ่นเก่าอยู่ ตรวจสอบการอ้างอิงที่แก้ไขของคุณ 2) ข้อยกเว้นเดียวกันนี้ถูกโยนทิ้งไปที่อื่นและเนื่องจากคลาสอื่น คุณสามารถแชร์รายงานข้อขัดข้องหรือการติดตามสแต็กได้หรือไม่ ฉันจะดูมัน
Eugen Pechanec

14

ปัญหานี้ได้รับการแก้ไขแล้วในไลบรารีสนับสนุน 27.0.0:

ปลั๊กอิน Android Gradle 3.x:

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

ปลั๊กอิน Android Gradle 2.x:

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

โปรดทราบว่าคุณจะต้องคอมไพล์เทียบกับ SDK ระดับ 27


1

ข้อขัดข้องนี้เกี่ยวข้องกับไลบรารีการสนับสนุนเวอร์ชัน 25.4.0

ใช้เวอร์ชัน25.3.1

แทนที่

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

ด้วย:

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

เป็นที่น่าสังเกตว่าสิ่งนี้จะล็อคคุณไว้compileSdkVersion 25ไม่มี Android O API และไม่มีฟีเจอร์ไลบรารีรองรับที่นำมาใช้ตั้งแต่ 25.4.0 (เช่นการย้อมสีมุมมองภาพที่วาดได้และเส้นทางเวกเตอร์ที่เปลี่ยนทิศทางย้อนกลับ) นี่คือการสนับสนุนห้องสมุดเปลี่ยนแปลงdeveloper.android.com/topic/libraries/support-library/...
Eugen Pechanec

-1

มี 2 ​​ตัวเลือก:

  1. คุณเปลี่ยนเวอร์ชันไลบรารีการสนับสนุนแล้วหรือยัง นี่เป็นปัญหาห้องสมุดคลาสสิกที่บางครั้งทรัพยากรไม่ได้ 'บันทึก' ด้วยชื่อเดียวกันหรือเลย ไม่ใช่คุณมันคือ Google ลองใช้การสนับสนุน lib 25 และดูว่าข้อผิดพลาดนี้ยังคงเกิดขึ้นหรือไม่
  2. พยายามทำความสะอาดโครงการและสร้างใหม่ บางทีคุณอาจเก็บไลบรารีเวอร์ชันเก่าไว้ในโฟลเดอร์ build ของคุณและเมื่อคุณสร้างโปรเจ็กต์ของคุณระบบจะใช้ค่าเก่าจากมัน

1
ขอบคุณสำหรับคำตอบสำหรับข้อ 2 ฉันเคลียร์เต็มหลายครั้งแล้ว สำหรับ 1. targetSdkVersion ของฉันคือ 26 Android Studio แสดงคำเตือนหากไม่กำหนดเป้าหมาย API ใหม่ล่าสุดและ Android Studio ยังแสดงข้อผิดพลาดหากฉันใช้ lib สนับสนุนเวอร์ชันเก่ากว่า targetSdkVersion
cn123h

1
ปัญหาเดียวกันหลังจากอัปเดตเป็น SDK 26
60

@ cn123h คุณใช้ไลบรารีการสนับสนุนเวอร์ชันใด
Sufian

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