cashapp / paparazzi

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

Tests fail when including declare-styleable that references android attribute #1349

Closed ansman closed 6 months ago

ansman commented 6 months ago

Description We have a <declare-styleable /> in our project that references android:text. When the R file is loaded during the text a java.lang.ClassFormatError is thrown:

java.lang.ClassFormatError: Duplicate field name "Example_android_text" with signature "I" in class file com/example/R$styleable
        at java.base@21.0.1/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base@21.0.1/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
        at java.base@21.0.1/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base@21.0.1/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base@21.0.1/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base@21.0.1/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base@21.0.1/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base@21.0.1/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base@21.0.1/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at java.base@21.0.1/java.lang.Class.getDeclaredClasses0(Native Method)
        at java.base@21.0.1/java.lang.Class.getDeclaredClasses(Class.java:2489)
        at app//app.cash.paparazzi.internal.PaparazziCallback.initResources(PaparazziCallback.kt:60)
        at app//app.cash.paparazzi.Paparazzi.prepare(Paparazzi.kt:159)
        at app//app.cash.paparazzi.Paparazzi$apply$1.evaluate(Paparazzi.kt:145)

Steps to Reproduce Simply add this in src/main/res/values/example.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Example">
        <attr name="android:text"/>
    </declare-styleable>
</resources>

Expected behavior You should be able to run tests with this config.

Additional information:

We also have non transitive R classes enabled, not sure if that matters.

jrodbx commented 6 months ago

Duplicate of https://github.com/cashapp/paparazzi/issues/481

See suggested solution in https://github.com/cashapp/paparazzi/issues/481#issuecomment-1386484783.

cc: @aadamsdev for potential FAQ content