Android 6.0 마시멜로우의 공식SDK 가 공개됐습니다. 아마도 9월말에 있을 행사에서 새로운 Nexus5 의 등장과 함께 본격적으로 OTA 업데이트가 이뤄질 것으로 예측되고 있는데요. 완전히 새로워진 Android 6.0 무엇을 테스트하고 무엇을 주의해야 할까요? 유명한 Developer Advocator 양찬석님의 목소리로 들어봅시다. (글: 양찬석, 옮긴이: 박주형)
마시멜로 무엇을 테스트 할까요?
안드로이드 6.0 마시멜로 버전의 공식 SDK 가 공개된지 벌써 열흘 정도 시간이 지났습니다. 여러분의 앱이 안드로이드 6.0 마시멜로 버전에서 잘 동작하고 있는지 테스트 해 보셨나요? 안드로이드 6.0 마시멜로는 사용자가 안드로이드 디바이스를 더욱 편하게 사용하고, 개발자 여러분들이 보다 향상된 사용자 경험을 제공할 수 있도록 다양한 기능이 추가되었습니다.
새롭게 추가된 기능 중 ‘런타임 권한 모델’, ‘ Doze’, ‘App Standby’ 등은 안드로이드 6.0을 위해 새롭게 빌드된 앱 뿐만이 아니라 기존 앱의 동작에 영향을 미칠 수 있습니다. 아직까지 안드로이드 6.0 에서 여러분의 앱을 테스트해보지 않으셨다면, 기존 앱의 동작 방식에 변화를 가져올 수 있는 변경 사항에 관해서 우선적으로 테스트 해보시면 어떨까요?
런타임 권한 모델
안드로이드 6.0 을 타겟으로 빌드된 앱은 디바이스에 설치 될 때, 사용자가 앱이 요청한 권한을 확인하고 수락하는 과정이 사라지며, 앱 실행 중 권한이 필요한 경우, 아래와 같이 해당 권한을 요청해야 합니다.
그리고, 이미 설치되어 있는 앱들에 대해서도 사용자가 ‘설정 > 애플리케이션 > OOO 앱 선택 > 권한’ 메뉴를 통해, 각각의 앱이 사용 중인 권한을 확인하고 원한는대로 권한를 부여하거나 제거할 수 있게 됩니다. 특히 이러한 방식으로 안드로이드 6.0 버전을 타겟으로 빌드 되었는지 아닌지에 관계 없이 사용자가 직접 앱의 권한 항목을 제한할 수 있습니다.
따라서, 만약 사용자가 여러분의 앱에 주어진 권한을 임의로 제거하는 경우에, 앱이 어떻게 동작하는지 테스트 해 보시기 바랍니다.
(옮긴이) 자주 묻는 질문
Q: 제 상품은 Android M(23)이하 버전으로 빌드했습니다. Android 6.0 사용자에게서는 다운로드/설치시 필요한 권한을 얻지 못하는 것인가요?
A 아닙니다. 6.0 이하버전으로 빌드한 앱은 기존과 동일하게 다운로드/설치시 권한을 획득하는 절차가 그대로 유지가 됩니다. 또한 설정의 '권한' 매뉴에서도 권한을 제거하려고 할 때, 아래와 같은 팝업창이 뜨며 사용자에게 명확하게 안내를 해줍니다.(걱정마세요~)
Doze
디바이스의 배터리 사용량은 정말 중요한 문제입니다. 디바이스가 사용되지 않는 동안, 소모되는 배터리를 줄이기 위해 안드로이드 6.0 에서는 새롭게 Doze 모드가 추가 되었습니다. 다음과 같은 조건을 모두 만족하는 경우 디바이스가 Doze 모드로 진입 되며,
- 충전 중이 아님.
- 스크린이 꺼져 있음.
- 디바이스가 일정 시간 움직임이 없음.
Doze 모드에 진입하면 디바이스의 배터리 소모를 줄이기 위해 몇몇 핵심적인 앱을 제외한 모든 앱은 다음과 같은 기능을 사용하는데 제한을 받게 됩니다.
- 네트워크 액세스가 비활성화됩니다.
- 절전 모드 해제 잠금이 무시됩니다.
- AlarmManager 클래스로 일정이 예약된 알람이 비활성화됩니다.
- WiFi 스캔을 수행할 수 없습니다.
- SyncAdapter와 JobScheduler의 작업이 지연됩니다.
- 디바이스가 Doze 모드에 진입한 경우에는 여러분의 앱 역시 네트워크 엑세스가 제한 되고, AlarmManager 로 등록된 작업이 예정된 시간에 수행되지 않을 수도 있습니다. 개발자 여러분은 디바이스가 Doze 모드에 있을 때 그리고 Doze 모드에서 빠져 나올 때, 여러분의 앱이 의도한대로 동작하는지 테스트해야 합니다. 특히나, ‘알람 시계’ 앱과 같이, 디바이스가 대기 상태에도 중요한 동작을 수행해야 하는 경우에는 더욱 주의가 필요 합니다. 새롭게 추가된 adb 명령어를 통해 Doze 모드를 테스트 할 수 있습니다.
- 다음 명령어를 통해 배터리가 충전되지 않도록 변경 합니다.
$ adb shell dumpsys battery unplug
- 디바이스 스크린을 끕니다.
- 다음 명령어를 반복 실행 하여, 디바이스 상태가 idle이 되도록 합니다.
$ adb shell dumpsys deviceidle step
- 화면을 켜거나, 디바이스를 크게 움직이면 Doze 모드에서 빠져나옵니다.
- 다음 명령어를 통해 배터리 충전 상태를 원래되로 되돌릴 수 있습니다.
$ adb shell dumpsys battery reset
- 다음 명령을 통해, 현재 디바이스의 상태를 확인 할 수 있습니다.
$ adb shell dumpsys deviceidle
App Standby
안드로이드 플랫폼이 판단할 때 사용자가 더 이상 사용하지 않는 앱은 유휴 상태 앱으로 지정 될 수 있습니다. 일정 기간 아래 이벤트 중 어느 한 가지도 발생하지 않는 앱은 유휴 상태 앱으로 지정될 수 있습니다.
- 사용자가 명시적으로 앱을 시작합니다.
- 엑티비티 혹은 서비스의 형태로 해당 앱이 포그라운드 프로세스에서 실행 됩니다. 혹은 다른 포그라운드 프로세스에서 동작 중인 앱이 해당 앱의 서비스나 다른 앱 구성 요소를 사용하고 있습니다.
- 앱이 알림을 생성하였고, 사용자가 해당 알림을 잠금 화면에서 보거나 알림 트레이에서 확인합니다.
- 설정 메뉴에서 사용자가 명시적으로 앱이 전원 최적화 옵션에서 제외 되도록 요청했습니다.
디바이스가 충전 중이 아닌 경우, 유휴 상태인 것으로 간주된 앱은 네트워크 액세스를 할 수 없고, 동기화 작업이 일시 중단됩니다. 디바이스가 충전 중일 때는 네트워크 액세스가 허용되며 보류 중이었던 작업이 실행됩니다. 디바이스가 오랜 시간 동안 유휴 상태인 경우, 유휴 앱은 하루에 한 번 정도 네트워크 액세스가 허용됩니다.
만일 여러분의 앱이 사용자 상호작용 없이 백그라운드 상에서만 동작하는 경우, 유휴 상태 앱으로 지정될 수 있습니다. 이런 경우에도 앱의 주요 동작에 문제가 없는지 테스트 할 필요가 있습니다. 개발자 여러분은 새롭게 추가된 다음 adb 명령어를 통해 특정 앱을 StandBy 모드로 변경할 수 있습니다.
$ adb shell am broadcast -a android.os.action.DISCHARGING
$ adb shell am set-inactive <packageName> true
또한, 다음 명령어를 통해 현재 앱의 StandBy 모드 여부를 확인 할 수 있습니다.
$ adb shell am get-inactive <packageName>
마지막으로, 다음 adb 명령어를 통해 특정 앱을 다시 정상 모드로 변경할 수 있습니다.
$ adb shell am set-inactive <packageName> false
(옮긴이 추가:) openSSL 삭제
Android 6.0에서의 또 다른 주요 변화중 하나는 OpenSSL을 대신에 BoringSSL로 완전히 대체가 된다는 점 입니다. Google+의 Android 개발자 채널에서 올라온 공지를 에 따르면..
안드로이드는 AOSP에 있어 오픈SSL에서 BoringSSL로 이동합니다(https://goo.gl/BZOaBc). 여러분의 앱이 플랫폼 라이브러리와 다르게 연결되어 있다면 (libcrypto.so 처럼) 그것은 향후 새로운 플랫폼이 출시됨에 따라 깨어질 확률이 높습니다. BoringSSL로의 변화는 안드로이드, 크롬, 그리고 다른 제품들 간의 일관성을 높일 것입니다. BoringSSL과 그것이 만들어진 동기에 대해 더 알아보려면 아담 랭글리의 블로그(https://goo.gl/pFyZVI)를 방문하세요. 물론 대부분의 개발자들에게 이것은 잘 보이지 않는 변화일 것입니다.
그러나 몇 앱들은 플랫폼 libcrypto.so이나 libssl.so으로 잘못 링크되기도 하는데, 이는 안드로이드 NDK API의 일부가 아닙니다. 만약 당신이 안드로이드 NDK API를 당신의 앱에서 사용한다면, 당신은 절대 안드로이드 NDK API가 아닌 어떠한 라이브러리와도 연결해서는 안됩니다. 해당 라이브러리들은 퍼블릭 API가 아니기 때문에, 사전 알림 없이 바뀌거나 소멸될 수도 있습니다. 더욱이 취약한 보안에 노출될지도 모릅니다.
한 내용에 따르면 Android 6.0부터는 그동안 다양한 문제가 있었던 openSSL 이 빠지고 BoringSSL로 대체되며 구글 크롬 등 다양한 제품들 간의 연동성을 강화했다고 합니다.
이로 인해서 기존에 코드 난독화나 패킷 보안 등을 위해서 libcrypto.so 등 기존 OpenSSL 라이브러리를 참조하던 서비스의 경우는 더이상 NDK에 해당 라이브러리가 없으므로 관련 수정개발이 필요합니다.
수정 방법은 OpenSSL을 그대로 사용하는 경우에는 직접 OpenSSL에서 사용중인 암호화 함수 등의 코드를 직접 넣거나, libssl.so , libcrypto.so 같이 미리 빌드된 라이브러리(1Mb)를 앱에 추가해주거나, OpenSSL을 사용하지 말고 자바 코드를 직접 호출하거나 BoringSSL을 사용하는 방법으로 이렇게 2가지 큰 해결방향이 있으니 상황에 맞춰서 대응을 하는 것이 필요합니다.
OneStore 인앱결제 업데이트 내용
통합스토어(OneStore)역시 인앱결제SDK 의 Android 마시멜로우 대응 및 SDK 경량화 작업을 진행하면서 기존에 사용하던 OpenSSL 라이브러리의 연동성을 제거했습니다. 곧 새로 배포될 15버전 인앱SDK 는 기존 버전(14.01)에 비해서 더욱 가볍고 빠르게 작동하도록 업데이트를 진행했습니다. 기대해 주세요!
<!-- New IAP SDK is Coming -->
<meta-data
android:name="iap:api_version"
android:value="3" />