如何解决Paparazzi初始化Bridge失败导致测试无法运行的问题?
解决Paparazzi Compose测试「Failed to init Bridge」错误
问题背景
运行基础Paparazzi Compose测试时触发「Failed to init Bridge」错误,相关信息如下:
测试代码
package ........ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration import app.cash.paparazzi.Paparazzi import org.junit.Rule import org.junit.Test class HelloComposeTest { @get:Rule val paparazzi = Paparazzi() @Test fun compose() { paparazzi.snapshot { HelloPaparazzi() } } } @Suppress("TestFunctionName") @Composable fun HelloPaparazzi() { Column( Modifier .background(Color.White) .fillMaxSize() .wrapContentSize() ) { Text("Hello, Paparazzi") } }
错误栈
Failed to init Bridge. java.lang.IllegalStateException: Failed to init Bridge. at app.cash.paparazzi.internal.Renderer.prepare(Renderer.kt:94) at app.cash.paparazzi.PaparazziSdk.prepare(PaparazziSdk.kt:129) at app.cash.paparazzi.Paparazzi.prepare(Paparazzi.kt:89) at app.cash.paparazzi.Paparazzi$apply$1.evaluate(Paparazzi.kt:77) 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:54) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) 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:92) at jdk.proxy1/jdk.proxy1.$Proxy4.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:183) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) 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)
环境与配置
- Paparazzi版本:1.3.4
- 操作系统:14.4.1 (23E224) - Apple M3 Pro
- 编译SDK:34
- Gradle版本:8.10.0
- Android Gradle插件版本:8.4.2
- Kotlin版本:1.9.25
当前build.gradle.kts配置片段:
compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" }
解决方案
该错误源于Java版本、Compose依赖兼容性及Apple Silicon架构适配问题,按以下步骤逐一修复:
1. 升级Java版本至17
Paparazzi 1.x及以上版本在Apple Silicon平台上需要Java 17支持,修改build.gradle.kts中的编译配置:
compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" }
同时确保本地JDK切换为17,可通过java -version命令验证版本。
2. 对齐Compose Compiler与Kotlin版本
Kotlin 1.9.25对应的Compose Compiler版本应为1.5.11(当前使用的1.5.15对应Kotlin 1.9.24,版本不匹配会导致桥接初始化失败),更新配置:
composeOptions { kotlinCompilerExtensionVersion = "1.5.11" }
3. 添加Apple Silicon兼容配置
在项目根目录的gradle.properties文件中添加以下配置,确保Paparazzi在ARM架构上正常运行:
org.gradle.jvmargs=-Xmx2048m -Djava.awt.headless=true -Dapple.awt.UIElement=true paparazzi.testInstrumentationRunnerArguments.androidx.benchmark.suppressErrors=DEBUGGABLE
4. 升级Paparazzi至最新稳定版
将Paparazzi从1.3.4升级到最新稳定版(如2.1.0),新版本对Apple Silicon和高版本Gradle/AGP兼容性更好:
dependencies { testImplementation("app.cash.paparazzi:paparazzi:2.1.0") }
完成以上配置后,重新运行测试即可解决「Failed to init Bridge」错误。
内容的提问来源于stack exchange,提问作者dr.s
相关产品推荐
相关产品推荐

