TL;DR
- Power Struggle은 USB-C로 연결된 두 휴대폰에서 더 빠르게 탭하는 쪽이 상대 배터리 전력을 가져가는 2인용 게임임.
- Android의 USB 전력 역할 전환을
Shizuku를 통해 실행하며, 루트 권한 없이 한 대의 휴대폰만 설정하면 됨. - 같은 케이블에서 Android Open Accessory를 데이터 통신에 사용하고, 전력 역할과 데이터 역할을 독립적으로 유지함.
- Pixel 9 Pro XL ↔ Pixel 4 XL 측정에서 공급 기기는 약 1500mA를 소모하고 수신 기기는 약 400mA를 얻으며, 실제 전달 전력은 약 4.5W임.
- 픽셀 기기와 iPad에서만 시험한 개념 증명으로, 제조사별 지원 여부와 낮은 배터리 잔량에서의 전력 공급에 주의가 필요함.
Power Struggle
- USB-C 케이블로 두 휴대폰을 연결하고 탭해 상대의 배터리 전력을 물리적으로 빼앗는 2인용 탭 배틀임.
- 이기는 쪽은 실제로 충전되고 지는 쪽은 실제 배터리가 줄어듦. 둘 다 배터리가 5%라 귀가할 수 없지만 한쪽이 다른 쪽의 전력을 가져가면 버틸 수 있는 상황을 위한 게임임.
- 프로젝트 페이지
플레이 방법
- 두 휴대폰을 화면이 바깥쪽을 향하도록 테이블 위에 놓고, 아래쪽끼리 케이블로 연결한 뒤 각 기기 뒤에 한 명씩 자리함. 이에 맞춰 사용자 인터페이스(UI)는 한쪽에서 거꾸로 보이도록 그려짐.
- 화면을 탭해 에너지 흐름의 매듭을 자기 배터리 쪽으로 당김. 매듭은 저절로 케이블 쪽으로 되돌아감.
- 매듭이 케이블 바로 너머의 선을 통과하면 전력 흐름이 바뀌어 해당 플레이어 쪽으로 전력이 흐름. 휴대폰 자체의 상태 표시줄에 충전 아이콘이 나타나는지 확인할 수 있음.
- 더 빠르게 탭할수록 상대 배터리에서 더 많은 전력을 가져오며, 패자는 실제 충전량을 잃음.
- 상대 기기에 앱이 설치되지 않았거나 iPad·iPhone인 경우, 한 휴대폰 화면을 분할해 두 플레이어가 함께 플레이하면서 상대 기기와 전력을 교환함.
작동 방식
- 충전 역할 전환: 최신 휴대폰의 USB-C 포트는 전력을 공급하는 소스(source)나 전력을 받는 싱크(sink) 역할을 맡을 수 있음. 두 휴대폰을 연결하면 USB Power Delivery가 역할을 결정하며, 사양상 연결을 끊지 않고도 연결 도중 전력 역할을 바꿀 수 있음.
- Android의 ‘연결된 기기 충전’ USB 설정도 같은 역할 전환을 수행함. Power Struggle은 게임 내부에서
dumpsys usb set-port-roles명령을 실행해 같은 전환을 요청함. - 이 명령에는 셸 수준 권한이 필요하므로 앱은
Shizuku를 통해 실행하며,Shizuku는 앱에adb shell권한을 빌려줌. 루트 권한은 필요하지 않음. - 두 휴대폰 사이에서 전환을 협의하므로 한 휴대폰에만 이 기능이 필요하고, 다른 휴대폰은 요청을 수락하기만 하면 됨. 전환에는 약 0.5초가 걸리며, 이후 반대 방향으로 약 4.5W의 전력이 흐름. Pixel 기준 전압·전류는 5V, 0.9A임.
- 같은 케이블을 통한 게임 데이터:
Shizuku를 실행하는 휴대폰이 USB 호스트 역할을 맡고 상대 휴대폰을 Android Open Accessory 모드로 전환함. 차량용 헤드 유닛과 도크용으로 만들어진 이 프로토콜을 사용해 탭 입력과 게임 상태를 주고받는 직접 데이터 채널을 구성하며, 지연 시간은 밀리초 수준임. - USB에서는 전력 역할과 데이터 역할이 독립적이므로, 전력 흐름이 오가는 동안에도 데이터 연결은 유지됨.
- 실제 상태를 표시하는 UI: 각 휴대폰의 충전·방전 표시는 게임 메시지가 아니라 해당 기기의
BatteryManager측정값에서 가져옴. 따라서 화면에는 배터리가 실제로 충전되는지 방전되는지가 표시됨. - 측정 결과: Pixel 9 Pro XL과 Pixel 4 XL 조합에서 전력을 공급하는 휴대폰은 약 1500mA로 배터리가 줄고, 전력을 받는 휴대폰은 약 400mA만큼 배터리가 늘어남. 양쪽 화면과 애니메이션이 전달된 약 4.5W를 소비하므로 실제 비상시에만 사용할 것을 권장함.
사용해 보기
- 필요한 기기와 조건은 다음과 같음.
- 호스트 휴대폰: Android 13 이상, 설치 및 실행 중인
Shizuku필요. 무선 디버깅으로 시작하며, 재부팅할 때마다 다시 시작해야 함. - 상대 기기: USB-C가 있는 다른 Android 휴대폰. 이 앱을 설치하는 것이 이상적이지만
Shizuku는 필요하지 않음. 또는 한 대만 앱을 실행하는 모드에서 iPad나 USB-C iPhone을 사용할 수 있음. - 전력만 전달하는 케이블이 아니라 데이터 전송을 지원하는 USB-C 대 USB-C 케이블 필요.
- JDK 17 이상에서
./gradlew installDebug를 실행해 빌드하고 설치함. - 두 휴대폰에서 앱을 열고 케이블을 연결한 뒤 권한 요청을 수락함. 호스트 휴대폰에서는
Shizuku권한과 USB 접근 권한을, 상대 휴대폰에서는 ‘Power Struggle 열기’를 승인함.Shizuku가 실행 중인 휴대폰은 자동으로 호스트가 됨.
상태와 주의사항
- 픽셀 기기와 iPad에서만 시험한 개념 증명임.
dumpsys usb set-port-roles는 공개 API가 아니라 디버그 인터페이스임. 다른 제조사의 빌드나 향후 Android 버전에서는 지원되지 않을 수 있음.- 일부 휴대폰은 자체 배터리가 낮을 때 전력을 공급하지 않으며, 앱에는 아직 자체 배터리 하한선이 적용되지 않음. 계속 켜져 있어야 하는 휴대폰으로 플레이하지 말아야 함.
- iPad와 iPhone은 Android Open Accessory를 지원하지 않아 USB를 통해 앱을 실행할 수 없으므로, 한 대만 앱을 실행하는 모드에서 전력만 주고받는 상대 기기임.
코드 구성
Battle.kt: 게임 상태, 줄다리기 로프, 1대·2대 휴대폰 모드 감지, 유선 프로토콜.PowerControl.kt,ShellService.kt: 셸 사용자 권한으로dumpsys usb를 실행하는Shizuku사용자 서비스.UsbLink.kt: Android Open Accessory 호스트 및 액세서리 데이터 연결.MainActivity.kt: 에너지 흐름, 매듭, 배터리 게이지, 분할 화면을 구성하는 Compose UI.
라이선스
- MIT © 2026 Ken Kawamoto
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요