question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Android Desugaring breaks serializating with NoClassDefFoundError

See original GitHub issue

Describe the bug When serializing with ObjectMapper#writeValueAsString() (and possibly other serialization methods) when Android’s new desugaring feature is enabled (coreLibraryDesugaringEnabled true), there’s a NoClassDefFoundError for java.util.function.Consumer. This does not occur when android’s desugaring is disabled.

Stacktrace:

java.lang.NoClassDefFoundError: java.util.function.Consumer
        at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
        at java.lang.Class.getDexCacheType(Class.java:479)
        at java.lang.reflect.ArtMethod.getDexCacheType(ArtMethod.java:236)
        at java.lang.reflect.ArtMethod.getParameterTypes(ArtMethod.java:176)
        at java.lang.reflect.Method.getParameterTypes(Method.java:174)
        at java.lang.Class.getDeclaredMethods(Class.java:802)
        at com.fasterxml.jackson.databind.util.ClassUtil.getClassMethods(ClassUtil.java:1172)
        at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector._addMemberMethods(AnnotatedMethodCollector.java:117)
        at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collect(AnnotatedMethodCollector.java:49)
        at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collectMethods(AnnotatedMethodCollector.java:40)
        at com.fasterxml.jackson.databind.introspect.AnnotatedClass._methods(AnnotatedClass.java:382)
        at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:322)
        at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:555)
        at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:323)
        at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getJsonValueAccessor(POJOPropertiesCollector.java:203)
        at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findJsonValueAccessor(BasicBeanDescription.java:252)
        at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.findSerializerByAnnotations(BasicSerializerFactory.java:396)
        at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.buildCollectionSerializer(BasicSerializerFactory.java:704)
        at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.buildContainerSerializer(BasicSerializerFactory.java:646)
        at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:196)
        at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:165)
        at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1474)
        at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1442)
        at com.fasterxml.jackson.databind.SerializerProvider.findPrimaryPropertySerializer(SerializerProvider.java:652)
        at com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap.findAndAddPrimarySerializer(PropertySerializerMap.java:72)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._findAndAddDynamic(BeanPropertyWriter.java:896)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:706)
        at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
        at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
        at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContentsUsing(CollectionSerializer.java:171)
        at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:116)
        at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)
        at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)
        at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
        at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
        at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4374)
        at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3629)
        at me.retrodaredevil.solarthing.android.prefs.saving.JacksonProfileHolder.getProfile(JacksonProfileHolder.kt:21)
        at me.retrodaredevil.solarthing.android.prefs.saving.BasicProfileManager.getActiveUUID(BasicProfileManager.kt:50)
        at me.retrodaredevil.solarthing.android.activity.ProfileHeaderHandler.<init>(ProfileHeaderHandler.kt:30)
        at me.retrodaredevil.solarthing.android.activity.SettingsActivity.onCreate(SettingsActivity.kt:83)
        at android.app.Activity.performCreate(Activity.java:6288)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
        at android.app.ActivityThread.access$900(ActivityThread.java:177)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5942)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "java.util.function.Consumer" on path: DexPathList[[zip file "/data/app/me.retrodaredevil.solarthing.android-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at libcore.reflect.InternalNames.getClass(InternalNames.java:53)
    	... 59 more
    	Suppressed: java.lang.ClassNotFoundException: java.util.function.Consumer
W/System.err:     at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
    		... 61 more
    	Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

To Reproduce Enable Android’s desugaring and try to serialize something on an older phone (this error doesn’t happen on newer phones)

Expected behavior Enabling desugaring should not break Jackson serialization.

Versions Kotlin: 1.3.72 Jackson-module-kotlin: 2.11.0, 2.11.1 Jackson-databind: 2.11.0, 2.11.1, 2.11.2-SNAPSHOT

Additional context If I disable Android’s desugaring, this error goes away. If you need more information, I’m happy to provide the class which I tried to serialize or the properties of the ObjectMapper. The objects I’m trying to serialize involve a few nested objects with generics, so posting the classes being serialized would involve posting a lot of classes. This is using Kotlin, but I don’t believe that the Jackson-module-kotlin is causing this.

I don’t really understand why Jackson feels the need to try and find the Consumer interface just because it might exist. I’d like to enable Android’s new desugaring features but I don’t really understand why this exception seems to be a side effect of doing that.

Issue Analytics

  • State:open
  • Created 3 years ago
  • Reactions:6
  • Comments:22 (9 by maintainers)

github_iconTop GitHub Comments

3reactions
vn01971commented, Jan 30, 2021

I’m still having the issue with com.fasterxml.jackson.core:jackson-databind:2.11.4 on Android API 21 devices with desugaring enabled.

com.applitools.eyes.android.common.exceptions.EyesException: Failed to connect to server 
     FATAL EXCEPTION: Thread-461
com.applitools.eyes.android.common.exceptions.EyesException: Failed to connect to server 
	at com.applitools.eyes.android.common.network.RestClient$1.run(RestClient.java:112)
	at java.lang.Thread.run(Thread.java:818)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Failed on call to `getDeclaredMethods()` on class `com.applitools.eyes.android.common.Properties`,
problem: (java.lang.NoClassDefFoundError) java.util.function.Consumer (through reference chain:
com.applitools.eyes.android.common.SessionStartInfoBody["startInfo"]->com.applitools.eyes.android.common.SessionStartInfo["properties"])
	at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1309)
	at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1447)
	at com.fasterxml.jackson.databind.SerializerProvider.findPrimaryPropertySerializer(SerializerProvider.java:652)
	at com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap.findAndAddPrimarySerializer(PropertySerializerMap.java:72)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._findAndAddDynamic(BeanPropertyWriter.java:896)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:706)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4409)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3663)
	at com.applitools.eyes.android.common.network.RestClient$1.run(RestClient.java:97)
	... 1 more
3reactions
cramptonismcommented, Oct 11, 2020

Also experiencing this issue after enabling coreLibraryDesugaringEnabled. Thanks for the detailed report.

Read more comments on GitHub >

github_iconTop Results From Across the Web

java.lang.NoClassDefFoundError: on Android 6 - Stack Overflow
Can anyone please comment what can be the issue? kotlinx.serialization libraries are not supported on Android 6? ... What's your Kotlin version?
Read more >
A brand new website interface for an even better experience!
Android Desugaring breaks serializating with NoClassDefFoundError.
Read more >
Android Studio 2021.3.1 Closed Issues
Running instrumented android tests via gradle fails to properly apply desugaring. Issue #247066500. AGP 7.3.0 breaks gradle sync for gradle platform ...
Read more >
java.lang.NoClassDefFoundError: j$.$r8$wrapper$java$util ...
android { compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 ......
Read more >
Android Data Serialization Tutorial with the Kotlin Serialization ...
Thus, decoding and deserialization are the opposites of encoding and serialization, respectively. The Kotlin object is broken down into ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found