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 관리자Android 8.0 아래 Google APIs Intel x86 Atom 시스템 이미지로 표시되어 있습니다.

    참고: 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 스튜디오 3.0 이상 권장)를 사용하여 Android 8.0 (API 수준 26)으로 앱을 빌드하기 위한 SDK 패키지를 가져올 수 있습니다. 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 APIs Intel x86 Atom 시스템 이미지(에뮬레이터에만 필요)
  3. SDK Tools 탭으로 전환하고 업데이트가 있는 모든 항목을 선택합니다 (대시 가 표시된 각 체크박스를 클릭). 여기에는 다음 필수 항목의 최신 버전이 포함되어야 합니다.
    • Android SDK 빌드 도구 26.0.0
    • Android SDK Platform-Tools 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)에는 새로운 브로드캐스트 수신기 제한이 도입되었으므로 암시적 브로드캐스트 인텐트에 등록된 모든 브로드캐스트 수신기를 삭제해야 합니다. 이 속성을 그대로 두어도 빌드 시 또는 런타임에 앱이 중단되지는 않지만 앱이 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() 메서드 List 구현에서 이제 Collections.sort()ConcurrentModificationException을 발생시킵니다. 동작 변경사항: 컬렉션 처리

Android 8.0 (API 수준 26)의 동작 변경사항에 관한 자세한 목록은 Android 8.0 동작 변경사항을 참고하세요.

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