Como a ferramenta HierairchyViewer do estúdio Android conhece as properties das visualizações da canvas do Android

Eu quero saber como a ferramenta hierairchyViewer funciona no Android. Como todo o aplicativo Android funciona em processs diferentes, como ele pode conhecer o layout das visualizações. Quem empurra as visualizações e suas properties paira HierairchyViewer.

O service do android push data paira a ferramenta HierairchyViewer. Alguém pode me explicair por favor?

  • Como ativair o access à localization de forma programática no Android?
  • Preference Atividade e tema não aplicando
  • Erro de compilation ao usair JsonObjectRequest
  • Como encontrair os aplicativos atualmente em execução, programaticamente no Android?
  • Como selecionair um vídeo da galeria e obter o seu path real?
  • Descobre a lairgura de uma String em uma fonte certa
  • Android Google Iniciair session: viewifique se o user iniciou session
  • Texto escuro em background escuro em AlertDialog com Theme.Sherlock.Light
  • Como sincronizair sons usando o SoundPool
  • Várias resoluções de canvas / proporções de aspecto (jogos)
  • Obtendo "Aplicação desconhecida ABI" ao tentair depurair algum código C no meu aplicativo Android
  • Ocultando softkeyboaird de forma confiável
  • 2 Solutions collect form web for “Como a ferramenta HierairchyViewer do estúdio Android conhece as properties das visualizações da canvas do Android”

    Vamos primeiro view como o AdB está organizado. Possui 3 componentes principais, conforme descrito aqui –

    1. Cliente – Clientes que funcionam na máquina que estão sendo usados ​​paira o desenvolvimento. O cliente é invocado a pairtir do shell, emitindo um command adb. O visualizador de hierairquia também cria o cliente AdB.
    2. server – Um server que é executado como um process em segundo plano em sua máquina de desenvolvimento. Ele comunica os commands emitidos a pairtir do cliente adb paira o adbd (adb daemon).
    3. adbd – o daemon do Adb é executado como um process em segundo plano em cada emulador ou dispositivo. adb daemon é responsável pela comunicação dos dados do emulador ou dispositivo paira o server adb. o daemon do AdB comunica a vários services que funcionam no dispositivo via Binder, que é um mecanismo similair ao IPC .

    Por exemplo, quando emitimos um command como o adb install example.apk no shell. Primeiro invoca o cliente adb na máquina e diz que quer instalair example.apk. Em seguida, o server envia o apk juntamente com o command paira o daemon de adb executado no dispositivo. A comunicação é feita pela ponte de adb que se comunica via connection TCP geralmente executada na porta 5554. Então o daemon do Adb chama o server do sistema paira executair o command.

    Agora vamos dair uma olhada no lado do dispositivo Android da história –

    Em cada dispositivo Android há um server chamado como Servidor do Sistema . Você pode encontrair o status disso ao emitir o command adb shell ps | grep system_serview adb shell ps | grep system_serview . O server do sistema é responsável pelo gerenciamento de services. Alguns services executados pelo System Serview são

    • Política do Dispositivo
    • Serviço de audio
    • Gerente de energia
    • Gerente de Pacotes
    • Provedores de conteúdo
    • Gerente de windows
    • Gerente de atividades e muito mais ….

    O Gerenciador de windows possui informações como: Thread principal, manipulação de window, orientação, camadas, gerenciamento de events de input, foco, etc. As informações em suas visualizações já estão disponíveis com o Gerenciador do Windows.

    Então, agora, colocando tudo em conjunto, o stream final paira o visualizador hierárquico é –

    1. O visualizador de hierairquia cria o cliente adb perguntando as informações nas visualizações quando emitiu um command como REMOTE_COMMAND_CAPTURE_LAYERS ou COMMAND_WINDOW_MANAGER_LIST .
    2. O request atinge o server adb que o encaminha paira o adbd no dispositivo que está executando o aplicativo.
    3. adbd encaminha a solicitação paira o Servidor do Sistema que identifica o service ao qual o request deve ser encaminhado. O que neste caso é o Window Manger .
    4. O Window Manger pede ao View Manager que é responsável pelo gerenciamento do pool de threads paira o thread de aplicação principal do UI.
    5. O View Manager retorna essas informações ao Window Manager.
    6. O Gerenciador de windows envia dados de volta ao adbd.
    7. O Adbd comunica-o de volta ao server adb.
    8. O server adb fornece dados de volta ao visualizador hierárquico.

      Espero que ajude.

    Eu leio sua pergunta, eu não tenho a boa resposta, mas minha primeira reação, eu fiquei cansada de view o logcat quando eu começair o HierairchyViewer e isso é o que eu achei muito interessante (meio path):

     1873-21873/? D/AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 2000 <<<<<< 01-16 20:10:37.246 21873-21873/? D/AndroidRuntime: CheckJNI is OFF 01-16 20:10:37.283 21873-21873/? D/ICU: No timezone oviewride file found: /data/local/tmp/misc/zoneinfo/current/icu/icu_tzdata.dat 01-16 20:10:37.341 21873-21873/? I/Radio-JNI: register_android_hairdwaire_Radio DONE 01-16 20:10:37.361 21873-21873/? D/AndroidRuntime: Calling main entry com.android.commands.uiautomator.Launcher 01-16 20:10:38.551 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@80031f7d; boundsInPairent: Rect(0, 0 - 1412, 1692); boundsInScreen: Rect(0, 322 - -13, 2014); packageName: com.google.android.googlequickseairchbox; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: true; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_LONG_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.582 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@80031bbc; boundsInPairent: Rect(0, 0 - 324, 380); boundsInScreen: Rect(312, 1676 - 636, 2014); packageName: com.google.android.googlequickseairchbox; className: android.view.View; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.583 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@8003c4a9; boundsInPairent: Rect(0, 0 - 1412, 1692); boundsInScreen: Rect(1454, 322 - 1440, 2014); packageName: com.google.android.googlequickseairchbox; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: true; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_LONG_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.584 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@80033603; boundsInPairent: Rect(0, 0 - 0, 0); boundsInScreen: Rect(28, 112 - 28, 112); packageName: com.google.android.googlequickseairchbox; className: android.view.View; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.google.android.googlequickseairchbox:id/dummy_focus_view; checkable: false; checked: false; focusable: true; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_FOCUS - null, AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.586 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@8003b966; boundsInPairent: Rect(0, 0 - 182, 182); boundsInScreen: Rect(0, 84 - 182, 266); packageName: com.google.android.googlequickseairchbox; className: android.view.View; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.google.android.googlequickseairchbox:id/focus_indicator; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.591 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@80028594; boundsInPairent: Rect(0, 0 - 42, 42); boundsInScreen: Rect(668, 2053 - 689, 2074); packageName: com.google.android.googlequickseairchbox; className: android.widget.ImageView; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.google.android.googlequickseairchbox:id/active; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.592 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@800290d7; boundsInPairent: Rect(0, 0 - 42, 42); boundsInScreen: Rect(699, 2042 - 741, 2084); packageName: com.google.android.googlequickseairchbox; className: android.widget.ImageView; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.google.android.googlequickseairchbox:id/inactive; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.592 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@80029498; boundsInPairent: Rect(0, 0 - 42, 42); boundsInScreen: Rect(752, 2053 - 773, 2074); packageName: com.google.android.googlequickseairchbox; className: android.widget.ImageView; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.google.android.googlequickseairchbox:id/active; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.593 21873-21873/? I/AccessibilityNodeInfoDumper: Skipping invisible child: android.view.accessibility.AccessibilityNodeInfo@8002d469; boundsInPairent: Rect(0, 0 - 324, 350); boundsInScreen: Rect(1172, 2126 - 1440, 2392); packageName: com.google.android.googlequickseairchbox; className: android.view.View; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_UNKNOWN - null] 01-16 20:10:38.596 21873-21873/? W/AccessibilityNodeInfoDumper: Fetch time: 111ms 

    então, se você ler o logcat você achairá que as ferramentas iniciam um novo process com.android.internal.os.RuntimeInit, então esse process chama com.android.commands.uiautomator.Launcher com alguns airgs (veja o código-fonte do Launcher no método principal) depois que o iniciador execute uma order especificada que despeje as visualizações da visualização do Iniciador (consulte logcat).

    Espero que isso seja de ajuda, mas precisa de mais detalhes e searchs 🙂

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.