1. 안드로이드 화면 제어의 심장: 접근성 서비스(AccessibilityService)란?
스마트폰 원격 제어 솔루션이 단순히 화면을 보여주는 '화면 미러링(Screen Mirroring)'을 넘어, PC에서 마우스를 클릭하거나 드래그했을 때 실제 스마트폰에서 터치 이벤트가 발생하도록 만드는 핵심 기술의 중심에는 구글 안드로이드 OS의 '접근성 서비스(AccessibilityService)' API가 있습니다.
원래 접근성 서비스는 시각 장애인이나 신체 운동 장애가 있는 사용자가 음성 안내(TalkBack)를 듣거나 스위치 제어(Switch Access) 장치를 통해 스마트폰을 조작할 수 있도록 돕기 위해 안드로이드 1.6 시절부터 도입된 시스템 레벨의 강력한 프레임워크입니다. KODARI가 루팅(Rooting)이나 제조사 서명 없이 순수 표준 안드로이드 환경에서 매끄러운 원격 터치와 제스처를 구현하는 기술적 원리와 내부 메커니즘을 심층 분석합니다.
2. 가상 터치 이벤트 주입: dispatchGesture API의 정밀 분석
안드로이드 7.0(API 레벨 24) 이상부터 구글은 접근성 서비스 내에 서드파티 앱이 제스처를 프로그래밍 방식으로 화면에 주입할 수 있는 혁신적인 'dispatchGesture()' 메서드를 공식 추가했습니다.
- 좌표 변환 파이프라인:
- 웹 브라우저 마우스 좌표 수집: 관리자가 브라우저 모니터 화면의 비디오 태그 위에서 마우스 클릭(X, Y)을 발생시킵니다.
- 해상도 정규화 (Normalization): 브라우저 비디오 요소의 렌더링 크기와 실제 원격 스마트폰의 물리 해상도(예: 1080 x 2400) 간의 종횡비 비율을 계산하여 절대 픽셀 좌표로 변환합니다.
- 웹소켓 바이너리 패킷 전송: 정규화된 터치 다운, 무브, 업 좌표가 경량 바이너리 패킷으로 압축되어 단말기에 도달합니다.
- GestureDescription 빌드 및 디스패치: 안드로이드 네이티브 서비스에서 Path 객체를 생성하고 'Path.moveTo(x, y)' 및 'StrokeDescription'을 구성한 후 'dispatchGesture(gesture, callback, null)'를 호출하면 안드로이드 윈도우 매니저가 실제 손가락으로 액정을 터치한 것과 완벽히 동일한 터치 인터럽트를 OS 전체에 발생시킵니다.
3. 윈도우 계층 구조(View Hierarchy) 파싱과 UI 노드 접근
단순한 좌표 기반 터치 외에도 접근성 서비스는 현재 화면에 떠 있는 모든 UI 뷰의 트리 구조(AccessibilityNodeInfo)를 실시간으로 탐색할 수 있는 권한을 제공합니다.
- 텍스트 검색 및 자동 클릭: 노드 트리를 재귀적으로 탐색하여 특정 텍스트(예: "확인", "설정", "취소")나 리소스 ID를 가진 버튼 객체를 찾아낸 뒤 'performAction(ACTION_CLICK)'을 호출하여 화면 좌표가 달라져도 100% 오차 없는 정밀한 조작을 수행합니다.
- 물리 키 이벤트 에뮬레이션: 'performGlobalAction(GLOBAL_ACTION_BACK)'을 호출하여 하드웨어 뒤로가기 버튼을 누르고, 'GLOBAL_ACTION_HOME'으로 홈 화면으로 빠져나오며, 'GLOBAL_ACTION_NOTIFICATIONS'를 호출하여 상단 알림창을 아래로 쓸어내리는 시스템 제어가 가능합니다.
4. 구글 플레이스토어 보안 정책 준수 및 배터리 최적화
접근성 API는 화면의 모든 정보를 읽을 수 있는 막강한 권한을 가지므로 구글 플레이스토어 심사 시 가장 까다로운 감사를 받습니다.
- 명시적 공개 고지 (Prominent Disclosure): KODARI는 앱 최초 실행 시 "본 앱은 원격 지원 시 화면 터치 및 조작을 위해 접근성 API를 사용하며, 어떠한 개인정보도 수집하거나 저장하지 않습니다"라는 대형 동의 팝업을 사용자에게 고지하고 명시적 승인을 받습니다.
- 이벤트 리스너 필터링: 모든 시스템 이벤트를 감시하면 CPU와 배터리가 급격히 소모되므로, 'accessibilityEventTypes'를 원격 세션이 활성화된 동안에만 동적으로 켜고 세션이 종료되면 리스너를 즉시 해제하여 배터리 소모를 0.1% 미만으로 억제합니다.