用途:UiAutomator 是 AndroidX 测试框架中可跨进程驱动 UI 的方案,可操作设置、拨号器、系统通知、快捷设置、最近任务,以及分享面板、联系人选择器、相机等其它应用界面。Espresso 在事件跨到外部窗口时会抛 InjectEventSecurityException,而 UiAutomator 基于平台 AccessibilityNodeInfo 树,可看到所有窗口。
主要能力:通过 UiDevice 发送返回、Home、菜单、最近任务等硬键与全局动作,打开通知栏与快捷设置,唤醒或休眠设备;用 By 工厂构造 BySelector(text、textContains、textMatches、desc、res、clazz、pkg、depth、checkable、hasChild、hasDescendant、hasParent、hasAncestor 等,条件按隐式 AND 组合);用 device.findObject 解析为 UiObject2 并执行 click、longClick、setText、clear、swipe、scroll、scrollUntil、pinchOpen/Close;用 Until 条件等待异步 UI 状态(hasObject、gone、findObject、findObjects、newWindow 等)。
必要用法:依赖 androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")。必须用 UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) 获取实例,无参 getInstance() 已废弃且不可靠。跨窗口切换后先用 device.wait(Until.hasObject(By.pkg("...")), timeout) 等待目标包,再解析内部元素。持有 UiObject2 跨重组、转场或 RecyclerView 回收时需捕获 StaleObjectException 并重新查找。启动外部包优先用 Context.startActivity,API 30+ 需在 src/androidTest/AndroidManifest.xml 添加 <queries> 条目;executeShellCommand 已被标记为不推荐。若修改了 Configurator 的进程级设置,需在 @After 恢复;不要调用已废弃的 setKeyInjectionDelay。
适用场景:测试必须驱动系统 UI 或跨应用流程,或 Espresso 因外部窗口抛异常,或需调试 StaleObjectException 与缓存节点生命周期。
限制:若 UI 完全在自有应用内,Espresso 或 Compose 测试更快更可靠;运行器栈未搭建时应先完成 AndroidJUnit4 配置;仅需推送设备端状态或抓取日志时,应改用 adb 相关技能。具体平台与版本行为以官方文档为准。