Android 8.0 기능 및 API

Android 8.0 (API 수준 26)에는 사용자와 개발자를 위한 다양한 새로운 기능이 도입되었습니다. 이 문서에서는 개발자를 위한 새로운 기능을 소개합니다.

Android 8.0 동작 변경사항에서도 플랫폼 변경사항이 앱에 영향을 줄 수 있는 분야에 관해 알아보세요.

사용자 경험

PIP 모드

Android 8.0의 PIP 모드

Android 8.0(API 수준 26)에서는 활동을 PIP 모드로 실행할 수 있습니다. PIP는 주로 동영상 재생에 사용되는 특수한 유형의 멀티 윈도우 모드입니다. PIP 모드는 원래 Android TV에서만 사용할 수 있었지만 Android 8.0은 다른 Android 기기에서 이 기능을 사용할 수 있게 해 줍니다.

활동이 PIP 모드인 경우 일시중지 상태이지만 콘텐츠를 계속 표시해야 합니다. 따라서 앱의 onPause() 핸들러에서 재생을 일시중지하지 않아야 합니다. 대신 onStop()에서 동영상을 일시중지하고 onStart()에서 재생을 다시 시작해야 합니다. 자세한 내용은 멀티 윈도우 수명 주기를 참고하세요.

활동이 PIP 모드를 사용할 수 있도록 지정하려면 매니페스트에서 android:supportsPictureInPicture를 true로 설정하세요. Android 8.0부터는 PIP에 android:resizeableActivity 매니페스트 속성이 필요하지 않습니다. 그러나 활동이 다른 멀티 윈도우 모드를 지원하는 경우 android:resizeableActivity를 'true'로 설정해야 합니다.)

Android 8.0 (API 수준 26)에는 PictureInPictureParams라는 새로운 객체가 도입되었습니다. 이 객체를 PIP 메서드에 전달하여 PIP 모드일 때 활동이 동작하는 방식을 지정합니다. 이 객체는 활동의 기본 가로세로 비율과 같은 속성을 지정합니다.

PIP 모드 추가에 설명된 기존 PIP 메서드는 이제 Android TV뿐만 아니라 모든 Android 기기에서 사용할 수 있습니다. 또한 Android 8.0은 PIP 모드를 지원하기 위해 다음 메서드를 제공합니다.

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): 활동을 PIP 모드로 배치합니다. 활동의 가로세로 비율과 기타 구성 설정은 args에 의해 지정됩니다. args의 필드가 비어 있는 경우 시스템은 마지막으로 Activity.setPictureInPictureParams()를 호출했을 때 설정된 값을 사용합니다.

    지정된 활동은 화면 모서리에 배치됩니다. 화면의 나머지 부분은 화면에 있던 이전 활동으로 채워집니다. PIP 모드로 전환되는 활동은 일시중지 상태로 전환되지만 시작된 상태를 유지합니다. 사용자가 PIP 활동을 탭하면 시스템은 사용자가 상호작용할 수 있는 메뉴를 표시합니다. PIP 상태에 있는 동안에는 터치 이벤트가 활동에 도달하지 않습니다.

  • Activity.setPictureInPictureParams(): 활동의 PIP 구성 설정을 업데이트합니다. 활동이 현재 PIP 모드이면 설정이 업데이트됩니다. 이는 활동의 가로세로 비율이 변경될 때 유용합니다. 활동이 PIP 모드가 아닌 경우 호출하는 enterPictureInPictureMode() 메서드와 관계없이 이러한 구성 설정이 사용됩니다.

알림

Android 8.0 (API 수준 26)에서는 알림 동작과 설정을 더 쉽고 일관된 방법으로 관리할 수 있도록 알림을 새롭게 디자인했습니다. 변경사항은 다음과 같습니다.

    Android 8.0 (API 수준 26)의 알림 길게 누르기 메뉴

    사용자는 Android 8.0에서 앱 런처 아이콘을 길게 눌러 알림을 볼 수 있습니다.

  • 알림 채널: Android 8.0에는 표시하려는 각 알림 유형에 대해 사용자가 맞춤설정할 수 있는 채널을 만들 수 있는 알림 채널이 도입되었습니다. 사용자 인터페이스에서는 알림 채널을 알림 카테고리라고 합니다. 알림 채널을 구현하는 방법을 알아보려면 알림 채널 관리를 참고하세요.
  • 알림 표시 점: Android 8.0에서는 앱 런처 아이콘에 점 또는 배지를 표시할 수 있도록 지원합니다. 알림 표시 점은 사용자가 아직 닫지 않았거나 조치를 취하지 않은 알림이 있는지 나타냅니다. 알림 표시 점을 사용하는 방법을 알아보려면 알림 배지를 참고하세요.
  • 다시 알림: 사용자는 알림을 일시중지할 수 있으며, 일시중지 시 알림이 일정 시간 동안 사라진 후 다시 표시됩니다. 알림은 처음에 표시된 것과 동일한 중요도 수준으로 다시 표시됩니다. 앱에서 일시 중지된 알림을 삭제하거나 업데이트할 수 있지만 다시 알림 설정된 알림을 업데이트해도 알림이 다시 표시되지는 않습니다.
  • 알림 시간 제한: 알림을 만들 때 setTimeoutAfter()를 사용하여 제한 시간을 설정할 수 있습니다. 이 메서드를 사용하여 알림을 취소해야 하는 기간을 지정할 수 있습니다. 필요한 경우 지정된 제한 시간이 지나기 전에 알림을 취소할 수 있습니다.
  • 알림 설정: setSettingsText()를 호출하여 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES 인텐트를 사용하여 알림에서 앱의 알림 설정 링크를 만들 때 표시되는 텍스트를 설정할 수 있습니다. 시스템은 앱이 사용자에게 표시해야 하는 설정을 필터링하기 위해 인텐트와 함께 EXTRA_CHANNEL_ID, NOTIFICATION_TAG, NOTIFICATION_ID 등의 추가 항목을 제공할 수도 있습니다.
  • 알림 닫기: 사용자가 직접 알림을 닫을 수 있으며 앱에서 프로그래매틱 방식으로 알림을 삭제할 수 있습니다. 알림이 닫힌 시점과 알림을 닫는 이유는 NotificationListenerService 클래스의 onNotificationRemoved() 메서드를 구현하여 결정할 수 있습니다.
  • 배경 색상: 알림의 배경 색상을 설정하고 사용 설정할 수 있습니다. 사용자가 한눈에 확인할 수 있는 진행 중인 작업의 알림에서만 이 기능을 사용해야 합니다. 예를 들어 운전 경로나 진행 중인 전화와 관련된 알림의 배경 색상을 설정할 수 있습니다. setColor()를 사용하여 원하는 배경 색상을 설정할 수도 있습니다. 이렇게 하면 setColorized()를 사용하여 알림에 배경 색상을 사용할 수 있습니다.
  • 메시징 스타일: Android 8.0에서 MessagingStyle 클래스를 사용하는 알림은 더 많은 콘텐츠를 접힌 형태로 표시합니다. 메시지와 관련된 알림에는 MessagingStyle 클래스를 사용해야 합니다. addHistoricMessage() 메서드를 사용하여 메시지 관련 알림에 기록 메시지를 추가하여 대화에 컨텍스트를 제공할 수도 있습니다.

자동 완성 프레임워크

계정 생성, 로그인, 신용카드 거래는 시간이 걸리며 오류가 발생하기 쉽습니다. 사용자는 이러한 유형의 반복적인 작업을 요구하는 앱에 쉽게 불만을 느낄 수 있습니다.

Android 8.0 (API 수준 26)에서는 자동 완성 프레임워크가 도입되어 로그인 양식, 신용카드 양식 등의 양식을 더 쉽게 입력할 수 있습니다. 사용자가 자동 완성을 선택하면 기존 앱과 새 앱이 자동 완성 프레임워크에서 작동합니다.

앱에서 프레임워크를 사용하는 방식을 최적화하기 위해 몇 가지 단계를 취할 수 있습니다. 자세한 내용은 자동 완성 프레임워크 개요를 참고하세요.

다운로드 가능한 글꼴

Android 8.0 (API 수준 26) 및 Android 지원 라이브러리 26을 사용하면 글꼴을 APK에 번들로 묶거나 APK에서 글꼴을 다운로드하도록 허용하는 대신 제공업체 애플리케이션에서 글꼴을 요청할 수 있습니다. 이 기능은 APK 크기를 줄이고 앱 설치 성공률을 높이며 여러 앱이 동일한 글꼴을 공유할 수 있도록 합니다.

글꼴 다운로드에 관한 자세한 내용은 다운로드 가능한 글꼴을 참고하세요.

XML의 글꼴

Android 8.0 (API 수준 26)에는 글꼴을 리소스로 사용할 수 있는 Fonts in XML이라는 새로운 기능이 도입되었습니다. 즉, 글꼴을 애셋으로 번들로 묶을 필요가 없습니다. 글꼴은 R 파일에서 컴파일되며 자동으로 시스템에서 리소스로 사용할 수 있습니다. 그런 다음 새로운 리소스 유형인 font의 도움을 사용하여 이 글꼴에 액세스할 수 있습니다.

지원 라이브러리 26은 API 버전 14 이상을 실행하는 기기에서 이 기능을 완벽하게 지원합니다.

글꼴을 리소스로 사용하고 시스템 글꼴을 검색하는 방법에 관한 자세한 내용은 XML의 글꼴을 참고하세요.

TextView 자동 크기 조절

Android 8.0 (API 수준 26)에서는 TextView의 크기에 따라 텍스트의 크기를 자동으로 확장하거나 축소할 수 있습니다. 즉, 다양한 화면이나 동적 콘텐츠로 텍스트 크기를 훨씬 쉽게 최적화할 수 있습니다. Android 8.0의 TextView 자동 크기 조절에 관한 자세한 내용은 TextView 자동 크기 조절을 참고하세요.

적응형 아이콘

Android 8.0 (API 수준 26)에는 적응형 런처 아이콘이 도입됩니다. 적응형 아이콘은 시각적 효과를 지원하며 여러 기기 모델에서 다양한 모양을 표시할 수 있습니다. 적응형 아이콘을 만드는 방법을 알아보려면 적응형 아이콘 가이드를 참고하세요.

색상 관리

이미징 앱을 개발하는 Android 개발자는 이제 고색 재현 기능을 갖춘 새로운 기기를 활용할 수 있습니다. 넓은 색 영역 이미지를 표시하려면 앱은 매니페스트에서 (활동별) 플래그를 사용 설정하고 삽입된 넓은 색 프로필 (AdobeRGB, Pro Photo RGB, DCI-P3 등)이 있는 비트맵을 로드해야 합니다.

WebView API

Android 8.0은 앱에서 웹 콘텐츠를 표시하는 WebView 객체를 관리하는 데 도움이 되는 여러 API를 제공합니다. 앱의 안정성과 보안을 개선하는 이러한 API는 다음과 같습니다.

  • 버전 API
  • Google SafeBrowsing API
  • Termination Handle API
  • 렌더기 중요도 API

이러한 API 사용 방법에 관한 자세한 내용은 WebView 관리를 참고하세요.

웹 브라우징의 보안을 강화하기 위해 이제 WebView 클래스에 Safe Browsing API가 포함됩니다. 자세한 내용은 Google Safe Browsing API를 참고하세요.

바로가기 및 위젯 고정

Android 8.0 (API 수준 26)에는 바로가기 및 위젯의 인앱 고정이 도입되었습니다. 앱에서 사용자 권한에 따라 지원되는 런처에 고정된 바로가기와 위젯을 만들 수 있습니다.

자세한 내용은 바로가기 및 위젯 고정 기능 가이드를 참고하세요.

최대 화면 가로세로 비율

Android 8.0 (API 수준 26)에서는 앱의 최대 가로세로 비율을 구성하는 방법이 변경되었습니다.

첫째, Android 8.0에는 앱의 최대 가로세로 비율을 설정하는 데 사용할 수 있는 maxAspectRatio 속성이 도입되었습니다. 또한 Android 8.0 이상에서 앱의 기본 최대 가로세로 비율은 앱이 실행되는 기기의 기본 가로세로 비율입니다.

최대 가로세로 비율 선언에 관한 자세한 내용은 여러 화면 지원을 참고하세요.

다중 디스플레이 지원

Android 8.0 (API 수준 26)부터 플랫폼에서 다중 디스플레이 지원을 강화합니다. 활동이 멀티 윈도우 모드를 지원하고 다중 디스플레이가 있는 기기에서 실행되는 경우 사용자는 한 디스플레이에서 다른 디스플레이로 활동을 이동할 수 있습니다. 앱이 활동을 실행하면 앱은 활동을 실행할 디스플레이를 지정할 수 있습니다.

참고: 활동이 멀티 윈도우 모드를 지원하는 경우 Android 8.0은 해당 활동에 다중 디스플레이 지원을 자동으로 사용 설정합니다. 앱을 테스트하여 다중 디스플레이 환경에서 적절하게 작동하는지 확인해야 합니다.

앱에 여러 디스플레이가 있더라도 한 번에 하나의 활동만 재개된 상태일 수 있습니다. 포커스가 있는 활동은 재개된 상태에 있으며, 표시되는 다른 모든 활동은 일시중지되지만 중지되지는 않습니다. 여러 활동이 표시되는 경우의 활동 수명 주기에 관한 자세한 내용은 멀티 윈도우 수명 주기를 참고하세요.

사용자가 활동을 한 디스플레이에서 다른 디스플레이로 이동하면 시스템은 활동의 크기를 조절하고 필요에 따라 런타임 변경을 실행합니다. 활동이 구성 변경을 직접 처리하거나, 시스템이 활동이 포함된 프로세스를 폐기하고 새 크기로 이 프로세스를 다시 만들도록 할 수 있습니다. 자세한 내용은 구성 변경 처리를 참고하세요.

ActivityOptions는 다중 디스플레이를 지원하는 두 가지 새로운 메서드를 제공합니다.

setLaunchDisplayId()
활동이 시작될 때 활동이 표시되어야 하는 디스플레이를 지정합니다.
getLaunchDisplayId()
활동의 현재 실행 디스플레이를 반환합니다.

adb 셸이 다중 디스플레이를 지원하도록 확장되었습니다. 이제 shell start 명령어를 사용하여 활동을 실행하고 활동의 타겟 디스플레이를 지정할 수 있습니다.

adb shell start <activity_name> --display <display_id>

통합된 레이아웃 여백 및 패딩

Android 8.0 (API 수준 26)에서는 View 요소의 반대쪽에서 동일한 여백이나 패딩을 사용하는 상황을 더 쉽게 지정할 수 있습니다. 특히 이제 레이아웃 XML 파일에서 다음 속성을 사용할 수 있습니다.

참고: 텍스트 방향을 포함하여 다양한 언어와 문화를 지원하도록 앱의 로직을 맞춤설정하면 이러한 속성이 layout_marginStart, layout_marginEnd, paddingStart, paddingEnd 값에 영향을 미치지 않는다는 점에 유의하세요. 새로운 세로 및 가로 레이아웃 속성 외에도 이러한 값을 직접 설정하여 텍스트 방향에 따라 달라지는 레이아웃 동작을 만들 수 있습니다.

포인터 캡처

게임, 원격 데스크톱, 가상화 클라이언트와 같은 일부 앱은 마우스 포인터를 제어하는 데 큰 도움이 됩니다. 포인터 캡처는 모든 마우스 이벤트를 앱의 포커스가 맞춰진 뷰로 전달하여 이러한 컨트롤을 제공하는 Android 8.0 (API 수준 26)의 새로운 기능입니다.

Android 8.0부터 앱의 View은 포인터 캡처를 요청하고 캡처된 포인터 이벤트를 처리하기 위한 리스너를 정의할 수 있습니다. 이 모드에서는 마우스 포인터가 숨겨집니다. 뷰는 더 이상 마우스 정보가 필요하지 않을 때 포인터 캡처를 해제할 수 있습니다. 시스템은 뷰가 포커스를 잃을 때(예: 사용자가 다른 앱을 열 때) 포인터 캡처를 해제할 수도 있습니다.

앱에서 이 기능을 사용하는 방법에 관한 자세한 내용은 포인터 캡처를 참고하세요.

앱 카테고리

Android 8.0 (API 수준 26)에서는 각 앱이 적절한 경우 적절한 카테고리를 선언할 수 있습니다. 이러한 카테고리는 사용자에게 데이터를 표시할 때(예: 데이터 사용량, 배터리 사용량 또는 저장소 사용량) 비슷한 목적이나 기능을 가진 앱을 함께 클러스터링하는 데 사용됩니다. <application> 매니페스트 태그에 android:appCategory 속성을 설정하여 앱의 카테고리를 정의할 수 있습니다.

Android TV 런처

Android 8.0 (API 수준 26)에는 Android 8.0용 Android TV 에뮬레이터 및 Nexus Player 기기 이미지와 함께 사용할 수 있는 새로운 콘텐츠 중심의 Android TV 홈 화면 환경이 포함되어 있습니다. 새 홈 화면에서는 동영상 콘텐츠를 채널에 상응하는 행에 구성하며, 각 채널에는 시스템의 앱에 의해 프로그램이 채워집니다. 앱은 여러 채널을 게시할 수 있으며, 사용자는 홈 화면에 표시할 채널을 구성할 수 있습니다. Android TV 홈 화면에는 사용자의 시청 습관에 따라 앱의 프로그램으로 채워진 다음 볼만한 동영상 행도 포함되어 있습니다. 앱은 사용자가 프로그램에 포커스를 맞추면 자동으로 재생되는 동영상 미리보기도 제공할 수 있습니다. 채널 및 프로그램을 채우기 위한 API는 Android 8.0에서 Android 지원 라이브러리 모듈로 배포되는 TvProvider API의 일부입니다.

AnimatorSet

Android 8.0 (API 수준 26)부터 AnimatorSet API는 탐색 및 역방향 탐색을 지원합니다. 탐색을 사용하면 애니메이션 세트의 위치를 특정 시점으로 설정할 수 있습니다. 역방향 재생은 앱에 실행 취소할 수 있는 작업에 애니메이션이 포함되어 있는 경우 유용합니다. 별도의 애니메이션 세트 두 개를 정의하는 대신 동일한 애니메이션 세트를 역방향으로 재생할 수 있습니다.

입력 및 탐색

키보드 탐색 클러스터

앱의 활동이 그림 2와 같이 복잡한 뷰 계층 구조를 사용하는 경우 UI 요소 그룹을 클러스터로 구성하여 키보드 탐색을 쉽게 할 수 있도록 하는 것이 좋습니다. 사용자는 Meta+Tab 또는 Search+Tab(Chromebook 기기) 키를 눌러 한 클러스터에서 다른 클러스터로 이동할 수 있습니다. 클러스터의 좋은 예로는 측면 패널, 탐색 메뉴, 기본 콘텐츠 영역, 여러 하위 요소를 포함할 수 있는 요소가 있습니다.

사용자가 키보드 탐색 클러스터 단축키를 사용하여 탐색할 수 있는 5개의 탐색 클러스터가 포함된 활동의 예 클러스터는 상단 패널, 왼쪽 패널, 기본 콘텐츠 영역, 하단 패널, 플로팅 작업 버튼과 같은 배열로 표시됩니다.
그림 2. 5개의 탐색 클러스터가 포함된 활동

View 또는 ViewGroup 요소를 클러스터로 만들려면 요소의 레이아웃 XML 파일에서 android:keyboardNavigationCluster 속성을 true로 설정하거나 앱의 UI 로직에서 truesetKeyboardNavigationCluster()에 전달합니다.

참고: 클러스터는 중첩될 수 없지만, 중첩되지 않은 클러스터는 계층 구조의 여러 수준에서 나타날 수 있습니다. 클러스터를 중첩하려고 하면 프레임워크는 최상위 ViewGroup 요소만 클러스터로 취급합니다.

터치스크린이 있는 기기에서는 계기판 지정 ViewGroup 객체의 android:touchscreenBlocksFocus 요소를 true로 설정하여 클러스터 전용의 클러스터 안팎으로 이동할 수 있습니다. 이 구성을 클러스터에 적용하면 사용자는 Tab 키나 화살표 키를 사용하여 클러스터 안으로 이동하거나 클러스터 밖으로 이동할 수 없습니다. 대신 클러스터 탐색 키보드 조합을 눌러야 합니다.

기본 포커스 보기

Android 8.0(API 수준 26)에서는 (다시) 생성된 활동이 재개되고 사용자가 키보드 탐색 키(예: 탭 키)를 누른 후 포커스를 받아야 하는 View를 할당할 수 있습니다. 이 '기본적으로 포커스' 설정을 적용하려면 UI 요소가 포함된 레이아웃 XML 파일에서 View 요소의 android:focusedByDefault 속성을 true로 설정하거나 앱의 UI 로직에서 truesetFocusedByDefault()에 전달합니다.

음성 출력

활동과 서비스는 TextToSpeech 인스턴스를 사용하여 콘텐츠를 받아쓰고 발음할 수 있습니다. Android 8.0 (API 수준 26)부터 앱은 엔진이 이 정보를 제공하는 한 텍스트 음성 변환 엔진이 합성된 개별 단어를 말하기 시작하는 시점에 관한 더 정확한 타이밍 정보를 가져올 수 있습니다. 이 기능을 사용하면 텍스트 음성 변환 엔진이 특정 단어를 말할 때 특정 단어에 주의를 기울일 수 있습니다.

앱에서 이러한 텍스트 음성 변환 엔진 개선사항을 사용하려면 UtteranceProgressListener 인스턴스를 등록하세요. 등록 프로세스의 일부로 onRangeStart() 메서드의 핸들러를 포함합니다.

텍스트 음성 변환 엔진은 rangeStart()를 호출하여 특정 범위의 텍스트에서 오디오 재생이 시작될 것으로 예상되는 시점을 기록합니다. 이 텍스트 범위의 오디오가 재생을 시작하면 앱의 onRangeStart() 메서드가 실행됩니다. 그러면 앱은 발화와 연결된 텍스트 범위를 강조표시하는 등 이 콜백에 응답할 수 있습니다.

텍스트 음성 변환 엔진의 재생 진행률 추적에 관한 자세한 내용은 UtteranceProgressListener 클래스 참조를 참고하세요.

시스템

새로운 StrictMode 탐지기

Android 8.0 (API 수준 26)에는 앱의 잠재적인 버그를 식별하는 데 도움이 되는 세 가지 새로운 StrictMode 감지기가 추가되었습니다.

  • detectUnbufferedIo()는 앱이 버퍼링 없이 데이터를 읽거나 쓸 때를 감지하여 성능에 상당한 영향을 미칠 수 있습니다.
  • detectContentUriWithoutPermission()는 앱 외부에서 활동을 시작할 때 앱이 실수로 다른 앱에 권한을 부여하는 것을 잊은 경우를 감지합니다.
  • detectUntaggedSockets()는 앱이 setThreadStatsTag(int)를 사용하지 않고 디버깅 목적으로 트래픽에 태그를 지정하지 않고 네트워크 트래픽을 실행하는 경우를 감지합니다.

캐시된 데이터

Android 8.0 (API 수준 26)은 캐시된 데이터에 대해 더 나은 지침과 동작을 제공합니다. 이제 getCacheQuotaBytes(UUID)에서 반환된 캐시된 데이터의 디스크 공간 할당량이 각 앱에 제공됩니다.

시스템이 디스크 공간을 확보해야 하는 경우 먼저 할당된 할당량을 초과하는 캐시 파일을 앱에서 삭제합니다. 따라서 캐시된 데이터를 할당된 할당량 미만으로 유지하면 캐시된 파일이 시스템에서 마지막으로 필요할 때 지워집니다. 시스템은 앱 내에서 삭제할 캐시된 파일을 결정할 때 가장 오래된 파일을 먼저 고려합니다 (수정 시간에 따라 결정).

또한 시스템에서 캐시된 데이터를 확보하는 방법을 디렉터리별로 사용 설정할 수 있는 두 가지 새로운 동작이 있습니다.

  • StorageManager.setCacheBehaviorAtomic()는 디렉터리와 디렉터리의 모든 콘텐츠를 단일 원자 단위로 삭제해야 함을 나타내는 데 사용할 수 있습니다.
  • setCacheBehaviorTombstone(File, boolean)는 디렉터리 내의 파일을 삭제하는 대신 길이 0바이트가 되도록 잘라서 빈 파일은 그대로 두어야 함을 나타내는 데 사용할 수 있습니다.

마지막으로 대용량 파일을 위한 디스크 공간을 할당해야 하는 경우 새로운 allocateBytes(FileDescriptor, long) API를 사용해 보세요. 이 API는 요청을 충족하기 위해 다른 앱에 속하는 캐시된 파일을 자동으로 삭제합니다. 기기의 디스크 공간이 새 데이터를 보관할 만큼 충분한지 결정할 때 getUsableSpace()를 사용하는 대신 getAllocatableBytes(UUID)를 호출합니다. 전자는 시스템에서 사용자를 대신하여 삭제하려는 모든 캐시된 데이터를 고려하기 때문입니다.

콘텐츠 제공자 페이징

한 번에 한 페이지씩 대규모 데이터 세트를 로드할 수 있도록 콘텐츠 제공자가 업데이트되었습니다. 예를 들어 수천 개의 이미지가 있는 사진 앱은 페이지에 표시할 데이터의 하위 집합을 쿼리할 수 있습니다. 콘텐츠 제공자가 반환하는 각 결과 페이지는 단일 Cursor 객체로 표현됩니다. 페이징을 클라이언트와 제공자가 모두 구현해야 이 기능을 사용할 수 있습니다.

콘텐츠 제공자의 변경사항에 관한 자세한 내용은 ContentProviderContentProviderClient를 참고하세요.

콘텐츠 새로고침 요청

이제 ContentProviderContentResolver 클래스에 refresh() 메서드가 포함되므로 클라이언트가 요청하는 정보가 최신 상태인지 더 쉽게 알 수 있습니다.

ContentProvider를 확장하여 맞춤 콘텐츠 새로고침 로직을 추가할 수 있습니다. refresh() 메서드를 재정의하여 true를 반환하도록 해야 합니다. 이 메서드는 제공업체의 클라이언트에 개발자가 직접 데이터 새로고침을 시도했음을 나타냅니다.

클라이언트 앱은 refresh()라고도 하는 다른 메서드를 호출하여 새로고침된 콘텐츠를 명시적으로 요청할 수 있습니다. 이 메서드를 호출할 때 새로고침할 데이터의 URI를 전달합니다.

참고: 네트워크를 통해 데이터를 요청할 수 있으므로 콘텐츠가 오래되었다는 강력한 징후가 있는 경우에만 클라이언트 측에서 refresh()를 호출해야 합니다. 이러한 유형의 콘텐츠 새로고침을 실행하는 가장 일반적인 이유는 스와이프하여 새로고침 동작에 응답하여 현재 UI에 최신 콘텐츠를 표시하도록 명시적으로 요청하는 것입니다.

JobScheduler 개선 사항

Android 8.0 (API 수준 26)에서는 JobScheduler가 다양하게 개선되었습니다. 이러한 개선사항을 통해 앱이 새로운 백그라운드 실행 제한을 더 쉽게 준수할 수 있습니다. 일반적으로 예약된 작업을 사용하여 현재 제한된 백그라운드 서비스 또는 암시적 broadcast receiver를 대체할 수 있기 때문입니다.

JobScheduler 업데이트에는 다음이 포함됩니다.

  • 이제 작업 큐를 예약된 작업과 연결할 수 있습니다. 작업의 큐에 작업 항목을 추가하려면 JobScheduler.enqueue()를 호출합니다. 작업이 실행 중일 때는 보류 중인 작업을 큐에서 제거하고 실행 중인 작업을 처리할 수 있습니다. 이 기능은 이전에 백그라운드 서비스를 시작하기 위해 호출했던 많은 사용 사례, 특히 IntentService를 구현하는 서비스를 처리합니다.
  • Android 지원 라이브러리 26.0.0에 새로운 JobIntentService 클래스가 도입되었습니다. 이 클래스는 IntentService와 동일한 기능을 제공하지만 Android 8.0 (API 수준 26) 이상에서 실행되는 경우 서비스 대신 작업을 사용합니다.
  • 이제 JobInfo.Builder.setClipData()를 호출하여 ClipData을 작업과 연결할 수 있습니다. 이 옵션을 사용하면 URI 권한 부여를 Context.startService()에 전파할 수 있는 방법과 유사하게 작업과 연결할 수 있습니다. 작업 큐의 인텐트와 함께 URI 권한 부여를 사용할 수도 있습니다.
  • 예약된 작업에서 이제 몇 가지 새로운 제약 조건이 지원됩니다.
    JobInfo.isRequireStorageNotLow()
    기기의 사용 가능한 저장용량이 부족하면 작업이 실행되지 않습니다.
    JobInfo.isRequireBatteryNotLow()
    배터리 잔량이 임계 기준점 이하이면 작업이 실행되지 않습니다. 임계 기준점은 기기에 배터리 부족 경고 시스템 대화상자를 표시하는 수준입니다.
    NETWORK_TYPE_METERED
    작업에 대부분의 모바일 데이터 요금제와 같이 데이터 전송량 제한이 있는 네트워크 연결이 필요합니다.

사용자설정 데이터 스토어

Android 8.0 (API 수준 26)에서는 환경설정에 맞춤 데이터 스토어를 제공할 수 있습니다. 이는 앱이 환경설정을 클라우드나 로컬 데이터베이스에 저장하거나 환경설정이 기기별일 때 유용할 수 있습니다. 데이터 스토어 구현에 관한 자세한 내용은 커스텀 데이터 스토어를 참조하세요.

미디어 개선

VolumeShaper

새로운 VolumeShaper 클래스가 있습니다. 페이드 인, 페이드 아웃, 크로스 페이드와 같은 짧은 자동 볼륨 전환을 실행하는 데 사용합니다. 자세한 내용은 VolumeShaper로 진폭 제어를 참고하세요.

오디오 포커스 향상

오디오 앱은 오디오 포커스를 요청하고 중단하는 방식으로 기기에서 오디오 출력을 공유합니다. 앱은 재생을 시작 또는 중지하거나 볼륨을 더킹하는 방식으로 포커스의 변화를 처리합니다. 새로운 AudioFocusRequest 클래스가 있습니다. 이 클래스를 requestAudioFocus()의 매개변수로 사용하면 앱은 오디오 포커스의 변화를 처리할 때 자동 볼륨 낮추기포커스 게인 지연과 같은 새로운 기능을 갖게 됩니다.

미디어 지표

getMetrics() 메서드는 속성과 값의 맵으로 표현되는 구성 및 성능 정보가 포함된 PersistableBundle 객체를 반환합니다. getMetrics() 메서드는 다음 미디어 클래스에 관해 정의됩니다.

측정항목은 각 인스턴스에 대해 개별적으로 수집되며 인스턴스 수명 동안 지속됩니다. 사용할 수 있는 측정항목이 없으면 메서드는 null을 반환합니다. 반환되는 실제 측정항목은 클래스에 따라 다릅니다.

MediaPlayer

Android 8.0 (API 수준 26)부터 MediaPlayer는 DRM으로 보호되는 머티리얼과 HLS 샘플 수준 암호화된 미디어를 재생할 수 있습니다.

Android 8.0에는 프레임을 탐색할 때 세밀한 제어를 제공하는 새로운 오버로드된 seekTo() 명령어가 도입되었습니다. 여기에는 탐색 모드를 지정하는 두 번째 매개변수가 포함되어 있습니다.

  • SEEK_PREVIOUS_SYNC는 특정 시점 직전이나 특정 시간에 위치한 데이터 소스와 연결된 동기화 (또는 키) 프레임으로 미디어 위치를 이동합니다.
  • SEEK_NEXT_SYNC는 지정된 시점의 바로 다음 위치에 있는 데이터 소스와 연결된 동기화 (또는 키) 프레임으로 미디어 위치를 이동합니다.
  • SEEK_CLOSEST_SYNC는 미디어 위치를 지정된 시간에 가장 가깝거나 지정된 시간에 위치한 데이터 소스와 연결된 동기화 (또는 키) 프레임으로 이동합니다.
  • SEEK_CLOSEST는 미디어 위치를 지정된 시간에 가장 가깝거나 지정된 시간에 위치한 데이터 소스와 연결된 프레임 (동기화 또는 키 프레임일 필요는 없음)으로 이동합니다.

계속 탐색할 때 앱은 SEEK_CLOSEST 대신 SEEK_ 모드를 사용해야 합니다. 이 모드는 비교적 느리게 실행되지만 더 정확할 수 있습니다.

MediaRecorder

  • 이제 MediaRecorder는 스트리밍에 유용한 MPEG2_TS 형식을 지원합니다.

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    MediaRecorder.OutputFormat 보기

  • MediaMuxer는 이제 개수에 제한 없이 오디오 및 동영상 스트림을 처리할 수 있습니다. 더 이상 오디오 트랙 1개 또는 동영상 트랙 1개로 제한되지 않습니다. addTrack()를 사용하여 원하는 만큼 트랙을 믹싱하세요.
  • MediaMuxer는 사용자가 정의한 프레임별 정보가 포함된 하나 이상의 메타데이터 트랙을 추가할 수도 있습니다. 메타데이터의 형식은 애플리케이션에 의해 정의됩니다. 메타데이터 트랙은 MP4 컨테이너에만 지원됩니다.

메타데이터는 오프라인 처리에 유용할 수 있습니다. 예를 들어 센서의 자이로 신호는 동영상 안정화에 사용될 수 있습니다.

메타데이터 트랙을 추가할 때 트랙의 MIME 형식은 'application/' 접두사로 시작해야 합니다. 메타데이터 쓰기는 데이터를 MediaCodec에서 가져오지 않는다는 점을 제외하고 동영상/오디오 데이터 쓰기와 동일합니다. 대신 앱은 연결된 타임스탬프가 있는 ByteBufferwriteSampleData() 메서드에 전달합니다. 타임스탬프는 동영상 및 오디오 트랙과 동일한 시간 베이스에 있어야 합니다.

생성된 MP4 파일은 ISOBMFF의 섹션 12.3.3.2에 정의된 TextMetaDataSampleEntry를 사용하여 메타데이터의 MIME 형식을 알립니다. MediaExtractor를 사용하여 메타데이터 트랙으로 파일을 추출할 때 메타데이터의 MIME 형식이 MediaFormat로 추출됩니다.

개선된 미디어 파일 액세스

저장소 액세스 프레임워크 (SAF)를 사용하면 앱에서 맞춤 DocumentsProvider을 노출하여 데이터 소스의 파일에 대한 액세스를 다른 앱에 제공할 수 있습니다. 실제로 문서 제공자는 네트워크 저장소에 있거나 미디어 전송 프로토콜 (MTP)과 같은 프로토콜을 사용하는 파일에 대한 액세스도 제공할 수 있습니다.

그러나 대용량 미디어 파일을 원격 데이터 소스에서 액세스하는 경우에는 몇 가지 문제가 발생합니다.

  • 미디어 플레이어는 문서 제공자의 파일에 대해 검색 가능한 액세스를 요구합니다. 대용량 미디어 파일이 원격 데이터 소스에 있는 경우 문서 제공자는 모든 데이터를 미리 가져오고 스냅샷 파일 설명자를 만들어야 합니다. 미디어 플레이어는 파일 설명자 없이 파일을 재생할 수 없으므로 문서 제공자가 파일 다운로드를 완료할 때까지 재생을 시작할 수 없습니다.
  • 사진 앱과 같은 미디어 수집 관리자는 범위가 지정된 폴더를 통해 외부 SD 카드에 저장된 미디어에 도달하려면 일련의 액세스 URI를 순회해야 합니다. 이러한 액세스 패턴으로 인해 미디어에서 이동, 복사, 삭제와 같은 대량 작업이 상당히 느려집니다.
  • 미디어 수집 관리자는 URI가 지정된 문서의 위치를 결정할 수 없습니다. 이로 인해 이러한 유형의 앱에서는 사용자가 미디어 파일을 저장할 위치를 선택하기가 어렵습니다.

Android 8.0은 저장소 액세스 프레임워크를 개선하여 이러한 문제를 해결합니다.

사용자설정 문서 제공자

Android 8.0부터 저장소 액세스 프레임워크는 맞춤 문서 제공자가 원격 데이터 소스에 상주하는 파일의 검색 가능한 파일 설명자를 만들 수 있도록 허용합니다. SAF는 파일을 열어 탐색 가능한 네이티브 파일 설명자를 가져올 수 있습니다. 그러면 SAF가 개별 바이트 요청을 문서 제공자에 전달합니다. 이 기능을 사용하면 문서 제공자가 전체 파일을 미리 캐싱하는 대신 미디어 플레이어 앱이 요청한 정확한 바이트 범위를 반환할 수 있습니다.

이 기능을 사용하려면 새 StorageManager.openProxyFileDescriptor() 메서드를 호출해야 합니다. openProxyFileDescriptor() 메서드는 ProxyFileDescriptorCallback 객체를 콜백으로 허용합니다. SAF는 클라이언트 애플리케이션이 문서 제공자로부터 반환된 파일 설명자에 파일 작업을 실행할 때마다 콜백을 호출합니다.

직접 문서 액세스

Android 8.0 (API 수준 26)부터 getDocumentUri() 메서드를 사용하여 지정된 mediaUri와 동일한 문서를 참조하는 URI를 가져올 수 있습니다. 그러나 반환된 URI는 DocumentsProvider의 지원을 받으므로 미디어 컬렉션 관리자는 범위가 지정된 디렉터리의 트리를 순회하지 않고도 문서에 직접 액세스할 수 있습니다. 따라서 미디어 관리자는 문서에서 파일 작업을 훨씬 더 빠르게 실행할 수 있습니다.

주의: getDocumentUri() 메서드는 미디어 파일만 찾습니다. 앱에 미디어 파일 액세스 권한을 부여하지는 않습니다. 미디어 파일 액세스 권한을 얻는 방법에 관한 자세한 내용은 참조 문서를 확인하세요.

문서의 경로

Android 8.0 (API 수준 26)에서 저장소 액세스 프레임워크를 사용할 때 DocumentsContract 클래스와 DocumentsProvider 클래스에서 모두 사용할 수 있는 findDocumentPath() 메서드를 사용하여 문서 ID가 지정된 파일 시스템의 루트에서 경로를 확인할 수 있습니다. 이 메서드는 DocumentsContract.Path 객체에 이 경로를 반환합니다. 파일 시스템에 동일한 문서에 대해 정의된 경로가 여러 개 있는 경우 이 메서드는 지정된 ID의 문서에 도달하는 데 가장 자주 사용되는 경로를 반환합니다.

이 기능은 다음과 같은 상황에서 특히 유용합니다.

  • 앱이 특정 문서의 위치를 표시하는 '다른 이름으로 저장' 대화상자를 사용합니다.
  • 앱은 검색결과 뷰에 폴더를 표시하며, 사용자가 특정 폴더를 선택하는 경우 해당 폴더 내에 있는 하위 문서를 로드해야 합니다.

참고: 앱이 경로의 일부 문서에만 액세스할 수 있는 권한이 있다면 findDocumentPath()의 반환 값에는 앱이 액세스할 수 있는 폴더와 문서만 포함됩니다.

오디오 재생 모니터링

AudioManager 시스템 서비스는 활성 AudioPlaybackConfiguration 객체의 목록을 유지하며 각 객체에는 특정 오디오 재생 세션에 관한 정보가 포함되어 있습니다. 앱은 getActivePlaybackConfigurations()를 호출하여 현재 활성화된 구성 세트를 검색할 수 있습니다.

Android 8.0 (API 수준 26)부터 하나 이상의 AudioPlaybackConfiguration 객체가 변경되었을 때 앱에 알리는 콜백을 등록할 수 있습니다. 이렇게 하려면 registerAudioPlaybackCallback()를 호출하여 AudioManager.AudioPlaybackCallback의 인스턴스를 전달합니다. AudioManager.AudioPlaybackCallback 클래스에는 오디오 재생 구성이 변경될 때 시스템에서 호출하는 onPlaybackConfigChanged() 메서드가 포함되어 있습니다.

연결

Wi-Fi Aware

Android 8.0 (API 수준 26)은 NAN (Neighbor Awareness Networking) 사양을 기반으로 하는 Wi-Fi Aware 지원을 추가합니다. 적절한 Wi-Fi Aware 하드웨어가 있는 기기에서 앱과 주변 기기가 인터넷 액세스 포인트 없이도 Wi-Fi를 통해 검색하고 통신할 수 있습니다. Google은 가능한 한 빨리 Wi-Fi Aware 기술을 기기에 제공하기 위해 하드웨어 파트너와 협력하고 있습니다. Wi-Fi Aware를 앱에 통합하는 방법에 관한 자세한 내용은 Wi-Fi Aware를 참고하세요.

블루투스

Android 8.0 (API 수준 26)은 다음 기능을 추가하여 플랫폼의 블루투스 지원을 강화합니다.

  • 곡-라이브러리 탐색이 가능한 AVRCP 1.4 표준 지원.
  • BLE(Bluetooth Low-Energy) 5.0 표준 지원.
  • Sony LDAC 코덱을 블루투스 스택에 통합.

호환 기기 페어링

Android 8.0 (API 수준 26)은 블루투스, BLE, Wi-Fi를 통해 호환 기기와 페어링하려고 할 때 페어링 요청 대화상자를 맞춤설정할 수 있는 API를 제공합니다. 자세한 내용은 호환 기기 페어링을 참고하세요.

Android에서 블루투스를 사용하는 방법에 관한 자세한 내용은 블루투스 가이드를 참고하세요. Android 8.0 (API 수준 26)과 관련된 블루투스 변경사항은 Android 8.0 동작 변경사항 페이지의 블루투스 섹션을 참고하세요.

공유

스마트 공유

Android 8.0 (API 수준 26)은 사용자의 맞춤설정된 공유 환경설정을 학습하고 공유하기에 적합한 각 콘텐츠 유형을 더 잘 파악합니다. 예를 들어 사용자가 영수증 사진을 찍으면 Android 8.0이 지출 추적 앱을 추천할 수 있습니다. 사용자가 셀카를 찍으면 소셜 미디어 앱이 이미지를 더 잘 처리할 수 있습니다. Android 8.0은 사용자의 맞춤설정된 환경설정에 따라 이러한 모든 패턴을 자동으로 학습합니다.

스마트 공유는 audio, video, text, URLimage 이외의 콘텐츠 유형에 작동합니다.

스마트 공유를 사용 설정하려면 콘텐츠를 공유하는 인텐트에 최대 3개의 문자열 주석으로 구성된 ArrayList를 추가합니다. 주석은 콘텐츠의 주요 구성요소나 주제를 설명해야 합니다. 다음 코드 예는 인텐트에 주석을 추가하는 방법을 보여줍니다.

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

스마트 공유 주석에 관한 자세한 내용은 EXTRA_CONTENT_ANNOTATIONS를 참고하세요.

텍스트 분류 기준

호환되는 기기에서 앱은 새로운 Text Classifier를 사용하여 문자열이 알려진 분류 기준 항목 유형과 일치하는지 확인하고 추천 선택 항목을 가져올 수 있습니다. 시스템에서 인식하는 항목에는 주소, URL, 전화번호, 이메일 주소가 포함됩니다. 자세한 내용은 TextClassifier를 참고하세요.

접근성

Android 8.0 (API 수준 26)에서는 자체 접근성 서비스를 만드는 개발자를 위해 다음과 같은 몇 가지 새로운 접근성 기능을 지원합니다.

앱의 접근성을 높이는 방법에 관한 자세한 내용은 접근성을 참고하세요.

보안 및 개인 정보 보호

권한

Android 8.0 (API 수준 26)에는 전화 통신과 관련된 몇 가지 새로운 권한이 도입되었습니다.

  • ANSWER_PHONE_CALLS 권한을 사용하면 앱에서 프로그래매틱 방식으로 수신 전화를 받을 수 있습니다. 앱에서 수신 전화를 처리하려면 acceptRingingCall() 메서드를 사용하면 됩니다.
  • READ_PHONE_NUMBERS 권한은 기기에 저장된 전화번호에 관한 읽기 액세스 권한을 앱에 부여합니다.

이러한 권한은 모두 위험한 권한으로 분류되며 둘 다 PHONE 권한 그룹에 포함됩니다.

새로운 Account Access 및 Discovery API

Android 8.0 (API 수준 26)에서는 앱이 사용자 계정에 액세스하는 방식이 몇 가지 개선되었습니다. 자신이 관리하는 계정의 경우 인증자는 자체 정책을 사용하여 앱에서 계정을 숨길지 또는 앱에 계정을 공개할지 결정할 수 있습니다. Android 시스템은 특정 계정에 액세스할 수 있는 애플리케이션을 추적합니다.

이전 버전의 Android에서는 사용자 계정 목록을 추적하려는 앱은 관련 없는 유형의 계정을 포함하여 모든 계정에 관한 업데이트를 받아야 했습니다. Android 8.0에는 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) 메서드가 추가되어 앱이 계정 변경사항을 수신해야 하는 계정 유형 목록을 지정할 수 있습니다.

API 변경사항

AccountManager는 인증자가 계정을 볼 수 있는 앱을 관리하는 데 도움이 되는 6가지 새로운 메서드를 제공합니다.

Android 8.0 (API 수준 26)에는 setAccountVisibility(android.accounts.Account, java.lang.String, int) 메서드를 사용하여 설정되지 않은 애플리케이션의 공개 상태 수준을 지정하기 위한 두 가지 특수한 패키지 이름 값이 도입되었습니다. PACKAGE_NAME_KEY_LEGACY_VISIBLE 공개 상태 값은 GET_ACCOUNTS 권한이 있는 앱, Android 8.0 미만의 타겟 Android 버전 또는 서명이 모든 Android 버전을 타겟팅하는 인증자와 일치하는 앱에 적용됩니다. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE는 이전에 설정되지 않았고 PACKAGE_NAME_KEY_LEGACY_VISIBLE를 적용할 수 없는 앱의 기본 공개 상태 값을 제공합니다.

새 계정 액세스 및 검색 API에 관한 자세한 내용은 AccountManagerOnAccountsUpdateListener 참조를 확인하세요.

테스트

계측 테스트

Android 8.0 (API 수준 26)은 앱의 계측 테스트에 다음과 같은 추가 지원을 제공합니다.

비기본 앱 프로세스에 대해 실행

이제 앱의 기본 프로세스 외부의 프로세스에 대해 특정 계측 테스트를 실행하도록 지정할 수 있습니다. 이 구성은 앱에 서로 다른 프로세스에서 실행되는 여러 활동이 포함된 경우에 유용합니다.

기본이 아닌 프로세스 계측을 정의하려면 매니페스트 파일로 이동한 다음 원하는 <instrumentation> 요소로 이동합니다. android:targetProcess 속성을 추가하고 값을 다음 중 하나로 설정합니다.

  • 특정 프로세스의 이름.
  • 쉼표로 구분된 프로세스 이름 목록.
  • 와일드 카드 ("*"): android:targetPackage 속성에 지정된 패키지의 코드를 실행하는 시작된 모든 프로세스에 대해 계측을 실행할 수 있습니다.

계측 테스트가 실행되는 동안 getProcessName()를 호출하여 테스트 중인 프로세스를 확인할 수 있습니다.

테스트 중에 결과 보고

이제 addResults()를 호출하여 계측 테스트가 이후가 아니라 계측 테스트가 실행되는 동안 결과를 보고할 수 있습니다.

테스트용 가짜 인텐트

앱 활동에 관한 격리된 독립적인 UI 테스트를 더 쉽게 만들 수 있도록 Android 8.0 (API 수준 26)에는 onStartActivity() 메서드가 도입되었습니다. Instrumentation.ActivityMonitor 클래스의 맞춤 서브클래스에서 이 메서드를 재정의하여 테스트 클래스가 호출하는 특정 인텐트를 처리합니다.

테스트 클래스가 인텐트를 호출하면 이 메서드는 인텐트 자체를 실행하는 대신 스텁 Instrumentation.ActivityResult 객체를 반환합니다. 테스트에서 이 모의 인텐트 로직을 사용하면 다른 활동이나 완전히 다른 앱에 전달하는 인텐트를 활동이 준비하고 처리하는 방식에 집중할 수 있습니다.

런타임 및 도구

플랫폼 최적화

Android 8.0 (API 수준 26)은 플랫폼에 런타임 및 기타 최적화를 적용하여 많은 성능 개선을 유도합니다. 이러한 최적화에는 동시 압축 가비지 컬렉션, 더 효율적인 메모리 사용, 코드 위치 등이 포함됩니다.

이러한 최적화를 통해 부팅 시간이 단축되고 OS와 앱 성능이 모두 향상됩니다.

자바 언어 지원 업데이트

Android 8.0 (API 수준 26)에는 다음과 같은 여러 OpenJDK Java API 지원이 추가되었습니다.

새로 추가된 패키지 내의 클래스와 메서드에 대한 자세한 내용은 API 참조 문서를 확인하세요.

Android 스튜디오에서 자바 8 언어 기능을 사용하려면 최신 미리보기 버전을 다운로드해야 합니다.

업데이트된 ICU4J Android 프레임워크 API

Android 8.0 (API 수준 26)은 앱 개발자가 android.icu 패키지에서 사용할 수 있도록 ICU4J API의 하위 집합인 ICU4J Android 프레임워크 API를 확장합니다. 이러한 API는 기기에 있는 현지화 데이터를 사용하므로 APK에서 ICU4J 라이브러리를 컴파일하지 않음으로써 APK 공간을 줄일 수 있습니다.

표 1. Android에서 사용되는 ICU, CLDR 및 유니코드 버전입니다.

Android API 레벨 ICU 버전 CLDR 버전 유니코드 버전
Android 7.0 (API 레벨 24), Android 7.1 (API 레벨 25) 56 28 8.0
Android 8.0(API 수준 26) 58.2 30.0.3 9.0

ICU4J 지원을 비롯한 Android의 국제화에 관한 자세한 내용은 Android의 국제화를 참고하세요.

Android 엔터프라이즈

Android 8.0 (API 수준 26)을 실행하는 기기를 위한 새로운 엔터프라이즈 기능과 API가 도입되었습니다. 주요 특징은 다음과 같습니다.

  • 완전 관리형 기기의 직장 프로필을 통해 기업은 업무와 개인 정보를 분리하고 두 가지를 모두 관리할 수 있습니다.
  • API 위임을 통해 기기 소유자와 프로필 소유자가 앱 관리를 다른 애플리케이션에 할당할 수 있습니다.
  • 프로비저닝 흐름에서 사용자 환경이 개선되어 (새로운 맞춤설정 옵션 포함) 설정 시간이 줄어듭니다.
  • 블루투스, Wi-Fi, 백업, 보안을 위한 새로운 제어 기능을 통해 기업은 더 많은 기기를 관리할 수 있습니다. 네트워크 활동 로깅을 사용하면 기업에서 문제를 추적할 수 있습니다.

이러한 내용과 기타 새로운 Android Enterprise API 및 기능에 관한 자세한 내용은 엔터프라이즈의 Android를 참고하세요.