Android 为什么HierarchyViewer的FindViewByd速度如此之慢?

Android 为什么HierarchyViewer的FindViewByd速度如此之慢?,android,monkeyrunner,Android,Monkeyrunner,找到一些UI控件(例如按钮)需要5-6秒 两个问题: 1) 为什么这么慢 2) 是否有一种更快的方法或某种替代解决方案来查找UI控件(在monkeyrunner测试范围内)通常只需查找一次控件并将其存储在字段中就足够了 对于适配器视图,它们通常将对其子视图的所有引用存储在对象中,然后使用setTag()将该对象附加到视图。稍后,可以使用getTag()为同一视图检索它。您可以在网络中搜索ViewHolder示例以查看此技术 我怀疑它需要5-6秒,也许你有这么多的控件。,虽然不是更快,因为它依赖于

找到一些UI控件(例如按钮)需要5-6秒

两个问题:

1) 为什么这么慢


2) 是否有一种更快的方法或某种替代解决方案来查找UI控件(在monkeyrunner测试范围内)

通常只需查找一次控件并将其存储在字段中就足够了

对于适配器视图,它们通常将对其子视图的所有引用存储在对象中,然后使用setTag()将该对象附加到视图。稍后,可以使用getTag()为同一视图检索它。您可以在网络中搜索ViewHolder示例以查看此技术

我怀疑它需要5-6秒,也许你有这么多的控件。

,虽然不是更快,因为它依赖于与HierarchyViewer相同的协议,但可能提供一种更简单的编写测试的替代方法


请看下面的图片。还有一些情况下,AndroidViewClient为已知的monkeyrunner bug提供了解决方法(请参见此)

我仔细研究了一下Android源代码,发现当您在monkeyrunner中使用findViewById搜索控件时,它实际上会迭代Android中所有运行窗口上的所有控件

因此,如果您有一些活动因未销毁而暂停(且不可见),findViewById将花费时间搜索它

我现在有几个想法

a) 在HierarhyViewer上使用getFocusedWindowName API检查是否显示了正确的窗口。 尝试先搜索此窗口,然后在findViewById(id,parent)方法中将其指定为父窗口。这样,我们就不会在Android上搜索所有窗口

2) 尝试绕过com.android.chimpchat.hierarchyviewer.hierarchyviewer提供的接口,直接转到DeviceBridge类(该类为同一协议提供较低级别)。在这种情况下,我们可以精确地指出应该搜索哪个窗口,而不是获取所有窗口的所有控件


正如罗曼指出的那样。HierarchyViewer将来可能会发生变化。但是,作为测试自动化的一部分,我看不到任何其他替代品。

HierarchyViewer不打算用作测试工具。它的唯一目的是捕获整个视图层次结构以进行调试。它的协议是私有的,可以随时更改,因此您不应该依赖它。2罗曼:还有其他选择吗?Blackbox自动化测试(例如monkey runner)需要检查应用程序的UI状态。从4.1开始,您可以使用新的可访问性API。从4.2开始,您可以使用新的UI自动化测试框架。有关更多信息,请参见SDK发行说明,网址为2Romain:谢谢。我看了新闻稿。我一定要试试。5-6才是真正的价值。我在下面加上了我自己的答案。问题是,即使找到一个控件也需要5-6秒。因此,缓存(即将控件保存在字段中)没有帮助。