Вывод окна dumpsys
Я пытаюсь перечислить все элементы пользовательского интерфейса, отображаемые на устройстве Android. Я делаю это, запустив "dumpsys window windows | grep "Window #"в оболочке adb. Это дает мне список окон от окна n до 0.
Я хотел бы знать, как определяется порядок вывода. Окно n вверху и окно 0 внизу стека? Кроме того, что означают поля? Например, первая строка показана следующим образом
Window #64 Window{793212d u0 NavigationBar}:
Что обозначают значения 793212d и u0?
0 ответов
Относительно порядка вывода:
- Окна проходят сверху вниз в z-порядке, поэтому самые верхние окна идут первыми.
По поводу полей:
В
793212d
- (уникальный) идентификатор окна, полученный с помощью System #identityHashCode.В
u0
относится к идентификатору пользователя, которому принадлежит окно. Идентификатор пользователя не совпадает с UID Unix, это понятие более высокого уровня. Android группирует несколько UID Unix для принадлежности к одному идентификатору пользователя, т.е. первые 100000 UID Unix принадлежат идентификатору пользователя 0 и так далее (ссылка). Чтобы определить идентификатор пользователя окна, Android будет искать UID окна Unix (с каждым приложением, имеющим свой собственный UID Unix), а затем сопоставлять UID Unix с идентификатором пользователя.В
NavigationBar
это заголовок окна.
Технические подробности: при звонке dumpsys window windows
, это вызовет запрос дампа в WindowManagerService
(ссылка). У этого класса есть членmRoot
типа RootWindowContainer
, на который будет перенаправлен запрос дампа (ссылка). Соответствующий код:
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
получить String
представление, которое вы видите в dumpsys
вывод (ссылка). Соответствующий код:
mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
+ " u" + UserHandle.getUserId(mOwnerUid)
+ " " + mLastTitle + (mAnimatingExit ? " EXITING}" : "}");
В RootWindowContainer#forAllWindows
метод проходит через mChildren
список, указанный в z-порядке (ссылка, ссылка):
// 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;
}
}
...