안드로이드 앱을 크롬북으로 가져오자
Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)
아무 개발자나 붙잡고 안드로이드 개발에서 가장 큰 어려움이 무엇인지 물어보면 파편화(fragmentation)라고 답할 가능성이 높습니다. 수많은 '안드로이드' 호환 기기에서 실행될 수 있을만큼 유연성을 갖춘 앱을 만드는 것은 대부분의 안드로이드 개발자가 어느 시점에서 경험했을 법한 거대한 골칫거리입니다.
그러나 단편화된 플랫폼을 대상으로 개발하는 데는 긍정적인 면도 있습니다! 워낙 수많은 안드로이드 기기가 있기 때문에 여러분이 만든 앱이 거대한 잠재 고객과 연결될 가능성이 있습니다. 게다가 이제 안드로이드 앱을 크롬 OS에서 실행할 수 있기 때문에 잠재 고객이 훨씬 더 커졌습니다.
이 글에서는 최신 안드로이드 앱 프로젝트를 크롬 OS에서 실행하게 만드는 법을 설명합니다. 그리고 여러분은 이 새로운 플랫폼에서 가능한 최상의 사용자 환경을 제공하고 싶을 것이므로 안드로이드 앱을 최적화하는 방법도 살펴볼 것입니다. 그럼 새로운 크롬북 고객에게 큰 호응을 받으실 수 있을 것입니다.
제가 만든 앱이 크롬북에 적합한가요?
안드로이드 개발자라면 자신이 만든 앱을 가능한 한 많은 사람들이 사용할 수 있게 만드는 것을 항상 최우선으로 생각해야 합니다. 맞습니까?
꼭 그렇지는 않습니다.
안드로이드 앱이 이제 크롬 OS와 호환된다고 해서 모든 안드로이드 앱이 자동으로 이 새로운 플랫폼에 딱 맞게 만들어지는 것은 아닙니다.
어떤 괜찮아 보이는 앱을 발견했는데 구글 플레이에는 이 앱이 스마트폰과 크롬북에 호환 가능하다고 표시돼 있다고 가정해 봅시다. 앱을 노트북에 다운로드하고 나면 앱의 대부분의 기능이 전화 통화 및 SMS 메시지 전송과 같은 모바일 전용 하드웨어에 의존한다는 사실을 금방 깨닫게 됩니다.
결국 어떻게 될까요? 이 앱은 크롬 OS에서 거의 사용할 수 없습니다. 여러분은 앱 개발자 때문에 순전히 시간 낭비만 했다고 느끼면서 앱을 곧바로 삭제하고, 그에 대한 보복으로 구글 플레이에 부정적인 리뷰를 남깁니다.
크롬 OS를 지원하지 않는 앱은 최악의 경우 크롬북 사용자를 다소 성가시게 만드는 데 그치겠지만 크롬 OS에서 끔찍한 사용자 환경을 제공하는 앱은 훨씬 더 나쁩니다.
앱을 크롬 OS에 데뷔시키기 위해 준비하기 전에 잠시 시간을 내서 앱에 실제로 크롬북 사용자에게 제공할 만한 것이 있는지 생각해 보십시오.
일반적인 크롬북은 일반적인 안드로이드 스마트폰 또는 태블릿과 매우 다른 하드웨어를 사용합니다. 하드웨어는이 글 전반에 걸쳐 반복되는 주제가 될 테지만 지금 당장은 애플리케이션의 기능 목록을 주의 깊게 살펴봅시다. 이러한 기능 중 하나라도 일반적인 노트북과 호환되지 않는 것이 있습니까?
예를 들어, 노트북에는 일반적으로 발걸음을 측정하는 데 필요한 하드웨어를 갖추고 있지 않기 때문에 만보계 앱은 크롬 OS에서 사용될 가능성이 낮습니다(아침 조깅을 크롬북을 가지고 하는 사람을 마지막으로 본 게 언제입니까?).
앱에 호환되지 않는 기능이 포함돼 있을 경우 이 기능을 수정해서 크롬북과 잘 어울리게 만들 수 있는 방법이 있습니까? 이 질문의 답이 '아니요'라면 앱이 크롬 OS에서 실행 중일 때 이러한 기능을 활성화하지 말아야 합니다. 그럼 또 다른 질문이 생깁니다. 이러한 기능 없어도 앱이 여전히 훌륭한 사용자 경험을 제공할 수 있습니까? 만약 그럴 것 같지 않다면 결국 앱이 크롬북에 적합하지 않을 수도 있습니다.
특정 기능을 비활성화하거나 수정해야 하는 경우에도 앱이 크롬북 사용자에게 제공할 수 있는 기능이 있으면 좋겠습니다. 이제 앱이 크롬 OS에서 실행되도록 업데이트할 준비가 끝났습니다!
앱이 크롬 OS에서 실행되게 만들기
앱에 크롬 OS에서 지원하지 않는 하드웨어가 필요한 경우 크롬북 사용자는 앱을 설치할 수 없습니다. 특히 대부분의 스마트폰과 태블릿에는 있지만 모든 크롬북에는 있지 않는 하드웨어로 터치스크린이 있습니다.
설상가상으로 달리 지정하지 않는 한 구글 플레이는 안드로이드 앱에 터치스크린이 필요하다고 가정하므로, 그 결과 터치스크린 기능이 없는 모든 기기에 앱이 설치되지 않을 것입니다. 가능한 한 많은 크롬북 사용자가 앱을 사용할 수 있게 하려면 내가 만든 안드로이드 앱에 정말로 터치스크린이 필요한지 자문해봐야 합니다.
대부분의 안드로이드 앱의 경우 이 질문의 답은 '아니오'입니다. 대부분의 안드로이드 앱은 터치스크린 없이도 완벽하게 작동하며, 특히 사용자가 풀 사이즈 키보드와 트랙패드, 외부 마우스를 마음대로 사용할 수 있는 크롬북에서는 더욱 그렇습니다. 어떤 크롬북은 기본 터치 이벤트를 에뮬레이션하기 위해 마우스와 키보드를 사용할 수 있게 허용하는 별도의 입력 시스템인 "가짜 터치스크린"을 지원하기도 합니다.
따라서 합당한 이유가 없다면 앱이 기능하기 위해 터치스크린이 반드시 필요하지는 않다고 지정해야 합니다. 여기에는
프로젝트의 Manifest 파일을 열고 애플리케이션에서 사용하는 기능으로 터치스크린(uses-feature android:name="android.hardware.touchscreen"
)을 선언한 다음 android:attribute
을 이용해 애플리케이션의 상태가 다음과 같은지 지정하는 과정이 포함됩니다.
제대로 작동하기 위해서는 이 기능이 필요함(
"true"
)이 기능을 사용할 수 있으면 좋겠지만 이 기능 없이도 작동 가능(
"false"
)
여기서는 터치스크린이 있으면 좋겠지만 반드시 있어야 하는 것은 아니라고 선언하겠습니다.
1 |
<uses-feature android:name="android.hardware.touchscreen" android:required="false" /> |



그럼 구글 플레이는 프로젝트의 <uses-feature>
와 android:required
선언을 통해 앱이 사용자 기기와 호환되는지 여부를 확인하고, 기기가 앱의 모든 요구사항을 충족하는 경우에만 앱을 다운로드할 수 있도록 허용합니다.
앱에 터치스크린이 필요 없다고 선언하면 여러분이 만든 앱을 훨씬 더 많은 크롬북 사용자가 사용할 수 있게 됩니다.
기타 하드웨어 고려 사항
이제 애플리케이션에서 사용하는 모든 기능에 대해 앞서 설명한 과정을 반복합니다. 이는 어떤 안드로이드 앱을 개발하는 경우에도 모범 사례에 해당하며, 크롬북 사용자를 위해 앱을 최적화할 때도 중요한 단계에 해당합니다.
크롬 OS 용 앱을 준비하는 데 도움을 주기 위해 안드로이드 팀에서는 일반적으로 크롬북과 호환되지 않는 모든 하드웨어 선언 목록을 편리하게 참고할 수 있게 만들뒀습니다. 이 목록에 여러분이 만든 앱이 사용하지만 반드시 필요하지는 않는 기능이 있다면 Manifest 파일에 이 기능을 선언하고 android:required="false"
로 표시하는 것이 특히 중요합니다.
하지만 가능한 한 많은 크롬북에서 앱을 사용할 수 있게 하려면 모든 기능을 "false"
로 자동 설정하지 마십시오. 각 하드웨어에 접근하지 않고도 앱이 어떤 사용자 경험을 전달해야 할지 고려해야 합니다. 최대한 많은 사람들에게 앱을 선보이고 싶겠지만 수많은 잠재 고객에게 평균 또는 그에 미치지 못하는 형편없는 사용자 경험을 제공하는 것보다 더 적은 사용자에게 훌륭한 사용자 경험을 제공하는 편이 언제나 더 좋습니다.
이쯤에서 일부 권한은 암시적 하드웨어 요청을 수행하므로 앱에서 요청하는 권한도 검토해야 합니다. 예를 들어, 앱에서 카메라 권한을 요청한다면 구글 플레이는 앱에서 카메라 하드웨어를 필요로 한다고 가정하고 이 요구사항을 충족하지 않는 기기에는 앱이 설치되지 않게 할 것입니다. 만약 앱에 실제로 카메라가 필요하지 않은 경우에는 잠재적인 사용자를 놓치기 쉽습니다! 이러한 일이 발생하지 않게 하려면 앱의 Manifest 파일에서 이 기능을 선언하고 "false"
로 표시해야 합니다.
앱에서 사용하는 모든 기능을 선언하는 모범 사례를 따른다면 이론적으로 암시적인 기능 요청에 대해 걱정할 필요가 없지만 만약에 대비해서 프로젝트를 다시 한 번 점검할 필요가 있습니다.
특히 다음 권한들은 앱이 크롬 OS에 설치되지 못하도록 암시적인 기능 요청을 수행할 수 있습니다.
CALL_PHONE
CALL_PRIVILEDGED
CAMERA
MODIFY_PHONE_STATE
PROCESS_OUTGOING_CALLS
READ_SMSREAD_SMS
RECEIVE_MMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
SEND_SMS
WRITE_APN_SETTINGS
WRITE_SMS
앱에서 이러한 권한을 요청하는 경우 프로젝트 매니페스트에서 관련 하드웨어를 선언했는지 다시 한 번 확인하고 앱에서 실제로 해당 하드웨어가 필요하지 않은 경우 각 선언을 "false"
로 표시합니다.
기능 요청을 처리하는 동안 현재 하드웨어 선언 및 권한 요청을 기반으로 구글 플레이에서 여러분이 만든 애플리케이션을 어떻게 필터링할지 미리 확인하는 데 도움될 수 있습니다. 안드로이드 SDK에는 'aapt'
라는 도구가 포함돼 있습니다. 여러분은 이 도구를 실행해 앱이 실제로 필요로 하는 기능과 이 도구가 출력한 결과를 비교하고 필요에 따라 이를 조정할 수 있습니다.
aapt 사용법에 대한 자세한 사항은 공식 안드로이드 문서를 참고합니다.
센서
대부분의 안드로이드 스마트폰과 태블릿에는 기기의 현재 방향, 위치, 때로는 환경 조건에 대한 정보를 비롯해서 다양한 데이터를 애플리케이션에 제공할 수 있는 다양한 내장 센서가 있습니다.
스마트폰이나 태블릿에서 일반적으로 기대하는 대부분의 센서는 크롬 OS에서 사용할 수 없으므로 앱에서 센서의 데이터를 사용하는 경우 이 센서를 사용할 수 없을 때 앱에서 어떻게 반응해야 할지 계획해야 합니다.
앱 전체가 특정 센서에 접근하는 데 의존한다면 이 센서가 포함되지 않은 모든 기기에 앱이 설치되지 않게 해야 합니다. 예를 들어, 앱이 가속도계 센서의 데이터 없이 작동할 수 없다면 프로젝트의 Manifest에 다음과 같은 내용을 추가해야 합니다.
1 |
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" /> |
다른 경우를 예로 들면, 앱에 특정 센서를 필요로 하지 않지만 센서의 데이터를 사용할 수 있는 기능을 갖추고 있을 때입니다. 이 경우 Manifest에 이 센서를 선언해야 하지만 android:required="false"
로 표시해야 합니다. 앱은 런타임에 이 센서를 사용할 수 있는지 여부를 확인할 수 있고, 사용자 기기에 없는 센서에 의존하는 기능을 비활성화할 수 있습니다.
어떤 센서를 사용할 수 있는지 판단하기 위해서는 SensorManager
클래스의 인스턴스를 만든 다음 getSystemService
메서드를 호출하고, 이때 SENSOR_SERVICE
인수를 전달해야 합니다.
1 |
private SensorManager mSensorManager; |
2 |
...
|
3 |
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); |
다음에는 getSensorList
메서드를 호출하고 Sensor.TYPE_ALL
상수를 사용해 현재 사용할 수 있는 모든 센서의 목록을 가져와야 합니다.
1 |
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); |
이 정보를 토대로 현재 기기에 없는 센서의 데이터에 의존하는 애플리케이션 기능을 비활성화할 수 있습니다.
크기 조정 및 크롬 OS의 다중 창 모드 지원
크롬 OS에서 안드로이드 앱은 사용자가 옮길 수 있는 별도의 창에 표시되며, 다음의 세 가지 지원되는 크기 사이를 번갈아가면서 표시됩니다.
세로. Nexus 5의 화면과 비슷한 크기입니다.
가로. Nexus 7과 비슷한 화면.
최대. 앱에서 사용 가능한 모든 화면 공간을 사용합니다.
크롬 OS에서 앱을 테스트할 때가 되면 가령 앱의 텍스트가 읽기 쉽고 사용자가 앱을 세로, 가로 또는 최대 모드로 뒀는지 여부에 관계 없이 모든 UI 요소를 이용할 수 있는지 확인해서 앱이 적절히 표시되고 지원되는 세 가지 크기에서 올바르게 작동하는지 확인하고 싶을 것입니다.
크롬 OS 사용자는 한 번에 여러 안드로이드 앱을 볼 수 있지만 하나의 앱만 포커스를 가질 수 있으므로 사용자의 배터리를 아끼려면 앱이 포커스를 잃을 때마다 렌더링을 일시 중지해야 합니다. 유일한 예외는 앱에 지속적으로 업데이트해야 하는 콘텐츠가 있는 경우입니다. 예를 들어, 음악이나 동영상을 재생하는 앱을 개발하는 경우 앱이 포커스를 잃을 때마다 해당 Activity
를 중지하고 싶지 않을 것입니다.
액티비티가 화면 전체를 업데이트해야 할 경우 onPause
핸들러를 사용하는 대신 onStop
에서 일시 중지하고 onStart
에서 재생을 다시 시작해야 합니다.
자동 백업
크롬북은 사용자가 쉽게 기기를 전환할 수 있게 설계돼 있습니다. 즉, 이전에 특정 크롬북을 사용했는지 여부에 관계없이 자신의 구글 계정에 로그인하면 모든 앱과 콘텐츠가 그대로 유지됩니다.
이것은 크롬북 사용자가 기대하는 동작 방식이기 때문에 앱이 크롬 OS에서 실행될 때도 앱이 이렇게 동작해야 할 것입니다. 즉, 앱의 데이터를 로컬에 저장하는 대신 온라인에 백업해야 합니다. 가장 쉬운 방법은 안드로이드의 자동 백업 기능을 사용하는 것입니다. 이 기능을 이용하면 앱의 데이터를 사용자의 구글 드라이브 계정에 백업할 수 있습니다.
앱이 안드로이드 6.0 이상을 대상 플랫폼으로 하는 경우 기본적으로 자동 백업이 활성화됩니다. 하지만 앱에서 사용하는 기능에 대해 명시하는 것이 언제나 바람직하므로(이후 버전의 안드로이드에서도 자동 백업이 기본적으로 활성화되리라는 보장이 없습니다) 프로젝트의 Manifest 파일을 열고 다음 내용을 추가합니다.
1 |
android:allowBackup="true" |
백업 및 복원 구현에 대한 자세한 내용은 공식 안드로이드 문서를 참고합니다.
테스트
이러한 모범 사례를 모두 따른 후에도 실제 크롬북에서 앱을 테스트하지 않는 이상 앱이 크롬 OS에서 우수한 사용자 경험을 제공할 것이라고 확신할 수 없습니다.
이 글을 쓰는 지금, 구글에서는 다음과 같은 환경에서 크롬북 지원 앱을 테스트할 것을 권장하고 있습니다.
ARM 기반 크롬북
인텔 x86 기반 크롬북
컨버터블 크롬북(노트북이나 태블릿으로 모양을 바꿀 수 있는 제품)
터치스크린을 지원하는 크롬북
"가짜 터치"를 지원하는 크롬북
그러나 현실적으로 여러분이 다양한 크롬북을 이용할 수 있을 가능성은 거의 없을 것입니다. 앱을 테스트하기 위해 어떤 크롬북을 사용해야 할지 결정할 때 구글에서 정리한, 현재 출시된 모든 안드로이드 호환 크롬북 목록을 살펴보는 것이 도움될 수 있습니다.
크롬 OS에 안드로이드 앱을 설치하려면 먼저 크롬북을 개발자 모드로 설정하고 '알 수 없는 출처에서 설치'를 활성화해야 합니다.
크롬북을 개발자 모드로 설정하는 정확한 과정은 기기마다 다르므로 아래에서 안내하는 내용이 특정 모델에서 유효하지 않으면 크로미엄(Chromium) 문서에서 기기별 세부 지침을 찾아봐야 합니다.
개발자 모드로 들어가는 법:
크롬북의 전원을 끕니다.
기기의 전원 버튼을 누른 상태에서 Esc 키와 새로고침 키를 길게 누릅니다. 그럼 크롬북이 복구 화면으로 부팅할 것입니다.
크롬북 키보드에서 Control-D 키를 누릅니다.
메시지가 나타나면 Enter 키를 누릅니다.
Control-D 키를 다시 누릅니다.
이제 크롬북이 개발자 모드로 부팅됩니다.
다음 단계는 크롬 설정 > 앱 설정 > 보안으로 이동해서 알 수 없는 출처를 선택해서 알 수 없는 출처를 사용하도록 설정하는 것입니다.
이러한 단계를 완료하고 나면 테스트할 APK(Android Application Package)를 설치할 준비가 됩니다. APK를 크롬북으로 손쉽게 전송하는 방법은 다음과 같습니다.
APK를 구글 드라이브에 추가
외장 드라이브 또는 SD 카드를 이용해 APK 파일을 크롬북의 다운로드 폴더로 복사
APK를 이메일로 전송
그러고 나면 크롬북에서 APK를 다운로드하고 안드로이드 파일 관리자 앱(크롬 설정 > 앱 설정 > 기기 및 USB > 탐색으로 이동해서 볼 수 있는)을 사용해 APK를 엽니다.
또는 안드로이드 디버그 브리지(ADB) 명령을 이용해 개발용 장비의 APK를 크롬북으로 푸시(push)할 수 있습니다.
ADB가 크롬 OS에서 제대로 작동하게 하려면 설정이 필요하지만 일단 연결만 되면 ADB를 사용해 안드로이드 앱을 테스트하는 데 매우 유용한 다양한 명령을 실행할 수 있습니다. (ADB 명령에 대한 자세한 내용은 공식 안드로이드 문서를 참고합니다).
안드로이드 디버그 브리지 활용
ADB 설정은 여러 단계로 진행되므로 한 번에 한 단계씩 다뤄보겠습니다.
1. 들어오는 ADB 연결을 허용하도록 크롬 OS 방화벽을 설정합니다.
키보드에서 Control-Alt-T를 눌러 크롬 OS의 터미널을 실행한 다음 shell
을 입력해 bash 명령 셸을 엽니다.
1 |
crosh> shell |
2 |
chronos@localhost / $
|
비밀번호를 입력한 다음 터미널 창에서 다음 명령을 실행합니다.
1 |
chronos@localhost / $ sudo /usr/libexec/debugd/helpers/dev_features_rootfs_verification |
출력되는 내용을 읽습니다. 계속 진행하려면 다음 명령을 입력합니다.
1 |
chronos@localhost / $ sudo reboot |
그럼 크롬북이 재부팅될 것입니다. 크롬북이 부팅을 완료하면 터미널을 다시 실행한 후 다음 명령을 입력합니다.
1 |
chronos@localhost / $ sudo /usr/libexec/debugd/helpers/dev_features_ssh |
2. 크롬북의 IP 주소 찾기
ADB 디버깅을 활성화하려면 크롬북의 IP 주소가 필요합니다.
크롬북 홈 화면의 오른쪽 하단에 있는 네트워크 아이콘을 클릭합니다.
현재 크롬북이 연결된 네트워크를 선택합니다.
메뉴의 오른쪽 하단에 있는 i 아이콘을 클릭합니다.
이제 크롬북의 IP 주소가 포함된 상자가 나타나면 나중에 필요할 것이므로 IP 주소를 메모해 둡니다.
3. adb 디버깅 활성화
크롬북에서 다음 단계를 완료합니다.
화면의 오른쪽 하단에 있는 시계 아이콘을 클릭합니다.
설정을 선택합니다.
안드로이드 앱 영역에서 설정에서 안드로이드 앱 관리 링크를 클릭합니다.
기기 정보를 클릭합니다.
빌드 번호를 7번 클릭해서 개발자 모드로 들어갑니다.
창의 왼쪽 상단에 있는 화살표를 클릭합니다. 그럼 기본 설정 화면으로 돌아갑니다.
개발자 옵션을 클릭합니다.
ADB 디버깅을 활성화한 다음 확인을 클릭합니다.
다음으로 개발용 장비에서 단계를 완료합니다.
터미널 창을 열고 디렉터리를 변경해서(cd
) 안드로이드 SDK의 'adb' 프로그램이 들어있는 곳으로 이동합니다.
1 |
cd /Users/jessicathornsby/Library/Android/sdk/platform-tools
|



다음 adb 명령을 실행해서 개발용 장비가 22번 포트에서 TCP/IP 연결을 대기하게 합니다.
1 |
./adb tcpip 22 |
adb connect
명령 다음에 크롬북의 IP 주소를 지정해서 실행합니다. 예를 들면:
1 |
./adb connect 100.100.0.10 |
크롬북에서 메시지가 표시되면 허용(Allow)을 클릭합니다.
이제 APK를 개발용 장비에서 크롬북으로 푸시하기만 하면 됩니다.
개발용 장비에서 adb install
명령 다음에 설치하려는 APK의 경로와 파일명을 지정해서 실행합니다. 예를 들면 다음과 같습니다.
1 |
./adb install Users/jessicathornsby/Documents/app-name.apk
|
이게 다입니다! 이제 여러분이 만든 안드로이드 애플리케이션이 크롬북에 설치되어 테스트할 준비가 끝났습니다!
정리
이번 글에서는 앱이 크롬북에서 실행되도록 업데이트하는 법을 살펴봤고, 이러한 새로운 플랫폼에서 실행될 수 있게 된 후에는 더 나은 사용자 경험을 제공하기 위해 앱을 최적화하는 방법을 살펴봤습니다.
스마트폰, 태블릿, 그리고 이제 노트북을 통해 즐겨쓰는 앱을 이용할 수 있다는 것은 크롬북 사용자에게는 아주 좋은 소식이며, 개발자에게는 안드로이드 앱의 잠재 고객이 더욱 많아진 것이라고 할 수 있습니다. 그리고 이렇게 되기를 원치 않는 사람은 아무도 없을 것입니다!