我正在尝试列出Android设备上显示的所有UI元素。我通过在adb shell中运行"dumpsys window windows | grep "Window #来做到这一点,这给了我一个从窗口n到窗口0的窗口列表。
我想知道输出顺序是如何确定的。窗口n在堆栈的顶部,窗口0在堆栈的底部吗?另外,这些字段的含义是什么?例如,第一行如下所示
Window #64 Window{793212d u0 NavigationBar}:值793212d和u0表示什么?
发布于 2020-07-02 02:55:24
关于输出顺序:
关于字段:
通过System#identityHashCode.获取的
793212d是窗口的(唯一) IDu0是指窗口所属的用户ID。用户id与Unix UID不同,它是一个更高级的概念。Android将多个Unix UID分组为一个用户ID,即前100.000个Unix UID属于用户ID 0,依此类推(reference)。为了确定窗口的用户ID,安卓将查找窗口的Unix UID (每个应用程序都有自己的Unix UID),然后将Unix UID映射到用户ID。NavigationBar是窗口的标题。技术细节:在调用dumpsys window windows时,会在WindowManagerService (link)触发一个转储请求。该类有一个RootWindowContainer类型的成员mRoot,转储请求将被转发到该成员(link)。相关代码为:
forAllWindows((w) -> {
if (windows == null || windows.contains(w)) {
pw.println(" Window #" + index[0] + " " + w + ":");
w.dump(pw, " ", dumpAll || windows != null);
index[0] = index[0] + 1;
}
}, true /* traverseTopToBottom */);w的类型为WindowState,它覆盖toString以获得您在dumpsys输出(link)中看到的String表示。相关代码为:
mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
+ " u" + UserHandle.getUserId(mOwnerUid)
+ " " + mLastTitle + (mAnimatingExit ? " EXITING}" : "}");RootWindowContainer#forAllWindows方法遍历mChildren列表,该列表被指定为按z顺序(link,link):
// List of children for this window container. List is in z-order as the children appear on
// screen with the top-most window container at the tail of the list.
protected final WindowList<E> mChildren = new WindowList<E>(); boolean forAllWindows(ToBooleanFunction<WindowState> callback, boolean traverseTopToBottom) {
if (traverseTopToBottom) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
if (mChildren.get(i).forAllWindows(callback, traverseTopToBottom)) {
return true;
}
}
...https://stackoverflow.com/questions/44256755
复制相似问题