🔌

Module 5: ADB 무선 디버깅

공기계 최초개통(Shizuku+rish, 포트 5900)부터 스크린샷/APK/mesh 자동복구까지

⏱️ 최초개통 20~30분 / 재연결 1분 ⚙️ 개발자 옵션 필수 🔄 mesh 자동 복구

1 ADB란?

Android Debug Bridge — PC에서 폰을 제어하는 표준 도구입니다.

2 공기계 최초 개통 — Shizuku + rish (포트 5900)

한 번도 ADB를 켜본 적 없는 공기계를 재부팅에도 강한 영구 무선 ADB로 만드는 절차. 실측 확정판(2026-08-21).

🧭 철칙 — 왜 5900인가

5555는 절대 쓰지 마세요. 5555~5585는 adb 에뮬레이터 포트 대역이라 adb가 기기를 에뮬레이터로 오인해 emulator-5554 offline이 뜹니다. 정답은 5900입니다.
offline = 포트 문제 / unauthorized = RSA 승인만 남은 것(거의 다 된 것).

0 환경 스캔

Termux에서 버전/모델부터 확인 (SDK ≤29면 USB 1회, SDK ≥30이면 무선 페어링 경로)

$ 환경 스캔
getprop ro.build.version.release; getprop ro.build.version.sdk
getprop ro.product.model
which adb || pkg install -y android-tools
which unzip || pkg install -y unzip
which tailscale || pkg install -y tailscale

1 개발자 옵션 + USB 디버깅 ON (화면 작업)

설정 → 휴대전화 정보 → 빌드 번호 7회 탭 → 개발자 모드
(Xiaomi/Redmi는 MIUI 버전도 7회 탭 추가)

  • 개발자 옵션 → USB 디버깅 ON (Xiaomi는 "USB 디버깅(보안 설정)"도 ON)
  • ADB 인증 시간 제한 사용 안 함 ON (있다면 — RSA 7일 만료 방지)
  • USB 꽂고 "USB 디버깅 허용?" → 항상 허용

2 adbd 5900 개통

Android 10 이하(SDK≤29) — PC/WSL에서 USB 연결 후 1회:

$ USB 경로 (SDK≤29)
adb devices
# ⚠️ 5900! 5555 금지
adb -s <serial> tcpip 5900
adb connect <폰IP>:5900

Android 11 이상(SDK≥30) — 무선 디버깅 페어링:

개발자 옵션 → 무선 디버깅 ON → "페어링 코드로 기기 페어링" → 화면에 뜨는 포트/6자리 코드로 자기 자신과 페어링:

$ 무선 페어링 (SDK≥30)
adb pair 127.0.0.1:<페어링포트> <6자리코드>
adb connect 127.0.0.1:5900
adb tcpip 5900
RSA 팝업은 폰 잠금 해제 + 화면 켠 상태에서만 뜹니다 — "항상 허용" 탭. 페어링 실패 시 USB 경로로 폴백.

3 Shizuku 설치 (uid 2000 획득 — 솔루션의 심장)

APK: Shizuku 포크 13.7.0-thedjchi (TCP 모드 5900 지원. 원본 13.6은 포트 고정 안 됨)

  • 설치: termux-open ~/shizuku-fork.apk → 출처 허용 팝업 처리
  • 시작(SDK≤29): 앱에서 "ADB로 시작" / 시작(SDK≥30): "무선 디버깅으로 시작"
  • 포크 설정 4개 필수: TCP 포트 5900 · TCP 모드 ON · 부팅시 시작 ON · 워치독 ON
토큰은 설치마다 다름(재사용 불가). 이 탭 작업은 화면에서 사람이 직접 해야 합니다.

4 rish (USB 없이 shell uid 2000 획득)

$ rish 추출 + 설치
unzip -o ~/shizuku-fork.apk 'assets/rish' 'assets/rish_shizuku.dex' 'lib/arm64-v8a/librish.so' -d ~/sz
cp ~/sz/assets/rish $PREFIX/bin/rish && chmod +x $PREFIX/bin/rish
cp ~/sz/assets/rish_shizuku.dex $PREFIX/bin/ && chmod 400 $PREFIX/bin/rish_shizuku.dex
cp ~/sz/lib/arm64-v8a/librish.so $PREFIX/lib/
sed -i 's/RISH_APPLICATION_ID="[^"]*"/RISH_APPLICATION_ID="com.termux"/' $PREFIX/bin/rish
⚠️ 첫 실행은 반드시 폰 화면에서

rish -c id 첫 실행은 원격/SSH가 아니라 폰 화면에서 직접 해야 합니다. Shizuku 권한 팝업을 사람이 눌러야 하기 때문에 원격으로만 하면 조용히 실패합니다. 기대 출력: uid=2000(shell)

5 백그라운드 면제 (Termux 데몬 안 죽게)

$ 4종 면제 설정
rish -c 'settings put global settings_enable_monitor_phantom_procs false'
rish -c 'cmd deviceidle whitelist +com.termux'
rish -c 'cmd appops set com.termux RUN_ANY_IN_BACKGROUND allow'
rish -c 'cmd appops set com.termux WAKE_LOCK allow'

6 Termux:Boot 자동복구 (재부팅 → 무인 복구)

Termux:Boot APK 설치 → ~/.termux/boot/에 부팅 스크립트 3개 배치(Shizuku 재기동 · sshd 시작 · ADB 포트 저장), chmod +x.

Xiaomi는 설정 → 앱 → Shizuku·Termux·Termux:Boot에서 배터리 무제한 + 자동 시작 허용 추가로 필요.

7 Tailscale 메시 (어디서든 원격)

$ Tailscale 연결
tailscale up && tailscale ip -4

이후 PC/WSL에서: adb connect <TailscaleIP>:5900 — 같은 WiFi 아니어도 케이블 없이 영구 연결.

8 최종 검증

$ 전부 통과 = 완성
adb devices # <IP>:5900 device ← 핵심
adb -s <IP>:5900 shell id # uid=2000(shell) 기대
⚠️ 함정표 — 증상 보면 여기로

emulator-5554 offline → 5555 대역 사용 중, 5900으로 교체
unauthorized → 폰 잠금해제+화면 켠 채 "항상 허용"
protocol fault → Android 15+ 삼성 SPAKE2 페어링 버그, USB tcpip 5900으로 우회
rish Illegal instruction → librish.so 오염, APK에서 재추출
rish 원격 실행 조용히 실패 → 권한 팝업 못 누름, 폰 화면 직접 1회 실행
재부팅 후 5900 사라짐 → Shizuku 부팅시작+워치독+boot 스크립트 확인

3 이미 개통된 폰 연결하기

위 개통 절차를 이미 끝낸 폰을 다시 연결할 때

  1. 개발자 옵션 켜기: 설정 → 휴대전화 정보 → 소프트웨어 정보 → 빌드 번호 7번 터치
  2. 무선 디버깅 켜기: 설정 → 개발자 옵션 → 무선 디버깅 ON
  3. 위젯 8번 실행: Termux 위젯 8번(ADB) 누르면 자동 연결 시도
  4. 연결 실패 시 위젯이 설정 화면을 열어줌
Samsung OneUI 기준

재부팅 후에도 무선 디버깅 설정은 유지됩니다. 다만 TLS 포트가 변경될 수 있는데, 8번 위젯이 자동으로 감지합니다.

$ 5900으로 직접 연결
# Shizuku 포크 TCP 모드 고정 포트. 5555 아님!
adb connect 100.103.250.45:5900

4 ADB 활용 예시

ADB로 할 수 있는 작업들

📸 스크린샷 캡처
adb exec-out screencap -p > screenshot.png
📦 APK 설치
adb install ~/Downloads/app.apk
📋 파일 복사 (PC → 폰)
adb push file.txt /sdcard/Download/
📋 파일 복사 (폰 → PC)
adb pull /sdcard/DCIM/Screenshots/latest.png .
🔄 폰 재부팅
adb reboot

5 Mesh 자동 복구 (adb_revive.sh)

연결이 끊겼을 때 폰/태블릿끼리 서로 복구하는 시스템

원리

adb_revive.sh는 폰 ADB가 끊겼을 때, WSL에서 다음 순서로 복구를 시도합니다:

1. 이미 연결됨? → 종료 2. nmap으로 폰 열린 포트 스캔 (30000-65535) 3. 발견된 포트에 adb connect 시도 4. 실패 시 → 태블릿(SSH)을 통해 간접 연결 시도 5. 태블릿이 폰에 연결 성공 → WSL도 따라 연결
$ ADB 복구 실행
# 폰 + 태블릿 모두 ADB 연결 시도
bash ~/termux-bridge/install/adb_revive.sh all
$ 폰만 시도
# 폰만 복구
bash ~/termux-bridge/install/adb_revive.sh phone

6 연결 확인

$ 연결된 장치 목록
# 연결된 모든 ADB 장치 표시
adb devices
⚠️ 연결 안 될 때

1. 폰/태블릿 Wi-Fi 연결 확인
2. 개발자 옵션 → 무선 디버깅 ON 확인
3. 같은 Tailscale 네트워크인지 확인
4. 위젯 8번 다시 실행 (또는 adb_revive.sh)

🔌 ADB 무선 디버깅 완료!

← 이전: RustDesk 다음 강의: SSH 5-Lane 터널 →