프로젝트 / 모바일·디바이스
모바일·디바이스KotlinSwift무선 adbBLE오픈소스
폴더블 폰 × 맥 연동 랩
무선만으로 안드로이드 폴더블과 맥을 하나로 묶은 미니 프로젝트 묶음 — 클립보드·마이크·화면·입력·음성 에이전트까지
- 기간
- 2026.09–2026.10
- 형태
- 사이드 프로젝트
- 상태
- 동작 확인
- 역할
- 실험 설계·네트워크 실측·안드로이드/맥 앱 개발·오픈소스 공개 정리 1인 수행
10개9일 동안 만든 미니 프로젝트
11개공개 저장소 (허브 포함)
35분첫 앱을 폰에 설치하기까지
1~2초맥에서 복사한 내용이 폰 클립보드에 도착
문제
10년 가까이 쓴 아이폰을 폴더블 안드로이드 폰으로 바꾸자, 맥 옆에서 당연하게 쓰던 기능이 비었습니다. 맥에서 복사한 글을 폰에 붙이기, 사진 넘기기, 폰을 보조 화면·카메라·마이크로 쓰기가 모두 따로 해결해야 하는 일이 되었습니다.
제약은 «무선»이었습니다. 공용·기업 Wi-Fi에서는 같은 서브넷인데도 AP 클라이언트 격리로 ping이 100% 손실되었고, 무선 adb는 자주 끊겼습니다. 무엇이 실제로 되고 무엇이 안 되는지부터 실측해야 했습니다.
접근
- 네트워크 조건(공용 Wi-Fi, 핫스팟, Tailscale)별로 맥↔폰 연결을 실측해 기록했고, 망과 무관하게 IP가 고정되는 Tailscale을 연결 인프라로 정했습니다.
- Android Studio 없이 CLI 툴체인과 Claude Code로 빌드→무선 설치→실행을 한 줄로 묶었습니다. 2026년 들어 바뀐 AGP·Kotlin·Compose 버전 함정 4개를 실측으로 정리했습니다.
- 상시로 쓰는 기능은 끊기기 쉬운 adb 위에 올리지 않고 «폰 앱 ↔ 맥 서버»가 직접 주고받게 했습니다. adb는 화면 미러링·입력처럼 «쓸 때 켜는» 기능에만 씁니다.
- 실패해도 오류를 내지 않는 API가 많아서, «보냈다»가 아니라 반대편에 실제로 도착했는지 다시 읽어 확인하는 것을 원칙으로 삼았습니다.
- 공개 전에 비밀값·IP·경로를 걷어 낸 공개본 저장소를 따로 만들고, 실제 화면 대신 코드 목업으로 소개 영상을 만들었습니다.
구조
실측망 조건별 연결과 무선 adb 경로를 붙여 보고 되는 것만 기록합니다.
인프라Tailscale로 맥 두 대와 폰을 묶고, adb가 끊기면 mDNS로 자동 재연결합니다.
연동 앱클립보드·파일·링크·알림 브리지, 폰 마이크 입력, 보조 모니터, 원격 화면을 하나씩 만듭니다.
입력·에이전트맥 트랙패드로 폰을 조작하는 BLE 경로와 말로 폰을 조작하는 에이전트를 붙입니다.
공개정화한 공개본 저장소, 코드 목업, 가로·세로 소개 영상으로 정리합니다.
주요 기능
클립보드·파일 브리지맥에서 복사하면 1~2초 뒤 폰 클립보드에 들어갑니다. 파일·링크·알림·문자도 주고받습니다. 폰→맥 클립보드는 OS가 백그라운드 읽기를 막아 두 번 누르기로 남겼습니다.
폰 마이크를 맥 입력으로폰 마이크 소리를 맥의 시스템 기본 입력 장치로 전환하고, 브리지가 죽으면 원래 입력으로 자동 복귀합니다.
원격 화면맥 화면을 ScreenCaptureKit→H.264→UDP로 폰에 보내고, 폰의 키보드·트랙볼 입력을 맥에 주입합니다. 같은 망에서 네트워크 지연 6~9ms를 확인했습니다.
맥 트랙패드로 폰 조작BLE로 입력을 보내 폰에 가상 HID 마우스·키보드를 만들고, 폰이 LTE에 있어도 인터넷을 거치지 않고 맥 트랙패드·키보드로 폰을 조작합니다.
음성 폰 조작 에이전트말로 시키면 폰이 앱을 열고 누르고 답합니다. 위험한 동작은 확인을 받고, 막히면 사람이 넘겨받아 조작한 뒤 이어 갑니다.
결과
- 9일 동안 미니 프로젝트 10개를 만들고, 허브를 포함한 공개 저장소 11개로 정리했습니다. 공개본은 빌드 9/9 통과와 비밀값 스캔 통과를 확인했습니다.
- 첫날 35분 만에 첫 앱을 폰에 설치했고, 그다음부터는 케이블 없이 설치했습니다.
- 원격 화면에서 마우스 절대좌표·트랙볼·한글 조합 입력이 맥에서 기대값과 일치함을 라운드트립으로 확인했습니다.
- 맥 트랙패드 조작은 LTE 상태에서 이동·클릭·뒤로·스크롤·키보드·복귀까지 손 시험을 통과했고, 맥 앱 재시작 2회 모두 5초에 자동 복구되었습니다.
- 가로·세로 소개 영상과 코드 목업을 만들어 행사 제출용 자료로 정리했습니다.
포인트
막혀 있던 문제 대부분은 «맥과 폰이 서로 닿지 않는다» 하나였습니다. 이미 깔려 있던 Tailscale을 쓰자 핫스팟·Wi-Fi 공유로 헤매던 일이 없어졌습니다. 기능을 만들기 전에 경로부터 실측하는 것이 가장 큰 시간 절약이었습니다.
OS 콜백을 연결 판정에 그대로 쓰면 안 된다는 것도 실측으로 배웠습니다. BLE 구독 해제 콜백이 새 연결 3초 뒤에 도착해 멀쩡한 링크를 끊었고, 그래서 양쪽이 주고받는 PING/PONG 워치독으로 연결 상태를 직접 판정하도록 바꿨습니다.
기술
KotlinJetpack ComposeSwiftScreenCaptureKitVideoToolboxCore BluetoothTailscaleadbFastAPIRaycast Extension
상단 영상은 실제 화면이 아니라 구조를 보여 주는 재구성 목업입니다.