DeviceBridge.java中,通过loadWindowData(Window window)返回一个ViewNode类
在这个方法中,通过DUMP+window.encode命令来获取到ViewNode,之前说过,在HierarchyViewer中的Activity总是被命名成Windows,即通过adb命令来获取指定的一个activity的ViewNode
1.1 关于ViewNode类,首先看一下构造函数
publicViewNode(Window window, ViewNode parent, String data)
三个参数的含义都十分明显
其中的data,格式是name@hash_code properties这样的格式,然后分别把name,hash_code,properties分离出来,其中properties被传入loadProperties(String data)方法中
接下来是介绍分割方法:
a.在ViewNode类中,还有一个Property类,存放了控件的名字和值,也就是在Hierarchy Viewer中的
b.分割方法其实很简单
首先找到“=”,之前的字符就是property.name;
接下来找到“,”,“,”到下一个空格之间的内容就是property.value
这里还是上代码比较清楚
do {
int index = data.indexOf('=',start);
ViewNode.Property property = newViewNode.Property();
property.name =data.substring(start, index);
int index2 = data.indexOf(',',index + 1);
int length =Integer.parseInt(data.substring(index + 1, index2));
start = index2 + 1 + length;
property.value = data.substring(index2+ 1, index2 + 1 + length);
properties.add(property);//list
namedProperties.put(property.name,property); //map
stop = start >= data.length();
if (!stop) {
start += 1;
}
} while (!stop);
所以,其实ViewNode类就是将get到的每个控件的信息进行解释
来总结一下HierarchyViewer对app的解析
1.获得目前已连接的设备,保存在IDevice[]中
2.对每个设备来说,通过”LIST”命令,获得当前活动的所有activity,并得到相应的hash_code
3.通过”DUMP hash_code”,获得某个具体的activity的信息,保存在ViewNode中,ViewNode在保存的时候已经确定了自己的父节点和内容,因此,其实到这里,一颗树形结构已经完成,至于放上的截图,是通过"CAPTURE " +window.encode() + " " + viewNode.toString()来获得的