95

So far I got this error only for one user, who uses a rooted phone (SM-G900R7 Android 4.4.2). The error is like this:

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)

I never use android.graphics.drawable.Icon in my code, all usages are from android.support.v4.graphics.drawable.IconCompat and I also never use that class in my code...

Btw my support library is version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Thanks

AskNilesh
  • 67,701
  • 16
  • 123
  • 163
cn123h
  • 2,302
  • 1
  • 21
  • 16

4 Answers4

40

Update

The issue is fixed in support library 27.0.0. If you update don't forget to change compileSdkVersion 27 as well.

What is happening?

Samsung devices with Android 4.4 crash like this when classes extending View define methods which return or take parameters of types that are not on classpath.

Starting with support library version 25.4.0 AppCompatImageView and AppCompatImageButton incorrectly overrides setImageIcon(Icon) method. Since Icon class was introduced in API 23 the app crashes on Samsung devices with API 19.

Similar thing happens when you try to override View.onApplyWindowInsets(WindowInsets).

Workaround for support library 26.1.0

Until this gets fixed in an official manner, If you're stuck with an older version of the support library, I made a modified version of appcompat-v7 where all traces of setImageIcon methods are removed. This means it won't crash on a Samsung with Android 4.4.

Put this at the bottom of your app's 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'
        }
    }
}

This code will replace appcompat-v7 dependency with the described modified artifact.

Currently the only supported version of the fix is 26.1.0.

Warning: Understand the code before copy-pasting, and always exercise caution when getting code from unknown sources!

Eugen Pechanec
  • 37,669
  • 7
  • 103
  • 124
  • what will happen in the future if I must update the support library to > 26.1.0? I think your fix will be obsolete, right? – Dika Oct 17 '17 at 03:19
  • 2
    @Dika No worries, it should be fixed in the next release. – Eugen Pechanec Oct 17 '17 at 04:15
  • I'm using 26.0.2 and got this crash. Will your fix work on that version? – Chisko Oct 25 '17 at 18:20
  • 1
    @Chisko Don't use multiple versions of different support libraries. I think you can safely update all your support libs to 26.1.0. The fix is only released for that one version. – Eugen Pechanec Oct 25 '17 at 18:43
  • I'm not, why the advice though? I will update and use your fix, thanks – Chisko Oct 25 '17 at 18:49
  • 1
    @Chisko it's just force of habit. Many people don't know that support libraries are interconnected and may crash if different versions are used. Just making sure that you do :) – Eugen Pechanec Oct 25 '17 at 18:54
  • It is not fixed in the support lib 27.0.0 After app update I got the same crash in crashlytics with target 27, compile 27, and support lib 27.0.0 – Alex Nov 15 '17 at 07:47
  • 1
    @Alex I just went through the source of AppCompat 27.0.0 and it is correct. Two options: 1) Somehow you're still using older support library. [Check your resolved dependencies.](https://stackoverflow.com/questions/21645071/using-gradle-to-find-dependency-tree) 2) The same exception is thrown elsewhere and because of a different class. Can you share the crash report or the stack trace? I'll look into it. – Eugen Pechanec Nov 15 '17 at 08:53
  • Sorry for the confusion. I have a similar issue, but somewhere else (ViewDebug.dumpviewProperties). I didn't pay enough enough attention, it was too early. Thank you pointing out my mistake – Alex Nov 15 '17 at 08:56
  • @Alex It's the same exception and the same reason - using new classes in view methods on old devices. Can you pinpoint it to your own code? Otherwise it may have come from another place in support library. In that case I'd like to see the first line, the one that says which class was referenced. – Eugen Pechanec Nov 15 '17 at 09:11
  • @EugenPechanec Can't pinpoint it. Based on the crashlytics log it doesn't link to any specific part of our code. Caused by java.lang.ClassNotFoundException: Didn't find class "android.view.ViewStructure" on path: ... The device i got the report from is a Samsung S5 running 4.4.2 and possibly rooted. Tired to reproduce it on both Android Emulator and Genymotion and couldn't. For us the issue is happening for only one user, also happened once, so maybe he/she stopped trying or it doesn't crash anymore?!? but usually after every update I can see crash coming up and I hate unfixed crashes... – Alex Nov 15 '17 at 09:32
  • If you're having trouble after changing the sdk version, it might help to 'clean project' and try again – 11m0 Apr 06 '18 at 21:21
14

This issue was resolved in support library 27.0.0:

Android Gradle Plugin 3.x:

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

Android Gradle Plugin 2.x:

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

Note that you will also need to compile against SDK level 27.

Paul Lammertsma
  • 37,593
  • 16
  • 136
  • 187
1

This crash related to 25.4.0 version of support library.

Use 25.3.1 version.

Replace

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

With:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
phnmnn
  • 12,813
  • 11
  • 47
  • 64
  • Worth noting that this locks you down to `compileSdkVersion 25`, no Android O APIs and no support library features introduced since 25.4.0 (e.g. tinting image view drawables and vector path morphing backport). Here's the support library changelog https://developer.android.com/topic/libraries/support-library/revisions.html – Eugen Pechanec Oct 15 '17 at 18:04
-1

There are 2 options :

  1. Have you changed the support library version ? this is quite classic library issue when the resources sometimes aren't 'saved' with the same name, or at all. Its not you, its google. Try to use support lib 25, and see if this error still occurs.
  2. Try to clean the project and rebuild. Maybe you're kept with some old library versions in your build folder, and when you build your project it takes old values from it.
Dus
  • 4,052
  • 5
  • 30
  • 49
  • 1
    thank you for answer, for 2. I did full gradle clear many times. for 1. my targetSdkVersion is 26, Android Studio shows warn if not target the newest API and Android Studio also shows error if I use older version of support lib than targetSdkVersion. – cn123h Aug 09 '17 at 07:25
  • 1
    Same problem after updating to SDK 26. – amouly Aug 22 '17 at 16:12
  • @cn123h which version of support library are you using? – Sufian Sep 20 '17 at 09:05
  • @amouly and your support lib version is? – Sufian Sep 20 '17 at 09:05