Android 8.0 (API 수준 26)에는 동작 변경사항과 함께 앱에서 활용할 수 있는 새로운 기능과 API가 도입되었습니다. 이 문서에서는 Android 8.0으로 앱을 이전하는 두 가지 주요 단계를 간략히 설명합니다.
- Android 8.0과의 호환성 보장
새로운 버전의 플랫폼에서 앱이 올바로 작동하는지 확인합니다. 이 단계에서는 새 API를 사용하거나 앱의
targetSdkVersion
를 변경하지 않지만 사소한 변경이 필요할 수 있습니다. - 대상 버전 업데이트 및 Android 8.0 기능 사용
플랫폼의 새로운 기능을 활용할 준비가 되면
targetSdkVersion
를 26으로 업데이트하고 앱이 계속 정상적으로 작동하는지 확인한 다음 새 API를 사용하기 시작합니다.
Android 8.0과의 호환성 보장
여기서의 목표는 기존 앱이 Android 8.0(API 수준 26)에서 있는 그대로 작동하는지 확인하는 것입니다. 일부 플랫폼 변경사항은 앱의 동작 방식에 영향을 줄 수 있으므로 일부 조정이 필요할 수 있지만, 새 API를 사용하거나 targetSdkVersion
를 변경할 필요는 없습니다.
Android 8.0을 실행하는 기기 준비
- 호환되는 기기 (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P, Nexus Player)를 보유하고 있다면 안내에 따라 기기를 플래시하세요.
- 또는 Android Emulator용 Android 8.0 시스템 이미지를 다운로드합니다. SDK Manager의 Android 8.0 아래에 Google APIs Intel x86 Atom System Image로 나와 있습니다.
참고: Android 8.0 시스템 이미지는 Android 스튜디오 3.0 이상에서 다운로드할 수 있습니다. 자세한 내용은 아래 섹션을 참고하여 Android 8.0 SDK를 다운로드하세요.
호환성 테스트
대부분의 경우 Android 8.0 (API 수준 26)과의 호환성 테스트는 앱 출시를 준비할 때 실행하는 것과 동일한 유형의 테스트를 거치게 됩니다. 이 시점에서 핵심 앱 품질 가이드라인과 테스트 권장사항을 검토하는 것이 좋습니다.
그러나 테스트에는 또 다른 측면이 있습니다. Android 8.0에서는 targetSdkVersion
를 변경하지 않더라도 앱 동작에 영향을 미치거나 앱을 완전히 중단할 수 있는 Android 플랫폼 변경사항을 도입합니다. 따라서 표 1의 주요 변경사항을 검토하고 변경사항을 수용하기 위해 구현하는 모든 수정사항을 테스트하는 것이 중요합니다.
변경 | 요약 | 추가 참조 |
---|---|---|
백그라운드 위치 업데이트 빈도가 더 적음 | 앱이 백그라운드 서비스에서 위치 업데이트를 수신하는 경우 Android 8.0 (API 수준 26)에서는 이전 Android 버전에 비해 업데이트 빈도가 줄어듭니다. 특히 백그라운드 서비스는 위치 업데이트를 시간당 몇 번 이상 수신할 수 없습니다. 그러나 앱이 포그라운드에 있는 동안에는 위치 업데이트 빈도가 변경되지 않습니다. | 백그라운드 위치 제한 |
net.hostname 가 더 이상 지원되지 않음
|
net.hostname 시스템 속성을 쿼리하면 null 결과가 생성됩니다.
|
없음 |
send(DatagramPacket) 의 새로운 예외 |
이전에 실행된 connect(InetAddress, int) 메서드가 실패하면 send(DatagramPacket) 메서드에서 SocketException 이 발생합니다.
|
동작 변경사항: 네트워크 및 HTTP(S) 연결 |
AbstractCollection 메서드의 적절한 NullPointerException
|
이제 AbstractCollection.removeAll(null) 및 AbstractCollection.retainAll(null) 에서 항상 NullPointerException 이 발생합니다. 이전에는 컬렉션이 비어 있을 때 NullPointerException 이 발생하지 않았습니다.
이런 변경은 동작이 문서와 일치하도록 만듭니다.
|
동작 변경사항: 컬렉션 처리 |
Currency.getDisplayName(null) 의 적절한 NullPointerException
|
Currency.getDisplayName(null) 를 호출하면 NullPointerException 이 발생합니다.
|
동작 변경사항: 언어 및 다국어화 |
Android 8.0(API 수준 26)의 동작 변경사항 목록을 더 자세히 보려면 Android 8.0 동작 변경사항도 참고하세요.
타겟 버전 업데이트 및 Android 8.0 기능 사용
이 섹션에서는 targetSdkVersion
을 26으로 업데이트하고 Android 8.0에서 제공되는 새로운 기능을 추가하여 Android 8.0(API 수준 26)을 완전히 지원하는 방법을 설명합니다.
Android 8.0에서는 새로운 API를 제공할 뿐만 아니라 targetSdkVersion
을 26으로 업데이트할 때 몇 가지 동작 변경사항이 도입되었습니다. 일부 동작 변경사항의 경우 중단을 방지하기 위해 코드 변경이 필요할 수 있으므로 먼저 Android 8.0을 타겟팅하는 앱의 모든 동작 변경사항을 검토하여 targetSdkVersion
를 변경할 때 앱이 어떤 영향을 받을 수 있는지 이해해야 합니다.
참고: 플랫폼 호환성을 보장하기 위해 위에 설명된 단계는 Android 8.0을 타겟팅하는 앱의 전제 조건이므로 이 단계를 먼저 완료해야 합니다.
Android 8.0 SDK 가져오기
SDK 패키지를 가져와서 최신 버전의 Android 스튜디오(Android 스튜디오 3.0 이상 권장)를 사용하여 Android 8.0 (API 수준 26)으로 앱을 빌드할 수 있습니다. Android 스튜디오 3.0 이상에는 적응형 아이콘, 다운로드 가능한 글꼴 등 Android 8.0 기능을 지원하는 도구가 포함되어 있습니다. 아직 이러한 기능이 필요하지 않다면 안정적인 버전의 Android 스튜디오 2.3.3을 사용하여 Android 8.0으로 앱을 빌드하고 새 API를 사용할 수 있습니다.
두 가지 버전의 Android 스튜디오로 설정하려면 다음 단계를 따르세요.
- Android 스튜디오를 시작하고 Tools > SDK Manager를 클릭하여 SDK Manager를 엽니다.
- SDK Platforms 탭에서 Show Package Details를 선택합니다. Android 8.0 미리보기 아래에서 다음을 확인합니다.
- Android SDK 플랫폼 26
- Google API Intel x86 Atom 시스템 이미지(에뮬레이터에만 필요)
- SDK Tools 탭으로 전환하고 사용 가능한 업데이트가 있는 모든 항목을 선택합니다 (대시 가 표시된 각 체크박스 클릭). 여기에는 필요한 다음 항목의 최신 버전이 포함되어야 합니다.
- Android SDK 빌드 도구 26.0.0
- Android SDK 플랫폼 도구 26.0.0
- Android Emulator 26.0.0
- OK를 클릭하여 선택한 SDK 패키지를 모두 설치합니다.
이제 Android 8.0으로 빌드를 시작할 수 있습니다.
빌드 구성 업데이트
compileSdkVersion
, targetSdkVersion
, 지원 라이브러리 버전을 사용 가능한 최신 버전으로 업데이트합니다. 예를 들면 다음과 같습니다.
android { compileSdkVersion 26 defaultConfig { targetSdkVersion 26 } ... } dependencies { compile 'com.android.support:appcompat-v7:26.0.0' } // REQUIRED: Google's new Maven repo is required for the latest // support library that is compatible with Android 8.0 repositories { google() // If you're using a version of Gradle lower than 4.1, you must instead use: // maven { // url 'https://maven.google.com' // } }
매니페스트 파일에서 브로드캐스트 수신기 제거
Android 8.0 (API 수준 26)에서는 broadcast receiver에 관한 새로운 제한사항을 도입하므로 암시적 broadcast receiver에 등록된 모든 broadcast receiver를 삭제해야 합니다. 그대로 두어도 빌드 시 또는 런타임에 앱이 중단되지는 않지만 앱이 Android 8.0에서 실행될 때는 아무런 영향을 미치지 않습니다.
앱만 응답할 수 있는 브로드캐스트(명시적 브로드캐스트 인텐트 및 앱의 패키지 이름으로 전송된 브로드캐스트)는 Android 8.0에서 계속 동일하게 작동합니다.
이 새로운 제한에는 예외가 있습니다. Android 8.0을 타겟팅하는 앱에서 계속 작동하는 암시적 브로드캐스트 목록은 암시적 브로드캐스트 예외를 참고하세요.
Android 8.0 앱 테스트
위의 준비가 완료되면 앱을 빌드한 다음 추가로 테스트하여 Android 8.0(API 수준 26)을 타겟팅할 때 제대로 작동하는지 확인할 수 있습니다. 이 시점에서 핵심 앱 품질 가이드라인과 테스트 권장사항을 검토하는 것이 좋습니다.
targetSdkVersion
를 26으로 설정하고 앱을 빌드할 때는 알아야 하는 특정한 플랫폼 변경사항이 있습니다. 이러한 변경사항 중 일부는 Android 8.0에서 새 기능을 구현하지 않더라도 앱 동작에 상당한 영향을 미치거나 심지어 앱을 완전히 중단시킬 수도 있습니다.
표 2는 이러한 변경사항 목록이며 상세 정보에 연결되는 링크를 함께 제공합니다.
변경 | 요약 | 추가 참조 |
---|---|---|
개인 정보 보호 | Android 8.0 (API 수준 26)은 net.dns1, net.dns2, net.dns3 또는 net.dns4 시스템 속성 사용을 지원하지 않습니다. | 동작 변경사항: 개인 정보 보호 |
쓰기 가능 및 실행 가능 세그먼트에 적용되는 규칙 | 네이티브 라이브러리의 경우 Android 8.0 (API 수준 26)은 데이터를 실행할 수 없으며 코드를 쓸 수 없어야 한다는 규칙을 적용합니다. | 동작 변경사항: 네이티브 라이브러리 |
ELF 헤더 및 섹션 유효성 검사 | 동적 링커는 ELF 헤더와 섹션 헤더에서 더 많은 값을 확인하며, 값이 유효하지 않으면 실패합니다. | 동작 변경사항: 네이티브 라이브러리 |
알림 | Android 8.0 (API 수준 26) 버전의 SDK를 타겟팅하는 앱은 사용자에게 알림을 게시하려면 하나 이상의 알림 채널을 구현해야 합니다. | API 개요: 알림 |
List.sort() 메서드
|
이 메서드의 구현에서는 더 이상 Collections.sort() 를 호출하지 않거나 스택 오버플로로 인해 앱에서 예외가 발생합니다.
|
동작 변경사항: 컬렉션 처리 |
Collections.sort() 메서드
|
이제 List 구현에서는 Collections.sort() 이 ConcurrentModificationException 을 발생시킵니다.
|
동작 변경사항: 컬렉션 처리 |
Android 8.0 (API 수준 26)의 동작 변경사항 목록을 더 자세히 보려면 Android 8.0 동작 변경사항을 참조하세요.
Android 8.0 (API 수준 26)에서 사용할 수 있는 새로운 기능과 API를 살펴보려면 Android 8.0 기능 및 API를 참고하세요.