Android device in Container
Docker container 에 Android Device 를 연결하여 작업해야 할 때 여러 조건으로 인해 어려움이 있을 수 있습니다.
USB 연결을 쓸 수 없거나, Network 연결을 쓸 수 없거나, Privileged 로 실행할 수 없거나 등등등…
Android Device 를 Container 에 연결하는 세 가지 방법을 소개합니다.
Volume mount 방법
Linux 에서는 Android Device 와 USB cable 로 연결되면, USB 장치로 연결됩니다.
Bus 001 에 Device 045, 047 에 Galaxy 폰이 연결되어 있네요.
/dev/bus/usb
를 열어보면 001
이 Bus id, 001
안의 045
, 047
이 Device id 입니다.
/dev/bus/usb
에 Container 에 접근할 수 있도록 해주면 연결이 가능합니다.
-v /dev/bus/usb:/dev/bus/usb
는 Host 의 usb 장치를 Container 의 usb 장치로 사용할 수 있도록 해줍니다.
Container 가 Host 의 usb 장치에 접근하므로 --privileged
옵션이 반드시 필요합니다.
--privilged
옵션은 Container 가 sudo
권한을 갖도록 합니다. 보안에 취약해지죠. 그리고 여러 개의 Android Device 가 연결되었을 때, 모든 Android Device 가 1개의 Container 에 연결되게 됩니다. 따로따로 사용하고 싶을 때는 쓸 수 없는 방법입니다.
또한, 이 방법은 연결된 장치를 파일로 관리하는 Linux 에서만 사용이 가능합니다. Mac, Window 에서는 사용할 수 없습니다.
adb wifi 를 사용하는 방법
adb 는 wifi 를 통한 연결을 지원합니다(참고)
이것을 이용하여 Host 에서 adb 가 wifi 를 사용하도록 하고, Container 에서 접근하는 방법입니다.
Linux, Mac, Window 모두 사용 가능한 방법입니다.
다만 자동화된 시스템을 만들고자 할 때 Android Device 의 IP 가 매번 변경될 수 있으므로, 고정IP 를 사용하도록 해야 합니다.
그리고 만약 Host PC 와 Android Device 가 다른 네트워크에 존재한다면 이 방법은 사용할 수 없습니다.
Host PC 가 VPN 연결되어 있거나, 유선랜에 연결되어 있거나…
장치 등록하여 사용하는 방법
위 두 방법을 사용할 수 없는 경우엔 --device
를 사용합니다.
--device /dev/bus/usb/{busID}/{deviceID}
로 명시된 USB 장치 1개를 1개 Container 에 연결해줄 수 있습니다.
여러 개의 Android Device 가 연결되어 있고, 각각 다른 Container 에 연결되어야 할 때 사용하면 좋습니다.
busID, DeviceID 는 Volume mount 방법에서 본 것 처럼 lsusb
명령을 사용하여 알아낼 수 있습니다.
--privileged
옵션도 필요없고, 네트워크도 상관없고, USB 연결만 되어 있으면 되지만, Linux 에서만 사용할 수 있는 방법입니다.
마무리
Container 에서 Device 를 직접 제어할 수 있게되면 GitHub Action, GitLab Runner 등 CI/CD 도구와 연동하여 보다 많은 테스트를 쉽게 할 수 있고,
일관된 테스트 환경과 도구를 제공하는데도 용이해집니다. Android App 개발에 유용하게 활용될 수 있을 것으로 기대합니다.
긴 글 읽어주셔서 감사합니다.