sungyup's.

dev_toolkits / Tools / 1.3 adb

1.3adb

안드로이드 기기와 개발 PC 간의 통신을 가능하게 하는 CLI 도구 adb

TL;DR

추억의 쪽지 시험

React Native 개발 중, 안드로이드 에뮬레이터가 개발중인 PC에서 실행한 서버(localhost:8081)에 연결되지 않는 오류가 있었다. npx react-native run-android으로 빌드가 되는것 같더니, 에뮬레이터에 앱을 설치는 하는데 막상 디버깅을 할 수가 없었던 것이다.

이때 ADB를 통해 에뮬레이터와 개발 PC를 연결할 수 있었다.

ADB(Android Debug Bridge)

ADB는 안드로이드 기기(실기기 / 에뮬레이터)와 개발 PC 간의 통신을 가능하게 하는 CLI 도구이다. Android SDK에 포함되어 있으며, USB, Wi-Fi를 통해 기기와 연결하여 개발 PC에서 기기로 명령어를 전송할 수 있다.

adb
ADB는 안드로이드 디버그 브리지의 약자로, 개발 PC에서 안드로이드 기기로 명령어를 전송할 수 있게 도와주는 다리 역할을 한다.

adb의 구조

adb는 클라이언트 - 서버 - 데몬 구조로 되어 있다.

  1. 클라이언트: 터미널에서 우리가 실행하는 adb 명령어(이후 알아볼, adb devices, adb install 등)는 adb 서버에 요청을 보낸다.
  2. 서버: 개발 PC의 백그라운드 프로세스로 동작한다. 기본적으로 TCP 5037 포트를 사용하고, 클라이언트의 요청을 받아 연결된 디바이스의 데몬에 전달한다.
  3. 데몬(Daemon, adbd): 연결된 안드로이드 기기 안에서 실행되는 프로세스로, adb 서버와 직접 통신하며 명령어를 실행한다.

즉, adb 명령어를 실행하려면 우선 adb 서버 프로세스가 개발 PC에 띄워져 있어야 한다. 보통 처음 adb를 실행하면 자동으로 실행되지만, 가끔 디바이스 인식이 꼬이거나 포트 충돌이 생길때가 있다. 이러면 adb devices(연결된 안드로이드 장치를 확인하는 명령어)로 조회되는 디바이스가 정상 상태임에도 offline 상태로 표시될 수 있다.

이럴때는 adb 서버를 종료하고 다시 실행하면 된다.

bash
adb kill-server adb start-server

포트 포워딩

연결된 안드로이드 기기가 로컬 PC에서 실행된 서버에 연결을 못하고 있던 내게 필요한 기능은 adb의 포트 포워딩으로, 로컬 PC의 포트를 기기와 연결하는 기능이다.

이를 위해 아래의 명령어를 실행한다.

bash
adb reverse localhost:8081 localhost:8081 # Metro Bundler 연결 adb reverse localhost:3000 localhost:3000 # 로컬 백엔드 서버 연결

adb reverseadb forward라는 명령어를 뒤집은 것으로, 디바이스의 포트를 호스트의 포트로 연결하는 것을 의미한다. 즉, 위의 예시에서 첫번째 localhost:8081은 디바이스의 포트, 두번째는 개발 PC의 포트다.

이 커맨드는 안드로이드 기기가 localhost:8081에 연결하도록 지시되었으면(만약 안되었다면 이후 나올 명령어인 adb shell input keyevent 82로 기기 개발자 모드를 켜서 세팅에서 localhost:8081을 연결하라고 지정해주면 된다) 이걸 개발 PC의 localhost:8081과 연결해 그쪽과 통신하라는 의미다.

반대로, adb forward는 개발 PC의 포트를 디바이스의 포트로 연결하라는 의미다. 예를 들어 디바이스 안에서 뜬 서버/소켓을 PC 브라우저로 보고 싶을 때 사용할 수 있다.

이 명령어 및 개발자 모드 세팅을 통해 기기에선 localhost:8081로 연결하라고 지시를 하고, 기기가 본인의 localhost:8081로 연결하는 것을 개발 PC의 localhost:8081로 포트 포워딩을 해줌으로 개발 PC의 서버와 기기를 연결할 수 있었다.

자주 쓰이는 adb 명령어들

  1. adb devices: 현재 연결된 안드로이드 에뮬레이터 / 실기기를 보여준다.
  2. adb shell input keyevent 82: shell은 디바이스 내부의 셸 환경에 진입하겠다는 뜻, input은 안드로이드의 입력 이벤트를 시뮬레이션하는 툴(터치, 스와이프, 키 등)이다. 82번은 KEYCODE_MENU를 뜻하는 KeyEvent 상수다.
  3. adb logcat: logcat으로 로그를 확인한다.

이 외에도 파일 전송, 스크린샷/화면 녹화, 앱 실행/종료 등 다양한 명령어들을 사용할 수 있다.