cashapp / paparazzi

Render your Android screens without a physical device or emulator
https://cashapp.github.io/paparazzi/
Apache License 2.0
2.22k stars 210 forks source link

java.lang.NoClassDefFoundError: java/nio/charset/Charsets #1447

Closed ln-12 closed 1 month ago

ln-12 commented 1 month ago

Description I've used Paparazzi for quite some time now and it worked very well for me. Now I wanted to integrate it into a different project and get the following exception whenever I try to take a snapshot of a dialog composable. The snapshot for the exact same dialog composable from this new project works fine in the old project. Also, all snapshots for the other non-dialog composables are generated as expected. The snapshot test itself is just copied, so there is no difference there. I also looked through all gradle configs but could not spot any difference that could cause this issue. The previews in Android Studio look fine in all cases. Do you have any idea where this might come from? Or can you tell me what steps I can take to dig into the root cause?

java.lang.NoClassDefFoundError: java/nio/charset/Charsets
    at android.net.Uri.decode(Uri.java:1931)
    at android.net.Uri$AbstractPart.getDecoded(Uri.java:1961)
    at android.net.Uri$StringUri.getAuthority(Uri.java:583)
    at android.provider.Settings$ContentProviderHolder.getProvider(Settings.java:3075)
    at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:3293)
    at android.provider.Settings$Global.getStringForUser(Settings.java:16836)
    at android.provider.Settings$Global.getString(Settings.java:16819)
    at android.provider.Settings$Global.getInt(Settings.java:17036)
    at com.android.internal.policy.PhoneWindow.<init>(PhoneWindow.java:361)
    at android.app.Dialog.<init>(Dialog.java:208)
    at android.app.Dialog.<init>(Dialog.java:190)
    at androidx.activity.ComponentDialog.<init>(ComponentDialog.kt:42)
    at androidx.activity.ComponentDialog.<init>(ComponentDialog.kt:39)
    at androidx.compose.ui.window.DialogWrapper.<init>(AndroidDialog.android.kt:282)
    at androidx.compose.ui.window.AndroidDialog_androidKt.Dialog(AndroidDialog.android.kt:163)
    at androidx.compose.material3.AndroidAlertDialog_androidKt.BasicAlertDialog(AndroidAlertDialog.android.kt:157)
    at com.example.composables.DeleteListDialogKt.DeleteListDialog(DeleteListDialog.kt:24)
    at com.example.composables.ComposableSingletons$DeleteListDialogKt$lambda-1$1.invoke(DeleteListDialog.kt:78)
    at com.example.composables.ComposableSingletons$DeleteListDialogKt$lambda-1$1.invoke(DeleteListDialog.kt:77)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at com.example.common.compose.previews.PreviewScaffoldKt$PreviewScaffold$1$1.invoke(PreviewScaffold.kt:34)
    at com.example.common.compose.previews.PreviewScaffoldKt$PreviewScaffold$1$1.invoke(PreviewScaffold.kt:25)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.material3.SurfaceKt$Surface$1.invoke(Surface.kt:134)
    at androidx.compose.material3.SurfaceKt$Surface$1.invoke(Surface.kt:115)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at androidx.compose.material3.SurfaceKt.Surface-T9BRK9s(Surface.kt:112)
    at com.example.common.compose.previews.PreviewScaffoldKt$PreviewScaffold$1.invoke(PreviewScaffold.kt:23)
    at com.example.common.compose.previews.PreviewScaffoldKt$PreviewScaffold$1.invoke(PreviewScaffold.kt:22)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at com.example.common.compose.theme.TravelThemeKt$TravelTheme$1.invoke(TravelTheme.kt:48)
    at com.example.common.compose.theme.TravelThemeKt$TravelTheme$1.invoke(TravelTheme.kt:47)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
    at androidx.compose.material3.TextKt.ProvideTextStyle(Text.kt:352)
    at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:72)
    at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:71)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at androidx.compose.material3.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:64)
    at com.example.common.compose.theme.TravelThemeKt.TravelTheme(TravelTheme.kt:45)
    at com.example.common.compose.previews.PreviewScaffoldKt.PreviewScaffold-T042LqI(PreviewScaffold.kt:22)
    at com.example.composables.DeleteListDialogKt.DeleteListDialogPreview(DeleteListDialog.kt:75)
    at com.example.composables.ComposableSingletons$DeleteListDialogPreviewDefaultGroupDeleteListDialogPreviewKt$lambda-1$1.invoke(DeleteListDialogPreviewDefaultGroupDeleteListDialogPreview.kt:15)
    at com.example.composables.ComposableSingletons$DeleteListDialogPreviewDefaultGroupDeleteListDialogPreviewKt$lambda-1$1.invoke(DeleteListDialogPreviewDefaultGroupDeleteListDialogPreview.kt:15)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at com.example.paparazzi.ComposeSnapshotTest$takeSnapshot$1$2.invoke(ComposeSnapshotTest.kt:112)
    at com.example.paparazzi.ComposeSnapshotTest$takeSnapshot$1$2.invoke(ComposeSnapshotTest.kt:110)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at com.example.paparazzi.ComposeSnapshotTest$takeSnapshot$1.invoke(ComposeSnapshotTest.kt:102)
    at com.example.paparazzi.ComposeSnapshotTest$takeSnapshot$1.invoke(ComposeSnapshotTest.kt:100)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:428)
    at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252)
    at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:186)
    at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:119)
    at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:118)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
    at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:110)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:139)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:138)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:138)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:123)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
    at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
    at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:90)
    at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3302)
    at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:3235)
    at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:725)
    at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1071)
    at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
    at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
    at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1289)
    at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114)
    at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:164)
    at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:322)
    at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:199)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121)
    at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
    at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:1364)
    at android.view.View.dispatchAttachedToWindow(View.java:21980)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3490)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497)
    at android.view.ViewGroup.addViewInner(ViewGroup.java:5318)
    at android.view.ViewGroup.addView(ViewGroup.java:5104)
    at android.view.ViewGroup.addView(ViewGroup.java:5044)
    at android.view.ViewGroup.addView(ViewGroup.java:5016)
    at app.cash.paparazzi.PaparazziSdk.takeSnapshots(PaparazziSdk.kt:285)
    at app.cash.paparazzi.PaparazziSdk.snapshot(PaparazziSdk.kt:179)
    at app.cash.paparazzi.PaparazziSdk.snapshot$default(PaparazziSdk.kt:178)
    at app.cash.paparazzi.PaparazziSdk.snapshot(PaparazziSdk.kt:174)
    at app.cash.paparazzi.Paparazzi.snapshot(Paparazzi.kt:103)
    at app.cash.paparazzi.Paparazzi.snapshot$default(Paparazzi.kt:100)
    at com.example.paparazzi.ComposeSnapshotTest.takeSnapshot(ComposeSnapshotTest.kt:100)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at app.cash.paparazzi.Paparazzi$apply$1.evaluate(Paparazzi.kt:79)
    at com.google.testing.junit.testparameterinjector.PluggableTestRunner$ContextMethodRule$1.evaluate(PluggableTestRunner.java:433)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40)
    at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:60)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:52)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at jdk.proxy2/jdk.proxy2.$Proxy5.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
    at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: java.lang.ClassNotFoundException: java.nio.charset.Charsets
    ... 161 more

I also cannot convince gradle (yet) to display the full stack trace instead of just "... 161 more" at the end.

Steps to Reproduce Unfortunately, I could not reproduce this behavior in a fresh, minimal example...

Expected behavior No exception is thrown.

Additional information:

jrodbx commented 1 month ago

If I had to guess, your new project might be using a different JDK than the previous? Paparazzi requires projects to use JDK 11+

TWiStErRob commented 1 month ago

I also cannot convince gradle (yet) to display the full stack trace instead of just "... 161 more" at the end.

The 161 more is the long stack above it. Java, instead of repeating the stack for every exception, splits it up into chunks at points of throws. In this case it's a special exception, so it seems a CNFE immediately triggers a NCDFE.


To add to what John said above: https://developer.android.com/build/jdks