Android 9 (API 수준 28)에는 사용자와 개발자를 위한 훌륭한 새로운 기능이 도입되었습니다. 이 문서에서는 개발자를 위한 새로운 기능을 소개합니다.
새 API에 관해 알아보려면 API 차이점 보고서를 읽거나 Android API 참조를 참고하세요. Android 9 동작 변경사항을 확인하여 플랫폼 변경이 앱에 영향을 줄 수 있는 분야에 관해 알아보세요.
Wi-Fi RTT를 사용한 실내 위치 파악
Android 9에서는 앱에서 실내 위치 파악을 활용할 수 있도록 IEEE 802.11-2016 Wi-Fi 프로토콜(Wi-Fi 왕복 시간(RTT)이라고도 함)에 대한 플랫폼 지원이 추가되었습니다.
하드웨어 지원이 포함된 Android 9를 실행하는 기기에서 앱은 RTT API를 사용하여 근처의 RTT 지원 Wi-Fi 액세스 포인트 (AP)까지의 거리를 측정할 수 있습니다. 기기에서 위치 서비스를 사용 설정하고 Wi-Fi 검색을 사용 설정해야 하며 (설정 > 위치) 앱에 ACCESS_FINE_LOCATION 권한이 있어야 합니다. RTT를 사용하기 위해 기기를 액세스 포인트에 연결할 필요는 없습니다.
개인 정보 보호를 위해 휴대전화만 액세스 포인트까지의 거리를 확인할 수 있습니다. 액세스 포인트에는 이 정보가 없습니다.
기기에서 3개 이상의 액세스 포인트까지의 거리를 측정하는 경우 다변측정(MLAT) 알고리즘을 사용하여 해당 측정에 가장 적합한 기기 위치를 추정할 수 있습니다. 일반적으로 1~2m 이내에서 결과가 정확합니다.
이 정도의 정확도에서는 건물 내 탐색, 명확한 음성 제어(예: '조명 켜줘'), 위치 기반 정보 (예: '이 제품에 관한 특별 이벤트가 있어?')와 같은 세밀한 위치 기반 서비스와 같은 새로운 환경을 구축할 수 있습니다.
Android WifiRttScan 데모 앱에서 사용 중인 Wi-Fi RTT API를 참고하세요.
자세한 내용은 Wi-Fi 위치: RTT를 사용한 범위 지정을 참고하세요.
디스플레이 컷아웃 지원
에뮬레이터를 사용하여 디스플레이 컷아웃 테스트
Android 9에서는 카메라와 스피커용 디스플레이 컷아웃이 포함된 최신 베젤리스 화면을 지원합니다. DisplayCutout 클래스를 사용하면 콘텐츠를 표시하면 안 되는 비기능 영역의 위치와 모양을 확인할 수 있습니다. 이러한 컷아웃 영역의 존재 여부와 위치를 확인하려면 getDisplayCutout() 메서드를 사용하세요.
새 창 레이아웃 속성인 layoutInDisplayCutoutMode을 사용하면 앱이 기기의 컷아웃 주위에 콘텐츠를 배치할 수 있습니다. 이 속성을 다음 값 중 하나로 설정할 수 있습니다.
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Android 9를 실행하는 기기나 에뮬레이터에서 다음과 같이 화면 컷아웃을 시뮬레이션할 수 있습니다.
- 개발자 옵션을 사용 설정합니다.
- 개발자 옵션 화면에서 그리기 섹션까지 아래로 스크롤하고 컷아웃이 있는 디스플레이 시뮬레이션을 선택합니다.
- 잘라낼 크기를 선택합니다.
알림
Android 9에서는 알림에 여러 개선사항이 도입되었으며, 이러한 개선사항은 모두 API 수준 28 이상을 타겟팅하는 개발자가 사용할 수 있습니다.
사진이 첨부된 MessagingStyle
답장과 대화가 있는 MessagingStyle
Android 9 기능을 포함하여 알림을 사용하는 샘플 코드는 사람 샘플을 참고하세요.
향상된 메시지 환경
Android 7.0 (API 수준 24)부터 알림에서 직접 메시지에 답장하거나 다른 텍스트를 입력하는 작업을 추가할 수 있습니다. Android 9에서는 다음과 같이 이 기능이 개선되었습니다.
대화 참여자 지원 간소화:
Person클래스는 아바타와 URI를 비롯하여 대화에 참여한 사용자를 식별하는 데 사용됩니다. 이제addMessage()와 같은 다른 많은 API가CharSequence대신Person클래스를 활용합니다.Person클래스는 빌더 디자인 패턴도 지원합니다.이미지 지원: 이제 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)
자바
// 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에는 다음과 같은 세 가지 새로운 방해 금지 모드 우선순위 카테고리가 있습니다.PRIORITY_CATEGORY_ALARMS은 알람을 우선시합니다.PRIORITY_CATEGORY_MEDIA는 미디어 및 음성 내비게이션과 같은 미디어 소스의 소리를 우선시합니다.PRIORITY_CATEGORY_SYSTEM는 시스템 소리에 우선순위를 부여합니다.
NotificationManager.Policy에는 시각적 중단을 억제하는 데 사용할 수 있는 7개의 새로운 방해 금지 모드 상수도 있습니다.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT는 알림이 전체 화면 활동을 실행하지 못하도록 합니다.SUPPRESSED_EFFECT_LIGHTS는 알림 표시등을 차단합니다.SUPPRESSED_EFFECT_PEEK을 사용하면 알림이 잠시 표시되는 것을 방지할 수 있습니다 ('엿보기').SUPPRESSED_EFFECT_STATUS_BAR는 상태 표시줄을 지원하는 기기의 상태 표시줄에 알림이 표시되지 않도록 합니다.SUPPRESSED_EFFECT_BADGE는 배지 지원 기기에서 배지를 차단합니다. 자세한 내용은 알림 배지 수정을 참고하세요.SUPPRESSED_EFFECT_AMBIENT대기 화면 모드를 지원하는 기기에서 알림을 차단합니다.SUPPRESSED_EFFECT_NOTIFICATION_LIST는 알림 창이나 잠금 화면과 같은 목록 보기를 지원하는 기기의 목록 보기에 알림이 표시되지 않도록 합니다.
다중 카메라 지원 및 카메라 업데이트
Android 9를 실행하는 기기에서는 두 개 이상의 물리적 카메라에서 동시에 스트림에 액세스할 수 있습니다. 듀얼 전면 또는 듀얼 후면 카메라가 있는 기기에서는 끊김 없는 줌, 빛망울 효과, 스테레오 비전과 같이 단일 카메라로는 불가능한 혁신적인 기능을 만들 수 있습니다. 또한 API를 사용하면 두 개 이상의 카메라 간에 자동으로 전환되는 논리 또는 융합 카메라 스트림을 호출할 수 있습니다.
카메라의 기타 개선사항에는 초기 캡처 중 지연을 줄이는 데 도움이 되는 추가 세션 매개변수와 카메라 클라이언트가 카메라 스트리밍을 중지하고 시작하지 않고도 다양한 사용 사례를 처리할 수 있는 표면 공유가 포함됩니다. 또한 앱 수준 이미지 안정화 및 특수 효과를 위해 디스플레이 기반 플래시 지원 및 OIS 타임스탬프 액세스를 위한 API도 추가했습니다.
Android 9에서 다중 카메라 API는 FULL 또는 LIMITED 기능이 있는 기기의 흑백 카메라를 지원합니다.
흑백 출력은 Y를 그레이 스케일로, U (Cb)를 128로, V (Cr)을 128로 하는 YUV_420_888 형식을 통해 달성됩니다.
Android 9에서는 지원되는 기기에서 외부 USB/UVC 카메라 지원도 사용 설정합니다.
드로어블 및 비트맵용 ImageDecoder
Android 9에서는 이미지를 디코딩하는 최신 접근 방식을 제공하는 ImageDecoder 클래스가 도입되었습니다. BitmapFactory 및 BitmapFactory.Options API 대신 이 클래스를 사용하세요.
ImageDecoder를 사용하면 바이트 버퍼, 파일 또는 URI에서 Drawable 또는 Bitmap를 만들 수 있습니다. 이미지를 디코딩하려면 먼저 인코딩된 이미지의 소스를 사용하여 createSource()를 호출합니다. 그런 다음 ImageDecoder.Source 객체를 전달하여 decodeDrawable() 또는 decodeBitmap()를 호출하여 Drawable 또는 Bitmap를 만듭니다. 기본 설정을 변경하려면 OnHeaderDecodedListener을 decodeDrawable() 또는 decodeBitmap()에 전달하세요. ImageDecoder는 이미지의 기본 너비와 높이가 알려지면 이를 사용하여 onHeaderDecoded()를 호출합니다.
인코딩된 이미지가 애니메이션 GIF 또는 WebP인 경우 decodeDrawable()는 AnimatedImageDrawable 클래스의 인스턴스인 Drawable를 반환합니다.
이미지 속성을 설정하는 방법에는 여러 가지가 있습니다.
- 디코딩된 이미지를 정확한 크기로 조정하려면 타겟 크기를
setTargetSize()에 전달합니다. 샘플 크기를 사용하여 이미지를 조정할 수도 있습니다. 샘플 크기를setTargetSampleSize()에 직접 전달합니다. - 확대된 이미지 범위 내에서 이미지를 자르려면
setCrop()를 호출합니다. - 변경 가능한 비트맵을 만들려면
true를setMutableRequired()에 전달합니다.
ImageDecoder을 사용하면 둥근 모서리나 원 마스크와 같은 맞춤설정되고 복잡한 효과를 이미지에 추가할 수도 있습니다. PostProcessor 클래스의 인스턴스와 함께 setPostProcessor()를 사용하여 원하는 그리기 명령어를 실행합니다.
애니메이션
Android 9에서는 GIF 및 WebP 애니메이션 이미지를 그리고 표시하는 AnimatedImageDrawable 클래스가 도입되었습니다.
AnimatedImageDrawable는 렌더링 스레드가 AnimatedImageDrawable의 애니메이션을 구동한다는 점에서 AnimatedVectorDrawable와 유사하게 작동합니다.
렌더링 스레드는 작업자 스레드를 사용하여 디코딩하므로 디코딩이 렌더링 스레드의 다른 작업을 방해하지 않습니다. 이 구현을 사용하면 앱이 업데이트를 관리하거나 앱의 UI 스레드에서 다른 이벤트를 방해하지 않고도 애니메이션 이미지를 표시할 수 있습니다.
AnimatedImageDrawable는 ImageDecoder 인스턴스를 사용하여 디코딩할 수 있습니다. 다음 코드 스니펫은 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() }
자바
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에서는 High Dynamic Range (HDR) VP9 프로필 2가 기본적으로 지원되므로 HDR 지원 기기에서 YouTube, Play 무비, 기타 소스의 HDR 지원 영화를 사용자에게 제공할 수 있습니다.
Android 9에서는 고효율 이미지 파일 형식 (HEIF 또는 HEIC)을 사용하여 이미지를 인코딩하는 기능도 추가되어 압축이 개선되고 저장공간과 네트워크 데이터 사용량이 줄어듭니다. HEIF 정지 이미지 샘플은 MediaMuxer 및 MediaExtractor 클래스에서 지원됩니다. Android 9 기기에서 플랫폼을 지원하므로 백엔드 서버에서 HEIF 이미지를 쉽게 전송하고 활용할 수 있습니다. 앱이 공유 및 표시를 위해 이 데이터 형식과 호환되는지 확인한 후 앱에서 이미지 저장 형식으로 HEIF를 사용해 보세요. ImageDecoder 또는 BitmapFactory (JPEG 파일에서 비트맵을 가져옴)을 사용하여 jpeg-to-heic 변환을 할 수 있습니다. 그런 다음 HeifWriter를 사용하여 YUV 바이트 버퍼나 Surface 또는 Bitmap 인스턴스에서 HEIF 정지 이미지를 쓸 수 있습니다.
미디어 측정항목은 AudioTrack, AudioRecord, MediaDrm 클래스에서도 사용할 수 있습니다.
Android 9에서는 MediaDRM 클래스에 측정항목, HDCP 수준, 보안 수준, 세션 수를 가져오고 보안 수준과 보안 중지에 대한 제어를 추가하는 메서드를 도입합니다. 자세한 내용은 API 차이 보고서를 참고하세요.
Android 9에서 AAudio API는 사용, 콘텐츠 유형, 입력 사전 설정을 비롯한 여러 추가 AAudioStream 속성에 대한 지원을 추가합니다. 이러한 속성을 사용하여 VoIP 또는 캠코더 애플리케이션에 맞게 조정된 스트림을 만들 수 있습니다. 효과를 포함할 수 있는 서브믹스와 AAudio 스트림을 연결하도록 세션 ID를 설정할 수도 있습니다. AudioEffect API를 사용하여 효과를 제어합니다.
Android 9에서는 동적 처리을 위한 AudioEffect API가 도입되었습니다.
이 클래스를 사용하면 여러 단계에 걸쳐 이퀄라이제이션, 멀티밴드 압축, 리미터 등 채널 기반 오디오 효과를 빌드할 수 있습니다. 밴드 수와 활성 단계는 구성할 수 있으며 대부분의 매개변수는 실시간으로 제어할 수 있습니다.
JobScheduler의 데이터 비용 민감도
Android 9부터 JobScheduler는 이동통신사에서 제공하는 네트워크 상태 신호를 사용하여 네트워크 관련 작업의 처리를 개선할 수 있습니다.
작업은 예상 데이터 크기를 선언하고, 미리 가져오기를 신호로 보내고, 자세한 네트워크 요구사항을 지정할 수 있습니다. 그러면 JobScheduler가 네트워크 상태에 따라 작업을 관리합니다. 예를 들어 네트워크가 혼잡하다고 신호를 보내면 JobScheduler는 대규모 네트워크 요청을 연기할 수 있습니다. 무제한 네트워크에 연결된 경우 JobScheduler은 헤드라인을 미리 가져오는 등 사용자 환경을 개선하기 위해 미리 가져오기 작업을 실행할 수 있습니다.
작업을 추가할 때 적절한 경우 setEstimatedNetworkBytes(), setPrefetch(), setRequiredNetwork()를 사용하여 JobScheduler가 작업을 올바르게 처리하도록 지원하세요. 작업이 실행될 때 JobParameters.getNetwork()에서 반환된 Network 객체를 사용해야 합니다.
그렇지 않으면 요구사항을 충족하지 않아 의도치 않은 데이터 사용을 유발할 수 있는 기기의 기본 네트워크가 암시적으로 사용됩니다.
Neural Networks API 1.1
Neural Networks API는 Android에서 온디바이스 머신러닝을 가속화하기 위해 Android 8.1 (API 수준 27)에서 도입되었습니다. Android 9에서는 API를 확장하고 개선하여 다음과 같은 9가지 새로운 작업을 지원합니다.
- 요소별 수학 연산:
- 배열 작업:
알려진 문제: Android 9 이상에서 사용할 수 있는 ANEURALNETWORKS_PAD 작업에 ANEURALNETWORKS_TENSOR_QUANT8_ASYMM 텐서를 전달할 때 NNAPI의 출력이 TensorFlow Lite와 같은 상위 수준 머신러닝 프레임워크의 출력과 일치하지 않을 수 있습니다. 대신 문제가 해결될 때까지
ANEURALNETWORKS_TENSOR_FLOAT32만 전달해야 합니다.
또한 이 API는 IEEE 754 16비트 부동 소수점 형식의 범위 및 정밀도만큼 낮은 범위 및 정밀도로 ANEURALNETWORKS_TENSOR_FLOAT32을 계산할지 여부를 지정할 수 있는 새로운 함수 ANeuralNetworksModel_relaxComputationFloat32toFloat16()도 도입합니다.
자동 완성 프레임워크
Android 9에서는 자동 완성 서비스가 양식을 작성할 때 사용자 환경을 더욱 개선하기 위해 구현할 수 있는 여러 개선사항을 도입했습니다. 앱에서 자동 완성 기능을 사용하는 방법에 관한 자세한 내용은 자동 완성 프레임워크 가이드를 참고하세요.
보안 기능 향상
Android 9에서는 다음과 같은 여러 보안 기능을 도입했습니다.
Android 보안 확인
Android 9 이상을 실행하는 지원 기기에서는 Android 보안 확인을 사용할 수 있습니다. 이 워크플로를 사용하면 앱에서 사용자에게 간단한 문장을 승인할지 묻는 메시지를 표시합니다. 이 명령문을 사용하면 앱에서 사용자가 결제와 같은 민감한 거래를 완료하기를 바란다는 것을 재차 확인할 수 있습니다.
사용자가 이 문장을 수락하면 Android 키 저장소는 키 해시 메시지 인증 코드 (HMAC)로 보호되는 암호화 서명을 수신하고 저장합니다. Android 키 저장소에서 메시지의 유효성을 확인한 후 앱은 신뢰할 수 있는 실행 환경 (TEE)에서 trustedConfirmationRequired로 생성된 키를 사용하여 사용자가 수락한 메시지에 서명할 수 있습니다. 이 서명은 강한 확신을 가지고 사용자가 문장을 보고 그 내용에 동의했음을 나타냅니다.
주의: Android 보안 확인은 사용자를 위한 보안 정보 채널을 제공하지 않습니다. 앱은 Android 플랫폼이 제공하는 수준을 넘어서는 그 어떤 기밀성 보장도 가정할 수 없습니다. 특히, 통상적으로 사용자 기기에 표시하지 않을 민감한 정보를 표시하려는 목적으로 이 워크플로를 사용해서는 안 됩니다.
Android 보안 확인 지원을 추가하는 방법에 관한 안내는 Android 보안 확인 가이드를 참고하세요.
통합 생체 인식 인증 대화상자
Android 9에서는 시스템이 앱을 대신하여 생체 인식 인증 대화상자를 제공합니다. 이 기능은 대화상자의 표준화된 디자인, 느낌, 배치를 만들어 사용자가 신뢰할 수 있는 생체 인식 사용자 인증 정보 검사기에 대해 인증하고 있다는 확신을 갖게 합니다.
앱에서 FingerprintManager를 사용하여 사용자에게 지문 인증 대화상자를 표시하는 경우 BiometricPrompt을 대신 사용하도록 전환하세요. BiometricPrompt는 시스템이 인증 대화상자를 표시하는 데 의존합니다. 또한 사용자가 선택한 생체 인식 인증 유형에 맞게 동작을 변경합니다.
하드웨어 보안 모듈
Android 9 이상을 실행하고 설치된 지원 기기에는 하드웨어 보안 모듈에 있는 KeyMint (이전의 Keymaster) HAL 구현인 StrongBox KeyMint (이전의 Keymaster)가 있을 수 있습니다. 모듈에 포함된 구성요소는 다음과 같습니다.
- 자체 CPU
- 보안 저장소
- 순수 난수 생성기
- 패키지 변조와 앱의 무단 사이드로드를 방지하는 추가 메커니즘
StrongBox KeyMint에 저장된 키를 확인할 때 시스템은 신뢰할 수 있는 실행 환경 (TEE)으로 키의 무결성을 확인합니다.
StrongBox KeyMint 사용에 관한 자세한 내용은 하드웨어 보안 모듈을 참고하세요.
키 저장소로 보안 키 가져오기
Android 9는 ASN.1로 인코딩된 키 형식을 사용하여 암호화된 키를 키 저장소로 안전하게 가져오는 기능을 추가하여 키 복호화 보안을 강화합니다. 그런 다음 KeyMint가 키 저장소의 키를 복호화하므로 키의 내용이 기기의 호스트 메모리에 일반 텍스트로 표시되지 않습니다.
암호화된 키를 더 안전하게 가져오는 방법을 자세히 알아보세요.
키 순환이 적용된 APK 서명 체계
Android 9에서는 APK 서명 체계 v3 지원이 추가되었습니다. 이 스킴에는 각 서명 인증서의 서명 블록에 키 순환 증빙 자료 레코드를 포함하는 옵션이 있습니다. 이 기능을 사용하면 APK 파일의 이전 서명 인증서를 현재 서명된 인증서에 연결하여 새 서명 인증서로 앱에 서명할 수 있습니다.
apksigner을 사용하여 키를 순환하는 방법을 자세히 알아보세요.
잠금 해제된 기기에서만 키 복호화를 허용하는 옵션
Android 9에서는 unlockedDeviceRequired 플래그가 도입되었습니다. 이 옵션은 키 저장소에서 지정된 키를 사용하여 전송 중이거나 저장된 데이터를 복호화하기 전에 화면 잠금 해제가 필요한지 여부를 결정합니다. 이러한 유형의 키는 건강 또는 기업 데이터와 같이 디스크에 저장할 민감한 데이터를 암호화하는 데 적합합니다. 이 플래그는 휴대전화를 분실하거나 도난당한 경우 기기가 잠겨 있는 동안 데이터를 복호화할 수 없다는 것을 사용자에게 더 확실하게 보장합니다.
기기가 잠겨 있는 동안 키가 복호화되지 않도록 하려면 true를 setUnlockedDeviceRequired() 메서드에 전달하여 플래그를 사용 설정하세요. 이 단계를 완료하면 사용자의 화면이 잠겨 있을 때 이 키를 사용하여 데이터를 복호화하거나 서명하려는 시도가 실패합니다. 잠긴 기기에 액세스하려면 PIN, 비밀번호, 지문 또는 기타 신뢰할 수 있는 요소가 필요합니다.
기존 암호화 지원
Keymaster 4와 함께 제공되는 Android 9 기기는 3중 데이터 암호화 알고리즘(Triple DES)을 지원합니다. 앱이 Triple DES가 필요한 기존 시스템과 상호 운용되는 경우 민감한 사용자 인증 정보를 암호화할 때 이 유형의 암호를 사용하세요.
앱의 보안을 강화하는 방법을 자세히 알아보려면 Android 개발자를 위한 보안을 참고하세요.
WPS 지원 중단
보안상의 이유로 Wi-Fi Protected 설정 (WPS)이 지원 중단됩니다.
Android 백업
Android 9에서는 백업 및 복원과 관련된 새로운 기능과 개발자 옵션이 추가되었습니다. 이러한 변경사항에 대한 세부정보는 다음 섹션에 나와 있습니다.
클라이언트 측 암호화 백업
Android 9에서는 클라이언트 측 비밀번호로 Android 백업을 암호화하는 지원이 추가되었습니다. 이 지원은 다음 조건을 충족하면 자동으로 사용 설정됩니다.
- 사용자가 Android 9 이상을 사용하여 백업을 사용 설정했습니다.
- 사용자가 잠금 해제에 PIN, 패턴 또는 비밀번호가 필요한 기기에 화면 잠금을 설정했습니다.
이 개인 정보 보호 조치를 사용 설정하면 사용자의 기기에서 만든 백업에서 데이터를 복원하는 데 기기의 PIN, 패턴 또는 비밀번호가 필요합니다. 이 기능의 기반이 되는 기술에 대해 자세히 알아보려면 Google Cloud Key Vault 서비스 백서를 참고하세요.
백업에 필요한 기기 조건 정의
앱 데이터에 민감한 정보나 환경설정이 포함된 경우 Android 9에서는 클라이언트 측 암호화가 사용 설정되었거나 로컬 기기 간 전송이 진행되는 등 사용자의 백업에 앱의 데이터가 포함되는 기기 조건을 정의할 수 있습니다.
Android 기기에서 데이터를 백업하는 방법을 자세히 알아보려면 데이터 백업 개요를 참고하세요.
접근성
Android 9에서는 접근성 프레임워크가 개선되어 앱 사용자에게 훨씬 더 나은 환경을 제공하기가 쉬워졌습니다.
탐색 시맨틱스
Android 9에 추가된 속성을 사용하면 접근성 서비스, 특히 스크린 리더가 화면의 한 부분에서 다른 부분으로 이동하는 방식을 더 쉽게 정의할 수 있습니다. 이러한 속성은 시각장애인이 앱의 UI에서 텍스트를 빠르게 이동하고 선택할 수 있도록 지원합니다.
예를 들어 쇼핑 앱에서 스크린 리더는 사용자가 한 카테고리의 특가에서 다음 카테고리로 직접 이동할 수 있도록 지원합니다. 스크린 리더가 다음 카테고리로 이동하기 전에 카테고리의 모든 항목을 읽지 않아도 됩니다.
접근성 창(pane) 제목
Android 8.1 (API 수준 27) 이하에서는 활동이 한 프래그먼트를 다른 프래그먼트로 대체하는 경우와 같이 화면의 특정 창이 업데이트된 시점을 접근성 서비스가 항상 확인할 수 있는 것은 아닙니다. 창은 일반적으로 프래그먼트로 구성된 논리적으로 그룹화되고 시각적으로 관련된 UI 요소로 구성됩니다.
Android 9에서는 이러한 창에 접근성 창 제목 또는 개별적으로 식별 가능한 제목을 제공할 수 있습니다. 창에 접근성 창 제목이 있으면 창이 변경될 때 접근성 서비스에서 더 자세한 정보를 수신합니다. 이 기능을 사용하면 서비스에서 UI의 변경사항에 관한 더 세분화된 정보를 사용자에게 제공할 수 있습니다.
창의 제목을 지정하려면 android:accessibilityPaneTitle 속성을 사용합니다. 런타임에 대체되는 UI 창의 제목을 setAccessibilityPaneTitle()를 사용하여 업데이트할 수도 있습니다.
예를 들어 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:focusable이 true로 설정된 모든 요소에 포커스를 배치합니다.
편의 작업
Android 9에서는 사용자를 대신하여 편의 작업을 실행하는 지원이 추가되었습니다.
- 도움말과의 상호작용
- 접근성 프레임워크에 추가된 기능을 사용하면 앱의 UI에서 도움말에 액세스할 수 있습니다.
getTooltipText()을 사용하여 도움말의 텍스트를 읽고ACTION_SHOW_TOOLTIP및ACTION_HIDE_TOOLTIP을 사용하여View인스턴스에 도움말을 표시하거나 숨기도록 지시합니다. - 전역 작업 추가
- Android 9에서는
AccessibilityService클래스에 두 가지 추가 기기 작업을 지원합니다. 서비스는 사용자가 각각GLOBAL_ACTION_LOCK_SCREEN및GLOBAL_ACTION_TAKE_SCREENSHOT작업을 사용하여 기기를 잠그고 스크린샷을 찍도록 지원할 수 있습니다.
창 변경 세부정보
Android 9에서는 앱이 여러 창을 동시에 다시 그릴 때 앱의 창 업데이트를 더 쉽게 추적할 수 있습니다. TYPE_WINDOWS_CHANGED 이벤트가 발생하면 getWindowChanges() API를 사용하여 창이 어떻게 변경되었는지 확인합니다. 멀티 윈도우 업데이트 중에 각 윈도우는 자체 이벤트 집합을 생성합니다.
getSource() 메서드는 각 이벤트와 연결된 창의 루트 뷰를 반환합니다.
앱이 View 객체에 접근성 창 제목을 정의한 경우 서비스는 앱의 UI가 업데이트되는 시점을 인식할 수 있습니다. TYPE_WINDOW_STATE_CHANGED 이벤트가 발생하면 getContentChangeTypes()에서 반환된 유형을 사용하여 창이 어떻게 변경되었는지 확인합니다. 예를 들어 프레임워크는 창에 새 제목이 있거나 창이 사라진 경우를 감지할 수 있습니다.
회전
의도치 않은 회전을 방지하기 위해 기기 위치가 변경되더라도 현재 방향을 고정하는 모드가 추가되었습니다. 사용자는 필요한 경우 시스템 표시줄의 버튼을 눌러 회전을 수동으로 트리거할 수 있습니다.
대부분의 경우 앱의 호환성 영향은 미미합니다. 하지만 앱에 맞춤 회전 동작이 있거나 비정상적인 화면 방향 설정을 사용하는 경우 사용자 회전 환경설정이 항상 세로로 설정되어 있을 때는 눈에 띄지 않았던 문제가 발생할 수 있습니다. 앱의 모든 주요 활동에서 회전 동작을 살펴보고 모든 화면 방향 설정이 여전히 최적의 환경을 제공하는지 확인하는 것이 좋습니다.
자세한 내용은 관련 동작 변경사항을 참고하세요.
새로운 회전 모드를 사용하면 사용자가 시스템 표시줄의 버튼을 사용하여 필요할 때 회전을 수동으로 트리거할 수 있습니다.
텍스트
Android 9에서는 다음과 같은 텍스트 관련 기능을 플랫폼에 도입합니다.
미리 계산된 텍스트:
PrecomputedText클래스를 사용하면 필요한 정보를 미리 계산하고 캐시하여 텍스트 렌더링 성능을 개선할 수 있습니다. 또한 앱이 기본 스레드에서 텍스트 레이아웃을 실행할 수 있습니다.돋보기:
Magnifier클래스는 돋보기 API를 제공하는 플랫폼 위젯으로, 모든 앱에서 일관된 돋보기 기능 환경을 지원합니다.스마트 링크화: Android 9에서는 머신러닝을 활용하여 선택한 텍스트의 일부 항목을 식별하고 작업을 제안하는
TextClassifier클래스를 개선합니다. 예를 들어TextClassifier를 사용하면 앱에서 사용자가 전화번호를 선택했음을 감지할 수 있습니다. 그러면 앱에서 사용자에게 해당 번호를 사용하여 전화를 걸도록 제안할 수 있습니다.TextClassifier의 기능은Linkify클래스의 기능을 대체합니다.텍스트 레이아웃: 여러 편의 메서드와 속성을 사용하면 UI 디자인을 더 쉽게 구현할 수 있습니다. 자세한 내용은
TextView참고 문서를 확인하세요.
DEX 파일의 ART 사전 변환
Android 9 이상을 실행하는 기기에서 Android 런타임(ART) AOT 컴파일러는 앱 패키지의 DEX 파일을 더 간결한 표현으로 변환하여 압축된 Dalvik Executable 형식 (DEX) 파일을 추가로 최적화합니다. 이 변경사항을 통해 앱을 더 빠르게 시작하고 디스크 공간과 RAM을 더 적게 사용할 수 있습니다.
이 개선사항은 특히 디스크 I/O 속도가 느린 저사양 기기에 유용합니다.
온디바이스 시스템 추적
Android 9에서는 기기에서 시스템 트레이스를 기록한 후 이러한 기록의 보고서를 개발팀과 공유할 수 있습니다. 이 보고서는 HTML을 비롯한 여러 형식을 지원합니다.
이러한 트레이스를 수집하면 앱의 프로세스 및 스레드와 관련된 타이밍 데이터를 캡처하고 전역적으로 중요한 다른 유형의 기기 상태를 볼 수 있습니다.
이 도구에 관해 자세히 알아보려면 온디바이스 시스템 추적 실행을 참고하세요.