uiautomator 原理 (UiAutomation、UiAutomatorBridge、QueryController)
UiAutomation
UiAutomation主要和AccessibilityService进行连接然后获取界面空间信息和注入事件,截图
获取界面空间信息:
public AccessibilityNodeInfo getRootInActiveWindow() { return this.mUiAutomation.getRootInActiveWindow(); }
注入事件:
public boolean injectInputEvent(InputEvent event, boolean sync) { return this.mUiAutomation.injectInputEvent(event, sync); }
截图:
Bitmap screenshot = this.mUiAutomation.takeScreenshot();
UiAutomatorBridge
UiAutomatorBridge相当于UiAutomation的代理,进行获取界面空间信息和注入事件,截图都需要经过UiAutomatorBridge
private boolean injectEventSync(InputEvent event) { return this.mUiAutomatorBridge.injectInputEvent(event, true); }
this.mUiAutomatorBridge.getRootInActiveWindow();
QueryController
QueryController做的所有事情就是去把UiSelector这个UI控件选择子翻译成真实的适合我们使用的Android.view.accessibility.AccessibilityNodeInfo
protected AccessibilityNodeInfo findAccessibilityNodeInfo(long timeout) { AccessibilityNodeInfo node = null; long startMills = SystemClock.uptimeMillis(); long currentMills = 0L; while (currentMills <= timeout) { node = getQueryController().findAccessibilityNodeInfo(getSelector()); if (node != null) { break; } UiDevice.getInstance().runWatchers(); currentMills = SystemClock.uptimeMillis() - startMills; if (timeout > 0L) { SystemClock.sleep(1000L); } } return node; }
UiDevice的实例化
private UiDevice(Instrumentation instrumentation) { this.mInstrumentation = instrumentation; UiAutomation uiAutomation = instrumentation.getUiAutomation(); this.mUiAutomationBridge = new InstrumentationUiAutomatorBridge(instrumentation.getContext(), uiAutomation);
分类:
Uiautomator
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?