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);

 

posted @   q55091  阅读(1388)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示