한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
새로운 Android Emulator 도구를 사용한 지속적인 테스트
2019년 10월 28일 월요일
<블로그
원문
은 이곳에서 확인하실 수 있으며 블로그 번역 리뷰는 노현석(Android GDE)님이 참여해 주셨습니다>
게시자: Lingfeng Yang, Android Studio 팀
개발자들은 종종 일상적인 개발 업무 중에
Android Emulator
를 사용해 최신 변경 사항을 빠르게 테스트해 본 후에 커밋하곤 합니다. 그뿐 아니라, 개발자가 지속적 통합(CI) 시스템에서 Emulator를 사용해 더 큰 규모의 자동화 테스트를 합니다. 이런 사용 사례를 더욱 지원하기 위해, 우리는
Android Emulator 컨테이너 스크립트
를 오픈소싱하고 다음 두 가지 고충 사항과 관련하여 개발자 환경을 개선하는 노력을 기울이고 있습니다.
Deployability
- 원하는 버전의 Android Emulator를 찾아서 실행.
Debuggability
- Android Emulator의 원격 인스턴스에서 버그 추적.
Deployability
Android는 다양한 하드웨어 및 소프트웨어 구성을 지원하는데, Android Emulator 역시 다르지 않습니다. 하지만 이와 같은 다양한 방식으로 인해 환경 구성에서 오히려 혼동이 생길 수 있습니다. 개발자는 어떻게 Emulator와 시스템 이미지를 구해야 할까요? 어떤 드라이버가 필요할까요? CPU 또는 GPU 가속 유무에 관계없이 어떻게 실행할까요? 그 밖에도 많은 점이 혼란스럽습니다.
이런 점을 해소하기 위해 우리는 다음과 같은 솔루션을 내놓았습니다.
Android Emulator 다운로드 스크립트
- 이 스크립트는 최신 Emulator 이미지(AOSP와 Google Play Service 포함)는 물론이고, (Linux, Mac OS, Windows 지원) Emulator 바이너리도 제공합니다. 이 스크립트를 기존 지속적 통합 시스템과 통합할 수 있습니다. 우리는 앞으로 과거의 테스트 결과를 더 쉽게 재현하기 위해 최신 버전 외에도 지원 중단된 버전을 다운로드할 수 있도록 이 서비스를 향상시킬 생각입니다.
Android Emulator Docker 이미지 생성기
- Android 시스템 이미지와 Emulator는 전체 중 한 부분일 뿐입니다. 환경, 드라이버, 사전 설치 시스템 종속 항목을 위해, 우리는 Docker 이미지 생성기를 만들었습니다. 이렇게 하면 Android Emulator가 작동하는 완벽한 환경이 만들어집니다. Docker 이미지를 시작한 후, 1) 포트 전달과 ADB 또는 2) gRPC와 WebRTC를 통해 Emulator와 상호작용할 수 있습니다. 현재, Docker 이미지 생성기는 Linux에서 작동하도록 설계되었습니다. 우리는 Mac OS 및 Windows 호스트도 모색 중이므로 계속 관심을 가져주시기 바랍니다!
재현성을 높이기 위해, 기본 Dockerfile 템플릿을 사용하면 필요한 Command line 플래그와 시스템 종속 성이 더욱 명확해집니다 (Docker 이미지를 빌드하여 재현할 수 있습니다). 하드웨어 가속의 경우
run.sh
로 전달되는 --privileged 플래그를 확인하세요. Emulator를 실행할 때 CPU 가속을 사용할 수 있으며 CPU 가속(KVM)을 사용하는 상태로 컨테이너를 실행하려면 --privileged가 필요합니다.
Android Emulator 이미지를 만들고 배포하는 방법에 관한 자세한 내용은
README
를 참조하세요.
Debuggability
Emulator가 실행 중이고 테스트 또는 Emulator가 실패할 경우 실행 중인 환경으로 들어가 오류를 진단하기 어려울 수 있습니다. 진단에서는 가상 기기와의 직접적인 상호작용이 필요할 때가 종종 있습니다. 우리는 직접 상호작용을 위해 다음 두 가지 메커니즘을 제공합니다.
ADB
원격 스트리밍
ADB의 경우 우리는 Docker 게스트에서 호스트로 특정 포트를 전달하여 logcat 및 shell과 같은 모든 명령어를 허용합니다. 현재 포트는 5555이므로, 더 많은 피드백을 수집하고 다양한 컨테이너에 걸쳐 포트를 분리하는 최선의 방법에 관해 더 많은 연구를 수행해야 할 것입니다.
원격 스트리밍
보안 참고: 원격 스트리밍을 사용할 때는 일단 서비스가 시작되고 나면 포트 80/443을 통해 컴퓨터에 연결할 수 있는 모든 사용자가 Emulator와 상호작용할 수 있다는 점을 염두에 두세요. 따라서 공용 서버에서 Emulator를 실행할 때 주의하십시오!
원격 스트리밍을 사용하면 컨테이너에서 Emulator를 실행할 수 있는데, 로컬에서 실행하는 것만큼이나 상호작용이 원활히 이루어집니다. 컨테이너에서 Emulator를 실행하면 ADB 명령어로는 발견하기 어려울 수 있는 문제를 더 쉽게 디버깅할 수 있습니다. 동영상 스트리밍에 사용되는
WebRTC
와 마우스 및 키보드 이벤트를 Emulator로 보내는 데 사용되는
gRPC
가 지원되는 브라우저를 사용하여 Emulator에 액세스할 수 있습니다. 원격 스트리밍에는 다음 세 가지 컨테이너가 필요합니다.
최신 Emulator를 호스팅하는 컨테이너
gRPC에 필요한
Envoy 웹 프록시
가 있는 컨테이너
React
웹 앱을 제공하기 위한
nginx
가 있는 컨테이너
README
에 설명되어 있는 것처럼, docker-compose를 사용하여 Docker 컨테이너를 함께 구성할 수 있습니다. 컨테이너는 포트 80 및 443에 바인딩되므로, 웹 서버가 실행되고 있지 않은지 확인하세요. 브라우저에서 호스트를 가리키면 자체 서명된 인증서가 제공됩니다. 브라우저에서 호스트를 가리키면 아래와 같은 이미지가 나타날 것입니다.
이때도 호스트에 연결할 수 있는 사람이라면 누구든 Emulator와 상호 작용할 수 있다는 점을 잊지 마세요. 따라서 공용 서버에서 Emulator를 실행할 때는 주의하세요!
테스트 규모의 확장
테스트란 게 마치 꼭 내야 하는 세금처럼 여겨질 수 있습니다. 하지만 많은 노련한 개발자가 경험한 바와 같이, 적절히 자동화된 테스트 코드는 코드 베이스가 점점 커지고 복잡해짐에 따라 개발 속도를 높일 수 있습니다. 지속적 테스트를 통해 뭔가 변경하더라도 앱에 문제가 생기지 않으리라는 확신을 가질 수 있을 것입니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed