Gradle Managed Devices环境下ChromeCustomTab无法正常运行的问题
问题解决方案
一、ChromeCustomTab 触发 ActivityNotFoundException 问题
问题原因
你配置的google-atd系统镜像是Android官方推出的轻量测试专用镜像,为了提升测试速度,它精简了大量预装应用(包括Chrome浏览器),同时也弱化了系统WebView处理外部VIEW Intent的能力,导致你的测试找不到能匹配Intent的Activity。
解决方案
方案1:更换完整系统镜像
把GMD配置中的systemImageSource替换为包含完整预装应用的镜像(比如google_apis或default),这类镜像自带Chrome,能正常支持ChromeCustomTab功能:
testOptions { animationsDisabled = true managedDevices { devices { maybeCreate<ManagedVirtualDevice>("pixel2api30").apply { device = "Pixel 2" apiLevel = 30 systemImageSource = "google_apis" // 替换为完整镜像源 } } } }
方案2:适配ATD镜像的测试逻辑(若必须使用ATD)
由于ATD中没有Chrome,你的应用会自动 fallback 到WebView逻辑,此时需要调整测试代码,去掉对com.android.chrome包名的校验,甚至可以直接复用你WebView测试的逻辑(只验证Intent的Action和Data):
Intents.init() try { val expectedIntent = allOf( hasAction(Intent.ACTION_VIEW), hasData(Uri.parse(url)), ) // 点击触发按钮 intended(expectedIntent) } finally { Intents.release() }
如果你的WebView是应用内的自定义Activity,还可以添加对自身应用包名的校验,进一步精准匹配。
二、测试过快导致MockWebServer/Dispatcher失败问题
不要用Thread.sleep()这类硬等待,改用Espresso的同步机制更可靠:
- 使用MockWebServer自带的IdlingResource:如果用的是OkHttp的MockWebServer,它内置了IdlingResource,只需注册即可让Espresso自动等待网络请求完成:
val mockWebServer = MockWebServer() IdlingRegistry.getInstance().register(mockWebServer.idlingResource) - 自定义IdlingResource:针对应用内的异步操作(比如接口请求、UI渲染),可以实现
CountingIdlingResource,在异步任务开始时计数+1,结束时计数-1,让Espresso等待计数归0后再执行后续操作。 - 等待界面空闲:临时应急可以用以下代码让Espresso等待所有UI操作完成:
onView(isRoot()).perform(waitForIdle())
内容的提问来源于stack exchange,提问作者Skizo-ozᴉʞS ツ
相关产品推荐
相关产品推荐

