It's happening now, watch the livestream.

Android 9 기능 및 API

Android 9(API 레벨 28)에서는 사용자와 개발자를 위한 멋진 새로운 기능과 성능을 제공합니다. 이 문서에서는 개발자를 위한 새로운 기능을 소개합니다.

새로운 API에 대해 알아보려면 API 차이점 보고서를 참조하거나 Android API 참조를 방문하세요. 또한 플랫폼 변경이 앱에 영향을 줄 수 있는 분야에 대해 알아보려면 Android 9 동작 변경사항을 확인하세요.

Wi-Fi RTT를 이용한 실내 위치추적

새로운 RTT API는 앱에서 실내 위치추적을 지원합니다.

Android 9에서는 Wi-Fi RTT(Round-Trip-Time)라고도 불리는 IEEE 802.11mc Wi-Fi 프로토콜을 지원하므로, 앱에서 실내 위치 추적을 활용할 수 있습니다.

하드웨어 지원이 포함된 Android 9이 실행되는 기기에서는 앱이 RTT API를 사용하여 주변에 있는 RTT 지원 Wi-Fi 액세스 지점(AP)까지의 거리를 측정할 수 있습니다. 기기에서 위치가 활성화되어 있고 Wi-Fi 스캐닝이 켜져 있어야 하며(Settings > Location), 앱은 ACCESS_FINE_LOCATION 권한이 있어야 합니다. RTT 사용을 위해 기기를 액세스 지점에 연결할 필요는 없습니다. 개인정보 보호를 위해, 휴대폰에서만 액세스 지점에 대한 거리를 측정할 수 있으며 액세스 지점에는 이 정보가 없습니다.

기기에서 3개 이상의 액세스 지점에 대한 거리를 측정하는 경우, 다변측정(MLAT) 알고리즘을 사용하여 해당 측정에 가장 적합한 기기 위치를 측정할 수 있습니다. 일반적으로 그 결과는 1~2미터 이내로 정확합니다.

이러한 정확도를 이용하면 건물 내 탐색 및 미세 위치 기반 서비스와 같은 새로운 경험을 구현할 수 있는데, 명확한 음성 제어(예: "이 조명을 켜세요")와 위치 기반 정보(예: "이 상품에 특별 할인이 있나요?")를 예로 들 수 있습니다.

디스플레이 컷아웃 지원

서로 다른 컷아웃 크기를 나타내는 개발자 옵션 화면

에뮬레이터를 사용하여 디스플레이 컷아웃 테스트

Android 9에서는 카메라와 스피커를 위한 디스플레이 컷아웃이 포함된 최신 에지-투-에지 화면 지원 기능을 제공합니다. DisplayCutout 클래스를 사용하면 콘텐츠가 나타나서는 안 되는 비작동 영역의 위치와 모양을 찾아낼 수 있습니다. 이러한 컷아웃 영역의 존재 여부와 위치를 판별하려면 getDisplayCutout() 메서드를 사용하세요.

새로운 창 레이아웃 속성인 layoutInDisplayCutoutMode를 사용하면 앱이 해당 콘텐츠를 기기 컷아웃 주변에 배치할 수 있습니다. 다음 값 중 하나로 이 속성을 설정할 수 있습니다.

Android 9이 실행되는 모든 기기나 에뮬레이터에서 다음과 같이 화면 컷아웃을 시뮬레이션할 수 있습니다.

  1. 개발자 옵션을 활성화합니다.
  2. Developer options 화면에서 Drawing 섹션으로 스크롤하고 Simulate a display with a cutout을 선택합니다.
  3. 컷아웃의 크기를 선택합니다.

참고: Android 9이가 실행되는 기기나 에뮬레이터를 사용하여 컷아웃 영역 주변에서 콘텐츠 표시를 테스트하는 것이 좋습니다.

알림

Android 9에서는 알림 기능이 여러 가지로 향상되었는데, API 레벨 28 이상을 대상으로 개발하는 개발자는 이 모든 향상된 기능을 사용할 수 있습니다.

메시지 알림

사진이 첨부된 MessagingStyle.

메시지 알림

회신과 대화가 있는 MessagingStyle.

향상된 메시지 환경

Android 7.0(API 레벨 24)부터는 메시지에 회신하거나 알림에서 직접 다른 텍스트를 입력하는 액션을 추가할 수 있습니다. Android 9에서는 이 기능이 다음과 같이 향상되었습니다.

  • 단순화된 대화 참가자 지원: Person 클래스는 대화 참가자(이들의 아바타 및 URI 포함)를 식별하는 데 사용됩니다. 이제 addMessage()와 같은 기타 여러 API에서 CharSequence 대신 Person 클래스를 활용합니다. Person 클래스는 Builder 디자인 패턴도 지원합니다.

  • 이미지 지원: 이제 Android 9은 전화의 메시지 알림에 이미지를 표시합니다. 메시지에 setData()를 사용하여 이미지를 표시할 수 있습니다. 다음 코드 스니펫은 Person과 이미지 포함 메시지를 생성하는 방법을 보여줍니다.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);

  • 회신을 초안으로 저장: 사용자가 실수로 메시지 알림을 닫은 경우, 앱은 시스템이 보낸 EXTRA_REMOTE_INPUT_DRAFT를 검색할 수 있습니다. 이 추가 기능을 사용하면 사용자가 회신을 완성할 수 있도록 앱의 텍스트 필드에 텍스트를 미리 채울 수 있습니다.

  • 대화가 그룹 대화인지 여부를 식별: setGroupConversation()을 사용하면 대화가 그룹 대화인지 비그룹 대화인지를 확실하게 식별할 수 있습니다.

  • 인텐트의 문맥적 액션 설정: setSemanticAction() 메서드를 사용하여 액션에 문맥적 의미를 지정할 수 있습니다(예: '읽은 상태로 표시', '삭제', '회신').

  • SmartReply: Android 9에서는 메시지 앱에서 제공되는 것과 동일한 제안 회신을 지원합니다. 일련의 표준 회신을 사용자에게 제공하려면 RemoteInput.setChoices()를 사용하세요.

채널 설정, 브로드캐스트 및 알림 일시중지

Android 8.0에서는 개발자가 표시하고자 하는 각 유형의 알림에 대해 사용자 맞춤형 채널을 생성할 수 있는 알림 채널이 도입되었습니다. Android 9은 이러한 변경을 통해 알림 채널 설정을 단순화합니다.

  • 채널 그룹 차단: 이제 앱의 알림 설정 내에서 사용자가 전체 채널 그룹을 차단할 수 있습니다. isBlocked() 메서드를 사용하면 그룹이 차단된 시기를 식별할 수 있으며, 이 경우 이 그룹에 있는 채널에는 어떤 알림도 보내지 않습니다.

    또한 새로운 getNotificationChannelGroup() 메서드를 사용하여 앱이 현재의 채널 그룹 설정을 쿼리할 수 있습니다.

  • 새로운 브로드캐스트 인텐트 유형: 이제 Android 시스템에서는 알림 채널과 채널 그룹의 차단 상태가 변경될 때 브로드캐스트 인텐트를 보냅니다. 차단된 채널이나 그룹을 소유하는 앱이 이 인텐트를 수신할 수 있고 그에 따라 반응할 수 있습니다. 이러한 인텐트 액션과 엑스트라에 대한 자세한 내용은 NotificationManager 참조에서 업데이트된 상수 목록을 참조하세요. 브로드캐스트 인텐트에 대한 반응에 대해서는 브로드캐스트를 참조하세요.

  • NotificationManager.Policy는 다음 세 가지 새로운 알림 일시중지 우선순위 카테고리가 있습니다.

  • NotificationManager.Policy에는 시각적 방해를 억제하기 위해 사용할 수 있는 7가지의 새로운 알림 일시중지 상수도 있습니다.

멀티 카메라 지원 및 카메라 업데이트

Android 9이 실행되는 기기에서는 두 대 이상의 물리적 카메라에서 동시에 스트림에 액세스할 수 있습니다. 듀얼 전방 카메라나 듀얼 후방 카메라가 달린 기기에서, 한 대의 카메라로는 불가능한 혁신적인 기능을 구현할 수 있습니다(예: 매끄러운 확대/축소, 보케 및 스테레오 비전). 이 API를 사용하여 두 대 이상의 카메라를 자동으로 전환하는 논리적 카메라 스트림이나 합성된 카메라 스트림을 호출할 수도 있습니다.

카메라의 기타 개선 사항으로는 추가적인 Session 매개변수와 Surface 공유가 있습니다. Session 매개변수는 초기 캡처 중에 지연을 줄여주는 역할을 하며, Surface 공유는 카메라 고객이 카메라 스트리밍을 중단/시작하지 않고도 다양한 사용 사례를 처리할 수 있도록 해줍니다. 또한 디스플레이 기반의 플래시 지원을 위한 API를 추가했고, 앱 수준의 이미지 흔들림 보정 및 특수 효과를 위한 OIS 타임스탬프 액세스 기능을 추가했습니다.

Android 9에서는 다중 카메라 APIFULL 또는 LIMITED 기능을 가진 기기를 위한 흑백 카메라를 지원합니다. 흑백 출력은 Y를 그레이스케일, U(Cb)를 128, V(Cr)를 128로 하는 YUV_420_888 형식을 통해 실현됩니다.

Android 9에서는 또한 지원되는 기기에서 외부 USB/UVC 카메라 지원이 가능합니다.

드로어블 및 비트맵용 ImageDecoder

Android 9에는 이미지 디코딩에 대한 최신 접근 방식을 제공하는 ImageDecoder 클래스가 도입됩니다. BitmapFactoryBitmapFactory.Options API 대신 이 클래스를 사용하세요.

ImageDecoder를 사용하면 바이트 버퍼, 파일 또는 URI로부터 Drawable 또는 Bitmap을 생성할 수 있습니다. 이미지를 디코딩하려면 먼저 인코딩된 이미지의 소스와 함께 createSource()를 호출합니다. 그런 다음, ImageDecoder.Source 객체를 전달해 decodeDrawable() 또는 decodeBitmap()을 호출하여 Drawable 또는 Bitmap을 생성합니다. 기본 설정을 변경하려면 OnHeaderDecodedListenerdecodeDrawable() 또는 decodeBitmap()으로 전달합니다. ImageDecoder는 이미지의 기본 너비 및 높이(알려진 경우)로 onHeaderDecoded()를 호출합니다. 인코딩된 이미지가 애니메이션 GIF 또는 WebP인 경우 decodeDrawable()AnimatedImageDrawable 클래스의 인스턴스인 Drawable을 반환합니다.

이미지 속성을 설정하기 위해 다른 메서드를 사용할 수 있습니다.

  • 디코딩된 이미지의 배율을 정확한 크기로 조정하려면 대상 치수를 setTargetSize()로 전달하세요. 또한 샘플 크기를 사용하여 이미지의 배율을 조정할 수도 있습니다. 샘플 크기를 setTargetSampleSize()로 직접 전달하세요.
  • 배율 조정된 이미지 범위 내에서 이미지를 잘라내려면 setCrop()을 호출하세요.
  • 변경 가능한 비트맵을 생성하려면 truesetMutableRequired()로 전달하세요.

ImageDecoder를 사용하면 둥근 모서리나 원형 마스크 등의 복잡한 맞춤형 효과를 이미지에 추가할 수도 있습니다. 원하는 그리기 명령을 실행하려면 PostProcessor의 인스턴스와 함께 setPostProcessor() 를 사용하세요.

참고: AnimatedImageDrawable을 사후 처리하면 애니메이션의 모든 프레임에서 효과가 나타납니다.

애니메이션

Android 9에는 GIF 및 WebP 애니메이션 이미지를 그리고 표시하기 위한 AnimatedImageDrawable 클래스가 도입됩니다. AnimatedImageDrawable은 렌더 스레드가 AnimatedImageDrawable의 애니메이션을 구동한다는 점에서 AnimatedVectorDrawable과 비슷하게 작동합니다. 또한 렌더 스레드는 작업자 스레드를 사용하여 디코딩하므로, 디코딩이 렌더 스레드를 통해 이루어지는 다른 작업을 방해하지 않습니다. 이 구현에서는 앱 업데이트를 관리하거나 앱 UI 스레드에서의 다른 이벤트와 충돌하지 않고도 앱에서 애니메이션 이미지를 표시할 수 있습니다.

ImageDecoder의 인스턴스를 사용하여 AnimatedImageDrawable을 디코딩할 수 있습니다. 다음 코드 스니펫은 ImageDecoder를 사용하여 AnimatedImageDrawable을 디코딩하는 방법을 보여줍니다.

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder에는 이미지를 추가적으로 수정할 수 있는 여러 메서드가 있습니다. 예를 들어, setPostProcessor() 메서드를 사용하여 이미지의 모양을 수정할 수 있습니다(예: 원형 마스크나 둥근 모서리 적용).

HDR VP9 동영상, HEIF 이미지 압축, 미디어 API

Android 9에서는 HDR(High Dynamic Range) VP9 프로필 2를 기본적으로 지원하므로, 이제 HDR 가능 기기에서 사용자에게 YouTube, Play Movies 및 기타 소스의 HDR 가능 동영상을 제공할 수 있습니다.

Android 9에서는 HEIF(heic) 이미지 인코딩 지원을 플랫폼에 추가합니다. HEIF 정지 이미지 샘플은 MediaMuxerMediaExtractor 클래스에서 지원되며, HEIF는 압축 성능을 개선하여 저장 공간과 네트워크 데이터를 절약합니다. Android 9 기기의 플랫폼 지원 덕분에, 백엔드 서버로부터 HEIF 이미지를 쉽게 전송하고 활용할 수 있습니다. 공유 및 표시를 위해 자신의 앱이 이 데이터 형식과 호환되는지 확인한 후, 앱의 이미지 저장 형식으로 HEIF를 사용해 보세요. jpeg로부터 비트맵을 얻기 위해 ImageDecoder 또는 BitmapFactory를 사용하여 jpeg-heic 변환을 수행할 수 있습니다. 또한 HeifWriter를 사용하여 YUV 바이트 버퍼, Surface 또는 비트맵으로부터 HEIF 정지 이미지를 작성할 수 있습니다.

AudioTrack, AudioRecordMediaDrm 클래스로부터 미디어 지표를 사용할 수도 있습니다.

Android 9에서는 지표, HDCP 레벨, 보안 레벨 및 세션 개수를 구하고 보안 레벨과 안전한 중지를 더욱 정확하게 제어할 수 있는 메서드를 MediaDRM 클래스에 추가합니다. 자세한 내용은 API 차이점 보고서를 참조하세요.

Android 9에서는 AAudio API가 사용, 콘텐츠 유형입력 사전 설정에 대한 AAudioStream 속성을 포함합니다. 이러한 속성을 사용하여 VoIP 또는 캠코더 애플리케이션에 맞춰 조정되는 스트림을 생성할 수 있습니다. AAudio 스트림을 효과를 포함할 수 있는 서브믹스와 연결하기 위해 SessionID를 설정할 수도 있습니다. 효과를 제어하려면 AudioEffect API를 사용하세요.

Android 9에는 DynamicsProcessingAudioEffect API가 포함됩니다. 이 클래스로 이퀄라이제이션, 다중 대역 압축, 제한기를 포함한 다양한 유형의 여러 단계로 구성되는 채널 기반 오디오 효과를 구현할 수 있습니다. 대역 및 활성 단계의 수를 구성할 수 있고 대부분의 매개변수를 실시간으로 제어할 수 있습니다.

JobScheduler의 데이터 비용 민감도

Android 9에서 시작하여, JobScheduler는 이동통신사가 네트워크 관련 작업의 처리 능력 향상을 위해 제공하는 네트워크 상태 신호를 사용할 수 있습니다.

작업은 예상 데이터 크기를 선언하고 프리페치를 알리고 자세한 네트워크 요구사항을 지정할 수 있습니다. 그런 다음, JobScheduler는 네트워크 상태에 따라 작업을 관리합니다. 예를 들어 네트워크에서 정체 신호를 보낼 때 JobScheduler는 대량의 네트워크 요청을 지연할 수 있습니다. 고정 요금제 네트워크의 경우에는 JobScheduler가 사용자 환경을 개선하기 위해 프리페칭 작업(예: 헤드라인 프리페칭)을 실행할 수 있습니다.

작업을 추가하는 경우, JobScheduler가 올바로 작업을 처리할 수 있도록 setEstimatedNetworkBytes(), setPrefetch()setRequiredNetwork()를 적절하게 사용해야 합니다. 작업이 실행될 때, 반드시 JobParameters.getNetwork()에 의해 반환된 Network 객체를 사용하세요. 그렇지 않으면 기기의 기본 네트워크가 암시적으로 사용되어 요구사항이 충족되지 않고 원치 않는 데이터 사용량이 발생할 수 있습니다.

Neural Networks API 1.1

Android에서 온디바이스 머신러닝을 가속화하기 위해 Android 8.1(API 레벨 27)에서 Neural Networks API가 도입되었습니다. Android 9은 이 API를 확장하고 개선하여 9가지 새로운 연산을 위한 지원을 추가합니다.

알려진 문제: ANEURALNETWORKS_TENSOR_QUANT8_ASYMM 텐서를 ANEURALNETWORKS_PAD 연산(Android 9 이상에서 사용 가능)으로 전달할 때 NNAPI의 출력이 TensorFlow Lite와 같이 더 높은 수준의 머신러닝 프레임워크의 출력과 일치하지 않을 수 있습니다. 대신 문제가 해결될 때까지 ANEURALNETWORKS_TENSOR_FLOAT32만 전달해야 합니다.

이 API에는 ANeuralNetworksModel_relaxComputationFloat32toFloat16()도 도입되었는데, IEEE 754 16비트 부동 소수점 형식만큼 낮은 범위와 정밀도로 ANEURALNETWORKS_TENSOR_FLOAT32를 계산할지 지정할 수 있게 해주는 새로운 함수입니다.

자동 완성 프레임워크

Android 9에서는 양식 작성 시 사용자 환경을 향상시키도록 자동 완성 서비스를 구현할 수 있는 여러 가지 개선된 기능이 도입되었습니다. 앱에서 자동 완성 기능을 사용하는 방법에 대해 자세히 알아보려면 자동 완성 프레임워크 가이드를 참조하세요.

보안 기능 향상

Android 9에는 여러 가지 보안 기능이 도입되는데, 다음에 이어지는 각 섹션에 그 내용이 요약되어 있습니다.

Android Protected Confirmation

Android 9 이상을 실행하는 지원 기기에서는 Android Protected Confirmation을 사용할 수 있습니다. 이 워크플로를 사용할 때 앱에 프롬프트가 표시되어 사용자에게 짧은 문을 승인해 줄 것을 요구합니다. 앱에서 이 문을 통해 사용자가 결제와 같은 중요한 트랜잭션을 완료하겠다는 의사를 재차 확인할 수 있습니다.

사용자가 이 문을 수락하면 Android Keystore가 키 해시 메시지 인증 코드(HMAC)로 보호되는 암호화 서명을 받아서 저장합니다. Android Keystore가 메시지의 유효성을 확인하고 나면 앱이 TEE(신뢰할 수 있는 실행 환경)의 trustedConfirmationRequired에서 생성되는 키를 사용하여 사용자가 수락한 메시지에 서명할 수 있습니다. 이 서명은 매우 큰 확신을 가지고서 사용자가 문을 보고 그 내용에 동의했음을 나타냅니다.

주의: Android Protected Confirmation은 사용자를 위한 보안 정보 채널을 제공하지 않습니다. 앱은 Android 플랫폼이 제공하는 수준을 넘어서는 그 어떤 기밀성 보장도 추정할 수 없습니다. 특히, 통상적으로 사용자 기기에 표시하지 않을 민감한 정보를 표시하려는 목적으로 이 워크플로를 사용하지 마세요.

Android Protected Confirmation에 대한 지원 추가에 관한 안내 사항은 Android Protected Confirmation 가이드를 참조하세요.

통합 생체 인식 인증 대화상자

Android 9에서는 시스템이 앱을 대신해 생체 인식 인증 대화상자를 제공합니다. 이 기능은 대화상자에 대해 표준화된 모양, 느낌, 배치를 만들어, 사용자가 신뢰할 수 있는 생체 인식 자격 증명 검사기를 상대로 인증하고 있음을 더욱 확신할 수 있도록 합니다.

앱이 FingerprintManager를 사용하여 사용자에게 지문 인증 대화상자를 표시하는 경우 BiometricPrompt를 대신 사용하도록 전환하세요. BiometricPrompt는 시스템에 의존하여 인증 대화상자를 표시합니다. 또한 사용자가 선택한 생체 인식 인증 유형에 적응하기 위해 동작을 변경합니다.

참고: 앱에 BiometricPrompt를 사용하기 전에 먼저 hasSystemFeature() 메서드를 사용하여 기기가 FEATURE_FINGERPRINT, FEATURE_IRIS 또는 FEATURE_FACE를 지원하는지 확인해야 합니다. 생체 인식 인증을 지원하지 않는 기기일 경우에는 createConfirmDeviceCredentialIntent() 메서드를 사용하여 사용자의 PIN, 패턴 또는 비밀번호 확인으로 대체할 수 있습니다.

하드웨어 보안 모듈

Android 9 이상이 설치되어 실행되는 지원 기기에는 하드웨어 보안 모듈에 있는 Keymaster HAL의 구현인 StrongBox Keymaster가 있을 수 있습니다. 모듈의 포함 내역은 다음과 같습니다.

  • 자체 CPU
  • 보안 스토리지
  • 순수 난수 생성기
  • 패키지 무단 변조와 앱의 무단 사이드로딩을 저지하는 추가 메커니즘

시스템은 StrongBox Keymaster에 저장된 키를 검사할 때 TEE(Trusted Execution Environment)로 키의 무결성을 확증합니다.

Strongbox Keymaster 사용에 관한 자세한 내용은 하드웨어 보안 모듈을 참조하세요.

Keystore로 키 가져오기 보호

Android 9은 ASN.1으로 인코딩된 키 형식을 사용하여 암호화된 키를 Keystore로 안전하게 가져오는 기능을 추가함으로써 키 암호화 보안을 더욱 강화합니다. 그러면 Keymaster가 Keystore에 있는 키를 암호화 해제하므로, 키의 내용이 결코 기기의 호스트 메모리에 일반 텍스트로 나타나지 않습니다.

참고: 이 기능은 Keymaster 4 이상과 함께 제공되는 기기에서만 지원됩니다.

암호화된 키를 더 안전하게 가져오기 위한 방법에 대해 자세히 알아보세요.

키 순환을 포함한 APK 서명 구성표

Android 9은 APK Signature Scheme v3를 위한 지원을 추가합니다. 이 체계에는 각각의 서명 인증서를 위한 서명 블록에 순환 증명 레코드를 포함하기 위한 옵션이 있습니다. 이 기능을 사용하여 APK 파일의 지난 서명 인증서를 현재 서명되어 있는 인증서에 연결함으로써 새로운 서명 인증서로 앱을 서명할 수 있습니다.

참고: Android 8.1(API 레벨 27) 이하가 실행되는 기기에서는 서명 인증서 변경이 지원되지 않습니다. 앱의 minSdkVersion27 이하인 경우 새 서명 외에도 이전의 서명 인증서를 사용하여 앱을 서명하세요.

apksigner를 사용하여 키를 순환하는 방법에 대해 자세히 알아보세요.

잠금 해제된 기기에서만 키 복호화를 허용하는 옵션

Android 9에서는 unlockedDeviceRequired 플래그가 도입됩니다. 이 옵션에 따라 Keystore가 지정된 키를 사용하여 사용 중인 데이터나 저장된 데이터의 복호화를 허용하기 전에 화면을 잠금 해제해야 할지 여부가 결정됩니다. 이러한 유형의 키는 상태 데이터나 기업 데이터처럼 디스크에 저장할 민감한 데이터를 암호화하기에 적합합니다. 사용자는 이 플래그를 보고 전화기를 분실하거나 도난당하더라도 기기가 잠겨 있는 동안에는 데이터를 복호화할 수 없을 것이라는 점을 더욱 확신할 수 있습니다.

참고: unlockedDeviceRequired 플래그가 활성화되더라도 암호화와 서명 확인은 언제든 가능합니다. 이 플래그는 기기가 잠금 해제될 때 데이터의 복호화만 방지할 뿐입니다.

기기가 잠겨 있는 동안 키가 복호화되지 않도록 안전하게 보관하려면 truesetUnlockedDeviceRequired() 메서드로 전달하여 이 플래그를 활성화하세요. 이 단계를 마친 후 사용자 화면이 잠기면 이 키를 사용하여 복호화하거나 데이터에 서명하려는 어떤 시도도 실패로 돌아갑니다. 잠긴 기기를 다시 사용하려면 PIN, 비밀번호, 지문 또는 신뢰할 수 있는 다른 인증 요소로 인증해야 합니다.

레거시 암호화 지원

Keymaster 4와 함께 제공되는 Android 9 기기는 Triple DES(Triple Data Encryption Algorithm)를 지원합니다. 앱이 Triple DES를 요구하는 레거시 시스템과 상호 운용되는 경우 중요한 자격 증명을 암호화할 때 이 유형의 암호화를 사용하세요.

앱을 더 안전하게 만드는 방법에 관해 자세히 알아보려면 Android 개발자를 위한 보안을 참조하세요.

Android 백업

Android 9에는 백업 및 복원과 관련된 새로운 기능과 개발자 옵션이 추가됩니다. 이러한 변경사항에 대한 세부정보는 다음에 이어지는 섹션에 나옵니다.

클라이언트 측 암호화 백업

Android 9에는 클라이언트 측 암호로 Android 백업을 암호화하기 위한 지원 기능이 추가됩니다. 이 지원 기능은 다음 조건이 충족될 때 자동으로 활성화됩니다.

이러한 개인정보 보호 수단이 사용될 때 사용자의 기기에서 수행된 백업으로부터 데이터를 복구하려면 기기의 PIN, 패턴 또는 암호가 필요합니다. 이 기능의 이면 기술에 대해 자세히 알아보려면 Google Cloud Key Vault Service 백서를 참조하세요.

백업에 필요한 기기 조건 정의

앱 데이터에 민감한 정보나 기본 설정이 포함되는 경우 Android 9에서는 클라이언트 측 암호화가 설정되거나 로컬 기기 간 전송이 이루어질 때와 같이, 사용자의 데이터가 사용자의 백업에 포함되는 기기 조건을 정의할 수 있는 기능을 제공합니다.

Android 기기상의 데이터 백업에 자세히 알아보려면 데이터 백업 개요를 참조하세요.

접근성

Android 9에서는 접근성 프레임워크에 대해 향상된 기능이 도입되는데, 그 덕분에 앱 사용자에게 훨씬 더 나은 환경을 더욱 수월하게 제공할 수 있습니다.

탐색 의미 체계

Android 9에 추가된 속성 덕분에 특히 스크린 리더와 같은 접근성 서비스가 화면의 한 부분에서 다른 부분으로 탐색하는 방식을 더 쉽게 정의할 수 있습니다. 이러한 속성은 시각장애가 있는 사용자가 빠르게 앱의 UI 텍스트를 훑으며 이동하면서 원하는 항목을 선택하는 데 도움이 될 수 있습니다.

예를 들어 쇼핑 앱에서는 스크린 리더가 한 상품 카테고리에 있는 모든 항목을 읽은 후에 다음 카테고리로 이동할 필요 없이, 사용자가 한 카테고리에서 다음 카테고리로 바로 탐색하도록 할 수 있습니다.

접근성 창 제목

Android 8.1(API 레벨 27) 이하에서는 접근성 서비스가 특정한 화면 창이 업데이트된 시점(예: 액티비티가 한 프래그먼트를 다른 프래그먼트로 바꾸는 시점)을 항상 결정할 수 있는 것은 아닙니다. 창은 논리적으로 그룹화되고 시각적으로 관련되어 있어 일반적으로 한 프래그먼트를 이루는 UI 요소로 구성됩니다.

Android 9에서는 이러한 창에 대해 접근성 창 제목이나 개별적으로 식별 가능한 제목을 지정할 수 있습니다. 창에 접근성 창 제목이 있는 경우 접근성 서비스는 창이 바뀔 때 더 자세한 정보를 받습니다. 이 기능을 통해 UI에서 변경된 사항에 대해 사용자에게 더욱 세분화된 정보를 제공하는 서비스가 가능합니다.

창의 제목을 지정하려면 android:accessibilityPaneTitle 속성을 사용하세요. 또한 setAccessibilityPaneTitle()을 사용하여 런타임 시에 대체되는 UI 창의 제목을 업데이트할 수도 있습니다. 예를 들어, Fragment 객체의 콘텐츠 영역에 제목을 입력할 수 있습니다.

제목 기반의 탐색

앱이 논리적 제목을 포함하는 텍스트 콘텐츠를 표시하는 경우, 이러한 제목을 나타내는 View의 인스턴스에 대해 android:accessibilityHeading 속성을 true로 설정하세요. 이런 제목을 추가하면 사용자가 한 제목에서 다음 제목으로 바로 탐색하는 데 접근성 서비스가 도움이 되도록 할 수 있습니다. 어떤 접근성 서비스든 이 기능을 사용하여 사용자의 UI 탐색 환경을 개선할 수 있습니다.

그룹 탐색 및 출력

스크린 리더는 전통적으로 android:focusable 속성을 사용하여 ViewGroup 또는 View 객체의 모음을 단일 유닛으로 읽어야 하는 시점을 판별해왔습니다. 그런 식으로, 사용자는 뷰가 서로 논리적으로 관련되어 있음을 이해할 수 있었습니다.

Android 8.1 이하에서는 ViewGroup 내에 있는 각 View 객체를 포커스 가능하지 않은 것으로 표시하고 ViewGroup 자체는 포커스 가능한 것으로 표시해야 합니다. 이러한 배치에서는 View의 일부 인스턴스가 '포커스 가능'으로 표시되었으며, 이로 인해 키보드 탐색이 더욱 번거롭게 되었습니다.

Android 9부터는 View 객체를 '포커스 가능'으로 만들 경우 원치 않는 결과가 나올 수 있는 상황에서 android:focusable 속성 대신 android:screenReaderFocusable 속성을 사용할 수 있습니다. 스크린 리더는 android:screenReaderFocusable 또는 android:focusabletrue로 설정한 모든 요소에 포커스를 둡니다.

편의 작업

Android 9에서는 사용자를 대신하여 편의 작업을 수행하기 위한 지원이 추가되었습니다.

도움말과의 상호작용
접근성 프레임워크에 추가된 기능을 사용하여 앱 UI의 도움말에 액세스할 수 있습니다. 도움말 텍스트를 읽으려면 getTooltipText())를 사용하고, 도움말을 표시하거나 숨기도록 View 인스턴스에 지시하려면 ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP을 사용합니다.
추가된 전역 작업
Android 9에는 AccessibilityService 클래스에서 두 가지 추가 기기 작업을 위한 지원이 제공됩니다. 여러분의 서비스에서 사용자가 각각 GLOBAL_ACTION_LOCK_SCREENGLOBAL_ACTION_TAKE_SCREENSHOT 액션을 사용하여 기기를 잠그고 스크린샷을 찍을 수 있습니다.

창 변경 세부정보

Android 9에서는 앱이 여러 창을 동시에 다시 그릴 때 이들 창의 업데이트를 더욱 쉽게 추적할 수 있습니다. TYPE_WINDOWS_CHANGED 이벤트가 발생하는 경우, getWindowChanges() API를 사용하여 창이 어떻게 변경되었는지 판별할 수 있습니다. 여러 창이 업데이트되는 경우 각 창은 자체 이벤트 집합을 생성합니다. getSource() 메서드는 각 이벤트와 관련된 창의 루트 뷰를 반환합니다.

앱에서 View 객체에 대해 접근성 창 제목을 정의한 경우, 여러분의 서비스는 앱 UI가 언제 업데이트되는지 식별할 수 있습니다. TYPE_WINDOW_STATE_CHANGED 이벤트가 발생하는 경우, getContentChangeTypes())에 의해 반환되는 유형을 사용하여 창이 어떻게 변경되었는지 판별할 수 있습니다. 예를 들어, 프레임워크에서 창에 새로운 제목이 있거나 창이 사라진 경우 이를 감지할 수 있습니다.

회전

원치 않는 회전을 없애기 위해 저희는 기기 위치가 바뀌더라도 현재 방향이 고정되는 모드를 추가했습니다. 필요할 때 사용자가 시스템 바의 버튼을 눌러 수동으로 회전을 트리거할 수 있습니다.

앱에 대한 호환성의 영향은 대부분의 경우 최소한입니다. 그러나 사용자 회전 기본 설정이 항상 세로 모드로 설정된 경우, 앱에 맞춤형 회전 동작이 있거나 이상한 화면 방향 설정이 사용된다면 이전에는 눈에 띄지 않았을 문제가 발생할 수도 있습니다. 저희가 권장하는 방법은, 앱의 모든 주요 액티비티에서 회전 동작을 살펴보고 모든 화면 방향 설정이 여전히 최적의 경험을 제공하는지 확인하는 것입니다.

자세한 내용은 관련된 동작 변경사항을 참조하세요.

새로운 회전 모드에서는 필요할 때 사용자가 시스템 바의 새 버튼을 사용하여 수동으로 회전을 트리거할 수 있습니다.

텍스트

Android 9은 다음과 같은 텍스트 관련 기능을 플랫폼으로 가져옵니다.

  • Precomputed Text: PrecomputedText 클래스는 예정보다 빨리 필요한 정보를 계산하고 캐시할 수 있게 함으로써 텍스트 렌더링 성능을 향상합니다. 이 클래스를 사용하여 앱이 메인 스레드를 벗어나 텍스트 레이아웃을 수행하도록 할 수도 있습니다.

  • Magnifier: Magnifier 클래스는 돋보기 API를 제공하는 플랫폼 위젯으로, 모든 앱에서 일관된 돋보기 기능을 사용할 수 있게 해줍니다.

  • Smart Linkify: Android 9에서는 TextClassifier 클래스가 머신러닝을 활용하여 선택된 텍스트에서 엔터티를 식별하고 액션을 제안하도록 개선됩니다. 예를 들어 TextClassifier를 사용하면 사용자가 전화 번호를 선택했다는 사실을 앱이 알아차릴 수 있습니다. 그러면 앱이 사용자에게 그 번호로 전화를 걸도록 제안할 수 있습니다. TextClassifier의 기능은 Linkify 클래스의 기능을 대체합니다.

  • Text Layout: 여러 가지 편리한 메서드와 속성으로 UI 디자인을 더 쉽게 구현할 수 있습니다. 자세한 내용은 TextView에 대한 참조 문서를 살펴보세요.

DEX 파일의 ART AOT(Ahead-Of-Time) 변환

Android 9 이상이 실행되는 기기에서는 ART(Android 런타임) AOT(ahead-of-time) 컴파일러가 앱 패키지에 있는 DEX(Dalvik Executable) 파일을 더 콤팩트한 표시로 변환하여 압축된 DEX 형식 파일을 더욱 최적화합니다. 이러한 변경사항에 따라 앱이 더 빠르게 시작하고 디스크 공간과 RAM을 덜 소비할 수 있습니다.

이 개선 사항은 특히 디스크 I/O 속도가 느린 저사양 기기에 도움이 됩니다.

온디바이스 시스템 추적

Android 9에서는 기기에서 시스템 트레이스를 기록한 다음, 이 기록에 대한 보고서를 개발팀과 공유할 수 있습니다. 이 보고서는 HTML을 비롯한 여러 가지 형식을 지원합니다.

이런 트레이스를 수집함으로써 앱의 프로세스 및 스레드와 관련된 타이밍 데이터를 캡처하고 전체적으로 중요한 다른 유형의 기기 상태를 볼 수 있습니다.

참고: 트레이스를 기록하기 위해 코드를 계측할 필요는 없지만, 이를 실행해보면 앱 코드의 어떤 부분이 스레드 장애 또는 UI 버벅거림의 원인이 될지 파악하는 데 도움이 될 수 있습니다.

이 도구에 대해 자세히 알아보려면 온디바이스 시스템 추적을 참조하세요.