Android 8.0으로 마이그레이션

Android 8.0 (API 수준 26)에는 동작 변경사항과 함께 앱에서 활용할 수 있는 새로운 기능과 API가 도입되었습니다. 이 문서에서는 두 가지 주요 단계에 걸쳐 앱을 Android 8.0으로 이전하는 단계를 간략하게 설명합니다.

  1. Android 8.0과의 호환성 보장

    새로운 버전의 플랫폼에서 앱이 올바로 작동하는지 확인합니다. 이 단계에서는 새 API를 사용하거나 앱의 targetSdkVersion를 변경하지 않지만 사소한 변경이 필요할 수 있습니다.

  2. 타겟 버전 업데이트 및 Android 8.0 기능 사용

    플랫폼의 새로운 기능을 활용할 준비가 되면 targetSdkVersion를 26으로 업데이트하고 앱이 계속 예상대로 작동하는지 확인한 후 새 API를 사용하기 시작합니다.

Android 8.0과의 호환성 보장

여기서의 목표는 기존 앱이 Android 8.0(API 수준 26)에서 그대로 작동하도록 하는 것입니다. 일부 플랫폼 변경사항은 앱의 동작 방식에 영향을 줄 수 있으므로 일부 조정이 필요할 수 있지만, 새 API를 사용하거나 targetSdkVersion를 변경할 필요는 없습니다.

단계별로 Android 8.0과의 호환성 보장

Android 8.0을 실행하는 기기 준비

  • 호환되는 기기 (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P 또는 Nexus Player)가 있다면 안내에 따라 기기를 플래시하세요.
  • 또는 Android Emulator용 Android 8.0 시스템 이미지를 다운로드합니다. SDK ManagerAndroid 8.0 아래에 Google API 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의 주요 변경사항을 검토하고 변경사항을 수용하기 위해 구현하는 모든 수정사항을 테스트하는 것이 중요합니다.

표 1. Android 8.0 기기에서 실행되는 모든 앱에 영향을 미치는 주요 변경사항

변경 요약 추가 참조
백그라운드 위치 업데이트 빈도가 더 적음 앱이 백그라운드 서비스에서 위치 업데이트를 수신하는 경우 이전 버전의 Android에 비해 Android 8.0 (API 수준 26)에서는 업데이트 빈도가 줄어듭니다. 특히 백그라운드 서비스는 시간당 몇 번을 초과하여 위치 업데이트를 받을 수 없습니다. 그러나 앱이 포그라운드에 있는 동안 위치 업데이트 속도는 변경되지 않습니다. 백그라운드 위치 액세스 제한
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 기능을 단계별로 사용해 보세요.

Android 8.0 SDK 가져오기

Android 스튜디오의 최신 버전을 사용하여 Android 8.0(API 수준 26)으로 앱을 빌드하기 위한 SDK 패키지를 가져올 수 있습니다 (Android 스튜디오 3.0 이상 권장). Android 스튜디오 3.0 이상에는 적응형 아이콘다운로드 가능한 글꼴과 같이 Android 8.0 기능을 지원하는 도구가 포함되어 있습니다. 아직 이러한 기능이 필요하지 않다면 안정화 버전의 Android 스튜디오 2.3.3을 사용하여 Android 8.0으로 앱을 빌드하고 새 API를 사용할 수 있습니다.

두 버전 중 하나의 Android 스튜디오를 사용하여 설정하려면 다음 단계를 따르세요.

  1. Android 스튜디오를 시작하고 Tools > SDK Manager를 클릭하여 SDK Manager를 엽니다.
  2. SDK Platforms 탭에서 Show Package Details를 선택합니다. Android 8.0 미리보기 아래에서 다음을 확인합니다.
    • Android SDK 플랫폼 26
    • Google API Intel x86 Atom 시스템 이미지(에뮬레이터에만 필요)
  3. SDK Tools 탭으로 전환하고 사용 가능한 업데이트가 있는 모든 항목을 선택합니다 (대시 가 표시된 각 체크박스를 클릭). 여기에는 다음 필수 항목의 최신 버전이 포함되어야 합니다.
    • Android SDK 빌드 도구 26.0.0
    • Android SDK 플랫폼 도구 26.0.0
    • Android Emulator 26.0.0
  4. 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를 삭제해야 합니다. 그대로 두면 빌드 시 또는 런타임에 앱이 중단되지 않지만 Android 8.0에서 앱을 실행할 때는 아무런 영향을 미치지 않습니다.

앱만 응답할 수 있는 브로드캐스트(특히 앱의 패키지 이름으로 전송된 명시적 브로드캐스트 인텐트 및 브로드캐스트)는 Android 8.0에서 계속 동일하게 작동합니다.

이 새로운 제한에는 예외가 있습니다. Android 8.0을 타겟팅하는 앱에서 계속 작동하는 암시적 브로드캐스트 목록은 암시적 브로드캐스트 예외를 참고하세요.

Android 8.0 앱 테스트

위의 준비가 완료되면 앱을 빌드하고 추가로 테스트하여 Android 8.0(API 수준 26)을 타겟팅할 때 제대로 작동하는지 확인할 수 있습니다. 이 시점에서 핵심 앱 품질 가이드라인테스트 권장사항을 검토하는 것이 좋습니다.

targetSdkVersion를 26으로 설정하고 앱을 빌드하는 경우 알아야 하는 특정한 플랫폼 변경사항이 있습니다. 이러한 변경사항 중 일부는 Android 8.0에서 새 기능을 구현하지 않더라도 앱 동작에 상당한 영향을 미치거나 심지어 앱을 완전히 중단시킬 수도 있습니다.

표 2는 이러한 변경사항 목록이며 상세 정보에 연결되는 링크를 함께 제공합니다.

표 2. targetSdkVersion가 26으로 설정된 경우 앱에 영향을 미치는 주요 변경사항

변경 요약 추가 참조
개인 정보 보호 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() 메서드 이제 목록 구현에서는 Collections.sort()ConcurrentModificationException을 발생시킵니다. 동작 변경사항: 컬렉션 처리

Android 8.0 (API 수준 26)의 동작 변경사항 목록을 더 자세히 알아보려면 Android 8.0 동작 변경사항을 참고하세요.

Android 8.0 (API 수준 26)에서 사용할 수 있는 새로운 기능과 API를 살펴보려면 Android 8.0 기능 및 API를 참고하세요.