You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ツ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:22:19