Вывод окна 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;
                }
            }
        ...
Другие вопросы по тегам