paparazzi: Layoutlib Bridge initialization failed

Description I was not able to use the Paparazzi in my projects. I’m always getting the same error, it seems like Paparazzi is crashing during the rendering of my Composables. I’ve tried different types of combinations changing CompileSDK and lib version, but I’m always getting the same error.

Steps to Reproduce

Using compose version 1.1.1 and testing a simple button.

class PaparazziLinkButtonTest {
    @get:Rule
    val paparazzi = Paparazzi()

    @Test
    fun TestingSnap() {
        paparazzi.snapshot(name = "simpleLinkButton") {
            LinkButton(
                text = "Testing Paparazzi",
                onClick = {}
            )
        }
    }
}

It fails when I try to run the test with the message SEVERE: broken: Layoutlib Bridge initialization failed

Additional information:

  • Paparazzi Version: 1.0.0
  • OS: OS: MacOS 12.4.0
  • Compile SDK: 31
  • Gradle Version: 7.3.3
  • Android Gradle Plugin Version: 7.2.1
  • Compose version: 1.1.1

Log

Jul 06, 2022 4:00:48 PM app.cash.paparazzi.internal.PaparazziLogger error
SEVERE: broken: Layoutlib Bridge initialization failed
com.android.layoutlib.common.util.ReflectionUtils$ReflectionException: java.lang.reflect.InvocationTargetException
	at com.android.layoutlib.common.util.ReflectionUtils.invoke(ReflectionUtils.java:84)
	at com.android.layoutlib.common.util.ReflectionUtils.invokeStatic(ReflectionUtils.java:92)
	at com.android.layoutlib.bridge.Bridge.init(Bridge.java:239)
	at app.cash.paparazzi.internal.Renderer.prepare(Renderer.kt:84)
	at app.cash.paparazzi.Paparazzi.prepare(Paparazzi.kt:158)
	at app.cash.paparazzi.Paparazzi$apply$statement$1.evaluate(Paparazzi.kt:122)
	at app.cash.paparazzi.agent.AgentTestRule$apply$1.evaluate(AgentTestRule.kt:17)
	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:110)
	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:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	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 com.sun.proxy.$Proxy2.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:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	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.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at com.android.layoutlib.common.util.ReflectionUtils.invoke(ReflectionUtils.java:80)
	... 41 more
Caused by: java.lang.NoSuchMethodError: 'java.lang.String android.text.TextUtils.join(java.lang.CharSequence, java.lang.Object[])'
	at android.graphics.fonts.FontVariationAxis.toFontVariationSettings(FontVariationAxis.java:190)
	at android.graphics.FontListParser.readFont(FontListParser.java:269)
	at android.graphics.FontListParser.readFamily(FontListParser.java:191)
	at android.graphics.FontListParser.readFamilies(FontListParser.java:143)
	at android.graphics.FontListParser.parse(FontListParser.java:118)
	at android.graphics.fonts.SystemFonts.getSystemFontConfigInternal_Original(SystemFonts.java:244)
	at android.graphics.fonts.SystemFonts_Delegate.getSystemFontConfigInternal(SystemFonts_Delegate.java:65)
	at android.graphics.fonts.SystemFonts.getSystemFontConfigInternal(SystemFonts.java:244)
	at android.graphics.fonts.SystemFonts.getSystemPreinstalledFontConfig(SystemFonts.java:230)
	at android.graphics.Typeface.deferredStaticInitializer(Typeface.java:1395)
	... 46 more


Failed to init Bridge.
java.lang.IllegalStateException: Failed to init Bridge.
	at app.cash.paparazzi.internal.Renderer.prepare(Renderer.kt:83)
	at app.cash.paparazzi.Paparazzi.prepare(Paparazzi.kt:158)
	at app.cash.paparazzi.Paparazzi$apply$statement$1.evaluate(Paparazzi.kt:122)
	at app.cash.paparazzi.agent.AgentTestRule$apply$1.evaluate(AgentTestRule.kt:17)
	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:110)
	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:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	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 com.sun.proxy.$Proxy2.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:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)


About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Comments: 22

Most upvoted comments

For the compileSdk 32 issue, you can backport Paparazzi to use earlier platform versions in snapshot tests, like so:

    environment = detectEnvironment().copy(
      platformDir = "${androidHome()}/platforms/android-32",
      compileSdkVersion = 32
    ),

Yep I’m stumped, it’s not a minimal reproducible project but here is my setup: https://github.com/AdamMc331/TOA/pull/146

Hmm, well I was still getting the same issue after all. I guess we’ll see if one of the maintainers can weigh in in a bit. I’ll try to make a reproducible repo that has less fluff.

@AdamMc331 You should also try the 1.1.0-SNAPSHOT version.

@AdamMc331 Sure, let me try to explain what happened step-by-step.

  • In the project that I’m currently working on we have a module (android lib) with Composables. In this module, we have regular Snapshot tests for every component (by regular I mean androidTest).
  • I tried to add paparazzi in this module with the intent to migrate all our screenshot tests to paparazzi. I tried everything with no luck… Always the same error Layoutlib Bridge initialization failed.
  • After that, I create a new module (Snapshot-tests) and added the Paparazzi plugin to it… and it worked. I have no idea why, It has the same versions as the old module and it also has the old module as a dependency. So I can really explain why it works.

I hope that helps