아티클

안드로이드 접근성 트리 디버깅 2부, 디버깅하기

2020-01-29 11:35:35

안녕하세요, 엔비전스입니다.

‘안드로이드 앱 접근성 트리 디버깅하기 1부’에서는 안드로이드 네이티브 앱에서의 접근성 진단을 위해 디버깅이 필요한 이유와 디버깅 예시, 그리고 디버깅의 장점에 대해 살펴보았습니다. 본 아티클에서는 디버깅을 하기 위한 TalkBack 환경설정, 실질적인 디버깅 방법, 디버깅의 한계 및 주의사항에 대해 살펴보도록 하겠습니다.

 

디버깅을 위한 TalkBack 환경설정

접근성 트리에 대한 정보를 확인하려면 TalkBack에서 다음과 같은 환경 설정을 해 주어야 합니다.

  1. 접근성 노드 트리 인쇄 제스처 할당.
  2. 로그 출력 수준을 verbose로 설정.
  3. 노드 트리 디버깅 사용에 체크.
  4. AccessibilityEvent logging 필터(한글로는 접근성 일정 로깅으로 번역됨) 하위 옵션에서 원하는 이벤트 선택.

아래는 각 설정에 대한 자세한 설명입니다.

 

TalkBack 제스처에 노드 트리 디버깅 인쇄 할당하기

TalkBack에서는 우리가 항상 사용하는 한 손가락 오른쪽 쓸기, 한 손가락 왼쪽 쓸기와 같은 기본적인 제스처 외에도 화면 탐색 단위 변경, 화면 스크롤, TalkBack 글로벌 메뉴 열기 등 여러 제스처를 가지고 있으며 이러한 제스처들 중 일부는 사용자가 직접 변경할 수 있습니다. 또한 TalkBack의 제스처를 변경하지 않았다면 제스처로 컨트롤할 수 있는 모든 기능이 제스처에 다 할당되어 있지 않으며 일부 기능은 사용자가 비어 있는 제스처에 해당 기능을 할당해 주어야 합니다. 예를 들어 개발자가 특정 객체에 AccessibilityAction 클래스를 이용한 커스텀 액션을 구현하였다면 TalkBack에서는 커스텀 액션을 실행하기 위해 커스텀 액션 리스트를 바로 보여주는 기능을 제공하지만 이 기능은 기본적으로 제스처에 할당되어 있지 않아 사용자가 커스텀 액션 작업 메뉴 보기에 해당하는 기능을 제스처로 할당해 주어야 합니다.

그런데 AccessibilityNodeTree 디버깅도 마찬가지입니다. 기본적으로 특정 객체에 대한 디버깅을 하기 위해서는 TalkBack에서 노드 트리 디버깅 인쇄하기 기능을 실행해야 하는데 이 기능도 기본적으로 제스처에 할당되어 있지 않아 사용자가 원하는 제스처에 할당을 해 주어야 한다는 것입니다. 방법은 다음과 같습니다.

  1. TalkBack을 실행하지 않았다면 접근성 단축키 혹은 접근성 설정에서 TalkBack을 실행합니다. 접근성 디버깅을 위해서는 반드시 TalkBack이 실행 중이어야 합니다. 
  2. 음성 안내 지원 설정 하위의 ‘동작’으로 진입합니다. 여기서 할당된 제스처 확인 및 변경, 추가가 가능합니다.
  3. 제스처 리스트 중 할당되지 않은 제스처를 선택합니다. 저는 오른쪽 위쪽 제스처를 선택하였습니다.
  4. 기능 리스트 중에서 ‘인쇄 노드 트리’를 선택합니다. 이렇게 하면 디버깅을 위한 제스처 할당은 완료된 것입니다.

다음으로는 접근성 노드 출력을 위한 개발자 설정입니다.

  1. 현재 위치한 ‘동작’ 화면에서 이전 화면으로 이동한 후 ‘개발자 설정’으로 진입합니다.
  2. 로그 출력 수준은 반드시 ‘verbose’로 설정합니다. 여기서의 로그는 사용자가 디버깅을 요청할 시의 TalkBack에서 내보내는 텍스트를 가리킵니다.
  3. 노드 트리 디버깅은 ‘사용’으로 체크합니다.
  4. ‘접근성 일정 로깅’은 일정이 아니라 이벤트를 가리키는 것으로 번역상 오류로 보입니다. 말 그대로 1부에서 언급한 것처럼 사용자의 제스처, 앱 동작 등에 따라 수많은 접근성 이벤트가 발생하게 되는데 여러 이벤트 중에 어떤 이벤트를 로그에 출력할 것인지를 선택하는 필터 화면입니다. 원하는 이벤트를 선택해줍니다.

마지막으로 스마트폰 환경설정의 개발자 설정으로 진입하여 USB 디버깅을 사용 체크해 줍니다.

위의 옵션들을 다 설정하셨다면 이제 디버깅을 할 모든 준비를 마쳤습니다. 이제 본격적으로 접근성 노드 트리 디버깅을 실습해 보겠습니다.

 

접근성 노드 트리 디버깅을 위한 준비사항

  1. 터미널 프로그램: 안드로이드 접근성 노드 트리 디버깅을 위해서는 반드시 커맨드라인 화면을 사용해야 합니다. 윈도에서는 기본으로 탑재된 CMD 혹은 PowerShell이 이에 해당하며 익숙한 터미널 프로그램이 있다면 이를 이용하셔도 됩니다. 본 아티클에서는 윈도에서 범용적으로 사용되고 있는 CMD를 통해 사용하는 법을 설명하도록 하겠습니다.
  2. 안드로이드 ADB 매니저: ADB 매니저는 스마트폰에 있는 안드로이드 앱을 디버깅하는 SDK이며 안드로이드 스튜디오를 설치하면 기본적으로 SDK에 추가됩니다. 접근성 노드 트리 디버깅을 위해서는 ADB 매니저가 필수적으로 필요하며 안드로이드 스튜디오를 사용하지 않을 경우 ADB 매니저를 자체적으로 다운로드하여 사용할 수 있습니다.
  3. ADB 매니저를 ADB 매니저가 위치한 폴더가 아닌 다른 폴더에서도 실행되게 하려면 윈도에서 환경 변수 설정을 해 주어야 합니다. 환경 변수를 설정하지 않은 경우 반드시 ADB가 위치한 폴더로 이동해야만 ADB 실행이 가능합니다. 환경 변수 설정에 대한 자세한 방법은 ‘모바일 웹 브라우저에서 접근성 이슈 디버깅하기’ 아티클을 참고해 주시기 바랍니다.
  4. 메모장이나 기타 에디터: 안드로이드 접근성 노드 트리 디버깅을 실행하면 원하는 객체만 디버깅하지 않고 화면 전체의 모든 객체를 디버깅하게 됩니다. 따라서 문자열 검색을 자주 활용하는 것이 효율적일 수 있으며 그렇게 하기 위해 디버깅 결과가 텍스트 파일로 저장되게 하여 문서 편집기에서 디버깅 결과를 확인하는 것이 효율적일 수 있습니다. 윈도의 기본적인 메모장을 사용해도 되지만 Notepad++와 같은 도구를 사용하면 Notepad++ 창을 다른 창으로 전환했다가 다시 해당 창으로 돌아올 때 디버깅 텍스트 파일에 바뀐 정보가 있다면 파일을 자동으로 다시 불러올 것인지 물어보므로 메모장보다 확인이 조금 더 용이할 수 있습니다.

객체 디버깅하기

1부 아티클에서 설명한 바와 같이 접근성 디버깅은 객체 디버깅과 이벤트 및 접근성 노드의 자세한 정보를 포함한 디버깅으로 나눌 수 있으며 아래는 객체 디버깅을 하기 위한 설명입니다.

  1. 스마트폰과 윈도 PC를 USB로 연결한 다음 명령 프럼프트로 이동합니다. 일반적으로 시작을 눌러 검색어에 cmd를 입력하면 명령 프럼프트가 검색 결과로 표시되며 명령 프럼프트를 통해 진입할 수 있습니다.
  2. 기본적으로 cmd에 진입하면 폴더 위치는 c:users사용자 계정 폴더가 됩니다.
  3. adb가 위치한 폴더로 이동합니다. 환경변수가 이미 설정되어 있다면 이 과정은 생략할 수 있습니다. adb가 설치된 폴더로 들어간 다음 Ctrl + L를 눌러 탐색기 주소창에 초점을 보내면 경로 텍스트가 전체 선택되며, 이를 복사하여 Shift + Insert 또는 Ctrl + V로 붙여 넣어 이동하면 간편합니다.
  4. adb logcat TreeDebug *:s > c: esult.txt 입력 후 엔터를 누릅니다. 여기서> 뒤의 파일명은 필수는 아니며 adb logcat TreeDebug *:s만 입력하면 디버깅되는 내용이 현재 화면, 즉 명령 프럼프트에만 표시되고 > 뒤에 파일명을 함께 적어주게 되면 디버깅되는 내용이 현재 명령 프럼프트 화면에는 표시되지 않고 사용자가 적은 파일명으로 저장되게 됩니다.
  5. 객체 디버깅을 할 준비가 완료되었으므로 스마트폰에서 디버깅을 하고자 하는 화면으로 이동한 다음 앞서 설정한 노드 트리 인쇄 제스처를 수행합니다. 그러면 화면 전체의 각 요소 트리가 인쇄되며 파일로 저장을 선택한 경우에는 해당 저장된 경로로 이동하여 텍스트 파일을 열어보면 1부에서 샘플로 기술한 것 같은 디버깅 관련 정보들이 표시되게 됩니다.
  6. 노드 트리를 인쇄하면 한 화면 전체 요소가 다 디버깅 로그로 표시되므로 화면의 텍스트를 notepad++와 같은 텍스트 편집기에서 문자열 찾기를 이용하여 검색함으로써 최대한 디버깅하고 싶은 요소를 빠르게 찾을 수 있습니다. 혹은 현재 사용자가 검색하고 싶은 객체에 TalkBack 포커스를 위치하고 디버깅 하면 accessibilityFocused가 해당 객체에 삽입되므로 문자열 찾기 검색 키워드에 ‘accessibilityFocused’를 검색하여 조금 더 빠르게 정보를 찾을 수 있습니다.

 

접근성 이벤트 디버깅하기

  • 아티클에서도 언급하였지만 접근성 이벤트 디버깅은 객체 디버깅과는 달리 실시간으로 일어나는 모든 이벤트가 다 로그에 기록되므로 정보 검색에 많은 어려움이 있습니다. 그럼에도 객체 디버깅만으로 다 출력되지 않는 각종 이벤트 및 툴팁 텍스트 정보와 같은 추가적인 노드 정보가 출력되므로 필요시 다음과 같이 활용할 수 있습니다.
  1. CMD 명령 프럼프트에서 adb logcat TreeDebug > c: esult.txt 와 같이 입력합니다. 여기서 객체 디버깅과 다른 점은 TreeDebug 뒤에 *:s 옵션이 붙지 않으며 객체 디버깅은 노드 트리 인쇄 제스처를 수행해야만 디버깅이 되는 것과는 달리 이벤트 디버깅은 실행 즉시 수많은 로그들이 쌓이게 된다는 것입니다.
  2. 여기서 우리는 접근성 노드 정보나 이벤트에 대한 로그를 확인하는 것이 목적이므로 이중 탭 혹은 스크롤 등을 통해 디버깅하고자 하는 원하는 이벤트를 발생시키거나 접근성 노드를 확인하고자 하는 곳에 포커스 합니다.
  3. Notepad++와 같은 편집기를 이용하여 txt 파일을 엽니다. 그러면 정말 수많은 로그들이 있습니다.
  4. 문자열 찾기를 이용하여 관련 디버깅 로그 내용을 확인합니다. 이때 검색어 키워드는 최대한 디버깅하고 싶은 문자를 찾아 관련 있는 텍스트를 찾도록 합니다.

 

접근성 트리 디버깅 시 주의사항

  1. 객체 디버깅 시 개발자가 AccessibilityNodeInfo 자체의 class name을 현재 컨트롤과 다르게 변경했을 경우 객체 디버깅 로그에서는 원래의 위젯 컨트롤이 아닌, AccessibilityNodeInfo에서 변경한 class name이 컨트롤로 표시됩니다. 예를 들어 원래의 컨트롤은 스위치이지만 AccessibilityNodeInfo에서 className을 RadioButton으로 변경하였다면 트리 디버깅에서의 컨트롤 유형은 라디오 버튼이 됩니다. 이것은 해당 디버깅 자체가 접근성에 대한 트리 디버깅이기 때문입니다.
  2. 이벤트 디버깅 시 로그로 출력되는 이벤트 유형은 이벤트 유형에 대한 코드를 직접 사용한 것이 아니라 시스템 자체에서 발생시킨 이벤트입니다. 예를 들어 특정 객체를 이중 탭했더니 TalkBack에서 ‘키보드 표시됨’이라는 메시지를 출력했다면 접근성 로그에서의 해당 이벤트는 ‘TYPE_VIEW_ANNOUNCEMENT’입니다. 그러나 실제로는 announceForAccessibility 메서드를 사용한 것이며 해당 메서드를 통해서 시스템에서 TYPE_VIEW_ANNOUNCEMENT 이벤트를 발생시킨 것입니다.

 

지금까지 2부에 걸쳐 접근성 트리 디버깅에 대해 살펴보았습니다. 해당 아티클이 안드로이드 접근성 이슈를 테스트 하는데 조금이나마 도움이 되었으면 합니다.

댓글 0
댓글을 작성하려면 해주세요.