기능 및 API 개요

Android 11에서는 개발자를 위한 훌륭한 새 기능과 API가 도입됩니다. 아래 섹션을 통해 앱을 위한 기능을 알아보고 관련 API를 살펴볼 수 있습니다.

새로운 API, 수정된 API, 삭제된 API에 관한 자세한 목록은 API 차이점 보고서를 참고하세요. 새로운 API에 관한 자세한 내용은 Android API 참조를 방문하세요. 새로운 API가 강조표시되어 쉽게 확인 가능합니다. 또한 플랫폼 변경이 앱에 영향을 줄 수 있는 분야에 관해 알아보려면 Android R을 타겟팅하는 앱모든 앱의 Android 11 동작 변경사항뿐만 아니라 개인정보 보호 변경사항도 확인하세요.

새로운 환경

기기 제어

Android 11에는 연결된 외부 기기의 컨트롤을 노출하는 데 사용할 수 있는 새로운 ControlsProviderService API가 포함되어 있습니다. 이러한 컨트롤은 Android 전원 메뉴의 기기 제어에 표시됩니다. 자세한 내용은 외부 기기 제어를 참조하세요.

미디어 컨트롤

Android 11은 미디어 컨트롤이 표시되는 방식을 업데이트합니다. 미디어 컨트롤은 빠른 설정 근처에 표시됩니다. 여러 앱의 세션은 휴대전화에서 로컬로 재생되는 스트림, 외부 기기 또는 전송 세션에서 감지되는 것과 같은 원격 스트림, 재개 가능한 이전 세션이 마지막으로 재생된 순서대로 포함된 스와이프할 수 있는 캐러셀로 배열됩니다.

사용자는 앱을 시작할 필요 없이 캐러셀에서 이전 세션을 다시 시작할 수 있습니다. 재생이 시작되면 사용자는 일반적인 방법으로 미디어 컨트롤과 상호작용합니다.

자세한 내용은 미디어 컨트롤을 참조하세요.

화면

워터폴 디스플레이 지원 향상

Android 11은 기기의 가장자리를 둘러싸는 디스플레이인 워터폴 디스플레이를 지원하기 위해 여러 가지 API를 제공합니다. 이러한 디스플레이는 디스플레이 컷아웃이 있는 변형된 디스플레이로 취급됩니다. 기존 DisplayCutout.getSafeInset…() 메서드는 이제 안전한 인셋을 반환하여 컷아웃뿐만 아니라 워터폴 영역을 피합니다. 워터폴 영역의 앱 콘텐츠를 렌더링하려면 다음을 따르세요.

  • DisplayCutout.getWaterfallInsets()를 호출하여 워터폴 인셋의 정확한 크기를 얻습니다.

  • 창 레이아웃 속성 layoutInDisplayCutoutModeLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS로 설정하여 화면의 모든 가장자리에 있는 컷아웃 및 워터폴 영역으로 창을 확장할 수 있습니다. 컷아웃 또는 워터폴 영역에는 중요한 기본 콘텐츠가 없어야 합니다.

힌지 각 센서 및 폴더블

Android 11에서는 힌지 기반 화면 구성이 있는 기기에서 실행되는 앱이 TYPE_HINGE_ANGLE과 힌지 각을 모니터링할 수 있는 새로운 SensorEvent를 새로운 센서에 제공하여 힌지 각을 확인할 수 있고 기기의 두 필수 부분 사이의 각도를 측정할 수 있습니다. 이러한 원시 측정값을 사용하여 사용자가 기기를 조작할 때 세분화된 애니메이션을 실행할 수 있습니다.

폴더블을 참조하세요.

대화

대화 개선사항

Android 11은 대화를 처리하는 방법을 여러 가지로 개선합니다. 대화는 두 명 이상의 사람들 간 실시간 양방향 통신입니다. 이러한 대화에는 특수한 가시도가 주어지며 사용자에게는 대화와 상호작용하는 방법과 관련된 여러 새로운 옵션이 있습니다.

대화 및 앱에서 대화를 지원하는 방법에 관한 자세한 내용은 사용자 및 대화를 참조하세요.

채팅 버블

이제 개발자는 버블을 사용하여 대화를 시스템 전반에서 노출할 수 있습니다. 대화창(버블)은 Android 10에서 개발자 옵션을 통해 사용 설정된 실험용 기능이었지만 Android 11에서는 옵션을 통한 설정이 더 이상 필요하지 않습니다.

앱이 Android 11(API 수준 30) 이상을 타겟팅한다면 앱의 알림은 새로운 대화 요구사항을 충족하지 않는 한 대화창으로 표시되지 않습니다. 특히 알림은 바로가기와 연결되어야 합니다.

Android 11 이전에는 알림을 대화창으로 표시하려면 알림이 항상 문서 UI 모드에서 실행되도록 명시적으로 지정해야 했습니다. Android 11부터는 이 설정을 더 이상 명시적으로 지정할 필요가 없습니다. 알림이 대화창으로 표시되면 플랫폼은 자동으로 알림이 항상 문서 UI 모드에서 실행되도록 설정합니다.

대화창 성능에 다수의 개선사항이 있으며 사용자는 더 융통성 있게 각 앱에서 대화창을 사용 설정하거나 사용 중지할 수 있습니다. 실험용 지원을 구현한 개발자는 다음과 같은 Android 11의 API 변경사항을 확인하시기 바랍니다.

5G 시각적 표시기

사용자의 기기에 5G 표시기를 표시하는 방법에 관한 자세한 내용은 5G 이용 가능 시 사용자에게 알리기를 참조하세요.

개인정보 보호

Android 11에서는 사용자 개인정보 보호를 강화하기 위해 많은 변경사항과 제한사항이 도입되었습니다. 자세한 내용은 개인정보 보호 페이지를 참조하세요.

보안

생체 인식 인증 업데이트

Android 11에서는 앱 데이터의 보안 수준을 제어할 수 있도록 생체 인식 인증을 몇 가지 개선했습니다. 이러한 변경사항은 Jetpack 생체 인식 라이브러리에도 나타납니다.

인증 유형

Android 11에서는 앱에서 지원하는 인증 유형을 선언하는 데 사용할 수 있는 BiometricManager.Authenticators 인터페이스가 도입되었습니다.

사용된 인증 유형 확인

사용자가 인증한 이후에는 getAuthenticationType()을 호출함으로써 기기 사용자 인증 정보와 생체 인식 사용자 인증 정보 중 어떤 정보가 사용되었는지 확인할 수 있습니다.

사용당 인증 키의 추가 지원

Android 11은 사용당 인증 키를 사용한 인증의 추가 지원을 제공합니다.

지원 중단된 메서드

Android 11에서는 다음 메서드의 지원이 중단됩니다.

  • setDeviceCredentialAllowed() 메서드
  • setUserAuthenticationValidityDurationSeconds() 메서드
  • 인수를 사용하지 않는 오버로드된 버전의 canAuthenticate()

대규모 데이터세트의 안전한 공유

일부 상황(예: 머신러닝 또는 미디어 재생과 관련된 상황)에서 개발자의 앱이 다른 앱과 동일한 대규모 데이터 세트를 사용하려고 할 수 있습니다. 이전 버전의 Android에서는 개발자의 앱과 다른 앱이 각각 동일한 데이터 세트의 별도 사본을 다운로드해야 합니다.

네트워크의 데이터와 디스크에 있는 데이터 모두에서 데이터 중복을 줄일 수 있도록 Android 11에서는 공유 데이터 BLOB을 사용하여 이러한 대규모 데이터 세트를 기기에 캐시할 수 있습니다. 데이터 세트 공유에 관해 자세히 알아보려면 대규모 데이터 세트 공유에 관한 심층 가이드를 참조하세요.

사용자 인증 정보 없이 OTA 재시작 후 파일 기반 암호화 실행

기기가 OTA 업데이트를 완료하고 다시 시작한 후 사용자 인증 정보로 보호된 저장소에 있는 사용자 인증 정보 암호화(CE) 키는 파일 기반 암호화(FBE) 작업에 즉시 사용할 수 있습니다. 즉, OTA 업데이트 이후 사용자가 PIN, 패턴 또는 비밀번호를 입력하기 전에 CE 키가 필요한 작업을 앱에서 재개할 수 있습니다.

성능 및 품질

무선 디버깅

Android 11에서는 Android 디버그 브리지(adb)를 통해 워크스테이션에서 앱의 무선 배포 및 디버깅을 지원합니다. 예를 들어 USB를 통해 기기를 물리적으로 연결하거나 드라이버 설치와 같은 일반적인 USB 연결 문제와 씨름하지 않고도 디버깅 가능한 앱을 여러 원격 기기에 배포할 수 있습니다. 자세한 내용은 하드웨어 기기에서 앱 실행을 참고하세요.

ADB 증분 APK 설치

앱에 약간의 변경사항이 있더라도 기기에 대용량(2GB 이상) APK를 설치하는 것은 시간이 오래 걸릴 수 있습니다. ADB(Android 디버그 브리지) 증분 APK 설치는 백그라운드에서 나머지 데이터를 스트리밍하는 동안 앱을 실행하기에 충분한 APK를 설치하여 이 프로세스를 가속화합니다. adb install은 기기에서 지원하고 최신 SDK 플랫폼 도구가 설치되어 있으면 이 기능을 자동으로 사용합니다. 지원되지 않으면 기본 설치 메서드를 자동으로 사용합니다.

다음 adb 명령어를 사용하여 이 기능을 사용하세요. 기기가 증분 설치를 지원하지 않으면 명령이 실패하고 자세한 설명이 출력됩니다.

adb install --incremental

ADB 증분 APK 설치를 실행하기 전에 APK에 서명하고 APK 서명 체계 v4 파일을 만들어야 합니다. 이 기능이 작동하려면 v4 서명 파일이 APK 옆에 있어야 합니다.

네이티브 메모리 할당자를 사용한 오류 감지

GWP-ASan은 해지 후 사용 및 힙 버퍼 오버플로우 버그를 찾는 데 도움이 되는 네이티브 메모리 할당자 기능입니다. 이 기능은 전역으로 또는 앱의 특정 하위 프로세스에 사용 설정할 수 있습니다. 자세한 내용은 GWP-Asan 가이드를 참조하세요.

Neural Networks API 1.3

Android 11은 Neural Networks API(NNAPI)를 확장하고 개선합니다.

새로운 연산

NNAPI 1.3에서는 TensorFlow Lite의 새로운 양자화 체계를 지원하는 새로운 피연산자 유형인 TENSOR_QUANT8_ASYMM_SIGNED가 도입되었습니다.

또한 NNAPI 1.3에는 다음과 같은 새로운 연산이 도입되었습니다.

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

새로운 ML 컨트롤

NNAPI 1.3은 머신러닝의 원활한 실행을 돕는 새로운 컨트롤을 도입합니다.

NDK Thermal API

기기가 너무 뜨거워지면 CPU 또는 GPU가 제한될 수 있으며 이로 인해 예상치 못한 방식으로 앱에 영향을 줄 수 있습니다. 복잡한 그래픽, 과도한 계산 또는 지속적인 네트워크 활동이 포함된 앱이나 게임에서 문제가 발생할 가능성이 높습니다.

Android 11에서 NDK Thermal API를 사용하여 기기의 온도 변경사항을 모니터링하고 낮은 전력 사용과 낮은 기기 온도를 유지하기 위해 조치를 취합니다. 이 API는 Java Thermal API와 비슷합니다. 열 상태 변경사항에 관한 알림을 받거나 현재 상태를 직접 확인하는 데 사용할 수 있습니다.

텍스트 및 입력

개선된 IME 전환

Android 11에서는 터치 키보드와 같은 입력 방식 편집기(IME)의 전환을 개선하는 새로운 API가 도입되었습니다. 이러한 API를 사용하면 IME의 표시와 사라짐, 상태 및 탐색 메뉴 같은 기타 요소와 동기화하여 앱 콘텐츠를 쉽게 조정할 수 있습니다.

EditText에 포커스가 있는 동안 IME를 표시하려면 view.getInsetsController().show(Type.ime())를 호출하세요. 포커스가 있는 EditText와 동일한 계층 구조의 모든 뷰에서 이 메서드를 호출할 수 있습니다. 특별히 EditText에서 호출할 필요는 없습니다. IME를 숨기려면 view.getInsetsController().hide(Type.ime())를 호출합니다. view.getRootWindowInsets().isVisible(Type.ime())을 호출하여 IME가 현재 표시되는지 확인할 수 있습니다.

앱의 뷰를 IME의 표시 및 사라짐과 동기화하려면 WindowInsetsAnimation.CallbackView.setWindowInsetsAnimationCallback()에 제공하여 뷰에서 리스너를 설정합니다. 모든 뷰에서 이 리스너를 설정할 수 있습니다. EditText일 필요는 없습니다. IME에서 리스너의 onPrepare() 메서드를 호출하고 전환을 시작할 때 onStart()를 호출합니다. 그런 다음 전환의 각 진행 단계에서 onProgress()를 호출합니다. 전환이 완료되면 IME는 onEnd()를 호출합니다. 전환 과정에서 언제든지 WindowInsetsAnimation.getFraction()을 호출하여 전환이 얼마나 진행됐는지 확인할 수 있습니다.

이러한 API를 사용하는 방법에 관한 예는 새로운 WindowInsetsAnimation 코드 샘플을 참조하세요.

IME 애니메이션 제어

IME 애니메이션 또는 탐색 메뉴와 같은 다른 시스템 표시줄의 애니메이션을 제어할 수도 있습니다. 제어하려면 먼저 setOnApplyWindowInsetsListener()를 호출하여 창 인셋 변경사항의 새 리스너를 설정합니다.

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

자바

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

IME 또는 다른 시스템 표시줄을 이동하려면 컨트롤러의 controlWindowInsetsAnimation() 메서드를 호출합니다.

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

자바

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

ICU 라이브러리로 업데이트

Android 11은 66 버전의 ICU 라이브러리를 사용하도록 android.icu 패키지를 업데이트합니다(Android 10에서는 63 버전 사용). 새 라이브러리 버전에는 업데이트된 CLDR 언어 데이터가 포함되었으며 Android의 국제화 지원이 다양하게 향상되었습니다.

새 라이브러리 버전의 주요 변경사항은 다음과 같습니다.

  • 다수의 형식 지정 API가 이제 FormattedValue를 확장하는 새로운 반환 객체 유형을 지원합니다.
  • LocaleMatcher API는 빌더 클래스, java.util.Locale 유형 지원, 일치에 관한 추가 데이터를 포함하는 결과 클래스로 개선되었습니다.
  • 이제 유니코드 13이 지원됩니다.

미디어

MediaCodec 버퍼 할당

Android 11에는 앱에서 입력 및 출력 버퍼를 할당할 때 더 잘 제어할 수 있는 새로운 MediaCodec API가 포함되어 있습니다. 이 API로 앱에서 메모리를 더 효율적으로 관리할 수 있습니다.

새로운 클래스:
새로운 메서드:

또한 MediaCodec.Callback()에 있는 두 메서드의 동작이 변경되었습니다.

onInputBufferAvailable()
Block Model API를 사용하도록 구성된 경우 색인이 있는 MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer()를 호출하는 대신 앱은 색인이 있는 MediaCodec.getQueueRequest를 사용하여 LinearBlock/HardwareBuffer를 슬롯에 연결해야 합니다.
onOutputBufferAvailable()
색인이 있는 MediaCodec.getOutputBuffer()를 호출하는 대신 앱은 색인이 있는 MediaCodec.getOutputFrame()을 사용하여 더 많은 정보와 LinearBlock/HardwareBuffer 버퍼가 있는 OutputFrame 객체를 가져올 수도 있습니다.

MediaCodec의 짧은 지연 시간 디코딩

Android 11은 MediaCodec을 향상하여 게임 및 다른 실시간 앱의 짧은 지연 시간 디코딩을 지원합니다. FEATURE_LowLatencyMediaCodecInfo.CodecCapabilities.isFeatureSupported()에 전달하면 코덱이 짧은 지연 시간 디코딩을 지원하는지 확인할 수 있습니다.

짧은 지연 시간 디코딩을 사용 설정하거나 사용 중지하려면 다음 중 하나를 실행합니다.

새 AAudio 함수 AAudioStream_release()

AAudioStream_close() 함수는 오디오 스트림을 해제하는 동시에 닫습니다. 이는 위험할 수 있습니다. 스트림이 닫힌 이후에 다른 프로세스가 이 스트림에 액세스하려고 하면 프로세스가 비정상 종료됩니다.

새로운 AAudioStream_release() 함수는 스트림을 해제하지만 닫지는 않습니다. 리소스를 해제하고 스트림을 알려진 상태로 둡니다. 따라서 AAudioStream_close()가 호출될 때까지 객체가 지속됩니다.

MediaParser API

MediaParser는 미디어 추출을 위한 새로운 하위 수준 API입니다. MediaExtractor보다 유연하고 미디어 추출 기능을 추가로 제어할 수 있습니다.

USB 기기에서 오디오 캡처

RECORD_AUDIO 권한이 없는 애플리케이션이 UsbManager를 사용하여 오디오 캡처 기능이 있는 USB 오디오 기기(예: USB 헤드셋)에 직접 액세스를 요청하면 사용자에게 기기 사용 권한을 확인하는 새 경고 메시지가 표시됩니다. 시스템은 '항상 사용' 옵션을 무시하므로 사용자는 앱이 액세스를 요청할 때마다 경고를 확인하고 권한을 부여해야 합니다.

이러한 동작을 피하려면 앱에서 RECORD_AUDIO 권한을 요청해야 합니다.

마이크 동시 액세스

Android 11에서는 AudioRecord, MediaRecorderAAudioStream API에 새 메서드를 추가했습니다. 이러한 메서드는 선택된 사용 사례와 상관없이 동시에 캡처하는 기능을 사용 설정 또는 사용 중지합니다. 오디오 입력 공유를 참조하세요.

출력 전환기

Android 11은 Cast 및 Mediarouter API를 사용하는 앱에 새 동작을 구현합니다.

앱 내에서 전송 옵션에 액세스하는 것 외에도 전환 옵션은 시스템 미디어 플레이어에도 표시됩니다. 이를 통해 사용자는 부엌에서 또는 휴대전화로 동영상을 시청하거나 집 또는 자동차에서 오디오를 듣는 등 시청 및 청취 환경을 변경하면서 기기 사이를 이동할 때 매끄럽게 이동할 수 있습니다. 출력 전환기를 참조하세요.

연결

Wi-Fi Passpoint 개선사항

Android 11에 추가된 Passpoint 기능에 관한 자세한 내용은 Passpoint를 참고하세요.

Wi-Fi Suggestion API 확장됨

Android 11은 Wi-Fi Suggestion API를 확장하여 다음을 포함한 앱의 네트워크 관리 기능을 개선합니다.

  • 연결 관리 앱은 연결 해제 요청을 허용하여 자체 네트워크를 관리할 수 있습니다.
  • Passpoint 네트워크는 Suggestion API에 통합되어 있으며 사용자에게 추천할 수 있습니다.
  • Analytics API를 사용하면 네트워크 품질에 관한 정보를 얻을 수 있습니다.

CallScreeningService 업데이트

Android 11부터 CallScreeningService는 수신 전화의 STIR/SHAKEN 인증 상태(verstat)와 관련된 정보를 요청할 수 있습니다. 이 정보는 수신 전화에 관한 통화 세부정보의 일부로 제공됩니다.

CallScreeningServiceREAD_CONTACTS 권한이 있는 경우 사용자의 연락처에 있는 번호에서 수신되는 전화가 있거나 이 번호로 발신되는 전화가 있을 때 앱에 알림이 전송됩니다.

자세한 내용은 발신번호 표시 스푸핑 방지를 참고하세요.

Open Mobile API 업데이트

Android 11 이상에서 OMAPI 지원에 관한 자세한 내용은 Open Mobile API 리더 지원을 참고하세요.

성능 기준에 맞는 VPN

API 수준 30 이상을 타겟팅하거나 API 수준 29 이상으로 출시된 기기에서 실행되는 앱은 사용자 구성 및 앱 기반 VPN의 경우 모두 IKEv2/IPsec을 VPN에 적용할 수 있습니다.

VPN이 운영체제에서 기본적으로 실행되므로 앱에서 IKEv2/IPsec VPN 연결을 설정하는 데 필요한 코드가 간단해집니다.

프로세스별 네트워크 액세스 제어

프로세스별로 네트워크 액세스를 사용 설정하는 방법에 관한 자세한 내용은 네트워크 사용 관리를 참조하세요.

동일한 FQDN으로 설치된 여러 Passpoint 구성 허용

Android 11부터 PasspointConfiguration.getUniqueId()를 사용하여 PasspointConfiguration 객체의 고유 식별자를 가져올 수 있습니다. 이를 통해 앱 사용자는 동일한 정규화된 도메인 이름(FQDN)으로 여러 프로필을 설치할 수 있습니다.

이 기능은 이동통신사가 네트워크에 MCC(모바일 국가 코드)와 MNC(모바일 네트워크 코드)를 둘 이상의 조합으로 배포하지만 단일 FQDN만 있을 때 유용합니다. Android 11 이상에서는 사용자가 MCC 또는 MNC와 함께 SIM을 설치할 때 홈 제공자와 네트워크가 일치하는 동일한 FQDN을 사용하여 둘 이상의 프로필을 설치할 수 있습니다.

GNSS 안테나 지원

Android 11에는 GnssAntennaInfo 클래스가 도입되었습니다. 이를 통해 앱에서 GNSS(글로벌항법위성시스템)가 제공할 수 있는 센티미터 정확도의 위치 지정을 더 효과적으로 사용할 수 있습니다.

자세한 내용은 안테나 보정 정보 가이드를 참조하세요.

그래픽

NDK 이미지 디코더

NDK ImageDecoder API는 Android C/C++ 앱이 이미지를 직접 디코딩하도록 표준 API를 제공합니다. 앱 개발자는 더 이상 프레임워크 API를 사용(JNI를 통해)하거나 타사 이미지 디코딩 라이브러리를 번들로 묶을 필요가 없습니다. 자세한 내용은 이미지 디코더 개발자 가이드를 참조하세요.

프레임 속도 API

Android 11에서는 앱이 의도된 프레임 속도를 시스템에 알릴 수 있는 API를 제공하여 여러 새로고침 빈도를 지원하는 기기에서 떨림 현상을 줄입니다. 이 API를 사용하는 방법에 관한 자세한 내용은 프레임 속도 가이드를 참조하세요.

짧은 지연 시간 지원 요청 및 확인

일부 외부 디스플레이 및 TV와 같은 특정 디스플레이는 그래픽 후처리를 할 수 있습니다. 이러한 후처리는 그래픽을 개선하지만 지연 시간을 늘릴 수 있습니다. HDMI 2.1을 지원하는 최신 디스플레이는 자동 짧은 지연 시간 모드(ALLM. 게임 모드라고도 함)가 있어 후처리를 사용 중지함으로써 지연 시간을 최소화합니다. ALLM에 관한 자세한 내용은 HDMI 2.1 사양을 참조하세요.

자동 짧은 지연 시간 모드를 사용할 수 있는 경우 창에서 이 모드를 사용하도록 요청할 수 있습니다. ALLM은 게임이나 화상 회의와 같이 최고의 그래픽보다 짧은 지연 시간이 더 중요한 애플리케이션에 특히 유용합니다.

최소 후처리를 사용 설정 또는 사용 중지하려면 Window.setPreferMinimalPostProcessing()을 호출하거나 창의 preferMinimalPostProcessing 속성을 true로 설정하세요. 일부 디스플레이만 최소 후처리를 지원합니다. 특정 디스플레이의 지원 여부를 알아보려면 새 메서드인 Display.isMinimalPostProcessingSupported()를 호출하세요.

높은 성능의 그래픽 디버그 레이어 삽입

이제 애플리케이션은 네이티브 애플리케이션 코드에 외부 그래픽 레이어(GLES, Vulkan)를 로드할 수 있으며 이를 통해 성능 오버헤드를 일으키지 않고 디버그 가능한 앱과 동일한 기능을 노출할 수 있습니다. 이 기능은 특히 GAPID 같은 도구로 애플리케이션을 프로파일링할 때 중요합니다. 앱을 프로파일링하려면 앱을 디버그 가능하게 만드는 대신 앱 매니페스트 파일에 다음 메타데이터 요소를 포함하세요.

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

이미지 및 카메라

활성 캡처 중의 알림 소리 및 진동 음소거

Android 11부터 setCameraAudioRestriction()을 사용하면 카메라를 적극적으로 사용할 때 앱이 진동만 음소거하거나 소리와 진동을 모두 음소거하거나 둘 중 어느 것도 음소거하지 않을 수 있습니다.

Android Emulator의 카메라 지원 확장

Android 11부터 도입된 에뮬레이터의 카메라 지원 확장에 관한 자세한 내용은 카메라 지원을 참조하세요.

두 대 이상의 카메라를 동시에 사용할 수 있도록 지원

Android 11은 전면 카메라와 후면 카메라를 모두 포함하여 한 번에 두 대 이상의 카메라를 사용할 수 있도록 쿼리 지원에 API를 추가합니다.

앱이 실행되는 기기에서 지원을 확인하려면 다음 메서드를 사용합니다.

  • getConcurrentCameraIds()는 동일한 애플리케이션 프로세스에 의해 구성될 때 보장된 스트림 조합과 동시에 스트리밍할 수 있는 카메라 ID의 조합 Set를 반환합니다.
  • isConcurrentSessionConfigurationSupported()는 카메라 기기에서 상응하는 세션 구성을 동시에 지원할 수 있는지 쿼리합니다.

여러 프레임이 있는 HEIF 이미지 지원 향상

Android 11부터 ImageDecoder.decodeDrawable()을 호출하고 애니메이션 또는 버스트 사진과 같은 프레임 시퀀스가 포함된 HEIF 이미지를 전달하면 메서드는 이미지 시퀀스 전체가 포함된 AnimatedImageDrawable을 반환합니다. 이전 버전의 Android에서는 메서드가 단일 프레임의 BitmapDrawable을 반환했습니다.

HEIF 그래픽에 시퀀스가 아닌 여러 프레임이 포함되었다면 MediaMetadataRetriever.getImageAtIndex()를 호출하여 개별 프레임을 가져올 수 있습니다.

접근성

접근성 서비스 개발자를 위한 업데이트

맞춤 접근성 서비스를 생성하면 Android 11에서 다음 기능을 사용할 수 있습니다.

  • 접근성 서비스에 관한 사용자 설명에서는 이제 일반 텍스트 외에도 HTML 및 이미지를 사용할 수 있습니다. 이러한 유연성 덕분에 최종 사용자에게 서비스의 기능 및 서비스가 어떻게 도움이 될 수 있는지 쉽게 설명할 수 있습니다.
  • contentDescription보다 의미론적으로 중요한 UI 요소의 상태 설명과 관련된 작업을 하려면 getStateDescription() 메서드를 호출합니다.
  • 터치 이벤트가 시스템의 터치 탐색기를 우회하도록 요청하려면 setTouchExplorationPassthroughRegion()을 호출합니다. 마찬가지로 동작이 시스템의 동작 감지기를 우회하도록 요청하려면 setGestureDetectionPassthroughRegion()을 호출합니다.
  • FLAG_SECURE 플래그를 사용 설정하지 않은 창의 스크린샷뿐만 아니라 'enter' 및 'next'와 같은 IME 작업을 요청할 수 있습니다.

추가 기능

앱 프로세스 종료 이유

Android 11에는 최근 프로세스 종료 이유를 보고하는 ActivityManager.getHistoricalProcessExitReasons() 메서드가 도입되었습니다. 앱은 이 메서드를 사용하여 프로세스 종료 이유가 ANR 문제인지, 메모리 문제인지 또는 다른 문제로 인한 것인지와 같은 비정상 종료 진단 정보를 수집할 수 있습니다. 또한 새로운 setProcessStateSummary() 메서드를 사용하여 향후 분석을 위한 맞춤 상태 정보를 저장할 수 있습니다.

getHistoricalProcessExitReasons() 메서드는 앱 프로세스의 종료와 관련된 정보가 포함된 ApplicationExitInfo 클래스의 인스턴스를 반환합니다. 이 클래스의 인스턴스에서 getReason()을 호출하여 앱 프로세스가 종료된 이유를 확인할 수 있습니다. 예를 들어 REASON_CRASH의 반환 값은 처리되지 않은 예외가 앱에서 발생했음을 나타냅니다. 앱에서 이탈 이벤트의 고유성을 보장해야 한다면 getTimestamp() 메서드의 타임스탬프를 기반으로 해시 값과 같은 앱별 식별자를 유지하면 됩니다.

추가 리소스

자세한 내용은 Medium의 앱의 비공개 상태와 안정성을 높이는 새로운 Android 11 도구에 관한 도움말을 참고하세요.

리소스 로더

Android 11은 앱이 리소스 검색 및 로드 방식을 동적으로 확장할 수 있게 하는 새로운 API를 도입합니다. 새로운 API 클래스 ResourcesLoaderResourcesProvider는 기본적으로 새로운 기능을 제공하는 역할을 합니다. 이러한 클래스는 함께 추가 리소스와 애셋을 제공하거나 기존 리소스와 애셋의 값을 수정하는 기능을 제공합니다.

ResourcesLoader 객체는 ResourcesProvider 객체를 앱의 Resources 인스턴스에 제공하는 컨테이너입니다. ResourcesProvider 객체는 APK 및 리소스 테이블에서 리소스 데이터를 로드하는 메서드를 제공합니다.

이 API의 기본 사용 사례는 맞춤 애셋 로드입니다. loadFromDirectory()를 사용하여 파일 기반 리소스 및 애셋의 해상도를 리디렉션하여 애플리케이션 APK가 아니라 특정 디렉터리를 검색하는 ResourcesProvider를 만들 수 있습니다. APK에 번들된 애셋의 경우처럼 AssetManager API 클래스에서 open() 계열의 메서드를 통해 이러한 애셋에 액세스할 수 있습니다.

APK 서명 체계 v4

Android 11에서는 APK 서명 체계 v4 지원을 추가했습니다. 이 체계는 별도의 파일(apk-name.apk.idsig)에 새로운 종류의 서명을 생성하지만 그 외에는 v2 및 v3와 유사합니다. APK는 변경되지 않습니다. 이 체계는 ADB 증분 APK 설치를 지원하여 APK 설치를 가속화합니다.

동적 인텐트 필터

앱이 인텐트를 수신하려면 앱 매니페스트에서 인텐트 필터를 정의하여 어떤 유형의 데이터를 수신할 수 있는지 컴파일 시간에 선언해야 합니다. Android 10 이하에서는 앱이 런타임 시 인텐트 필터를 변경할 수 없습니다. 이는 가상화 앱(예: 가상 머신 및 원격 데스크톱)에서 문제가 됩니다. 가상화 앱이 사용자가 어떤 소프트웨어를 설치할 것인지 정확히 알 수 없기 때문입니다.

Android 11에는 새로운 매니페스트 요소인 MIME 그룹이 도입되었습니다. 이 요소를 통해 앱이 인텐트 필터에서 동적 MIME 유형 세트를 선언하여 런타임 시 프로그래매틱 방식으로 수정할 수 있습니다. MIME 그룹을 사용하려면 다음과 같이 새로운 android:mimeGroup 속성을 사용하여 앱 매니페스트에 데이터 요소를 포함합니다.

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

android:mimeGroup 속성의 값은 런타임 시 MIME 그룹을 식별하는 임의의 문자열 ID입니다. PackageManager API 클래스의 다음과 같은 새 메서드에 ID를 전달하여 MIME 그룹의 콘텐츠에 액세스하고 콘텐츠를 업데이트할 수 있습니다.

프로그래매틱 방식으로 MIME 그룹에 MIME 유형을 추가하면 매니페스트에 명시적으로 선언된 정적 MIME 유형과 정확히 동일하게 작동합니다.

자동 완성 개선사항

Android 11에서는 자동 완성 서비스가 개선되었습니다.

AssistStructure.ViewNode의 힌트 식별자

자동 완성 서비스에서 뷰의 속성에 기반하여 뷰의 서명 해시를 계산하는 것이 유용할 때가 많습니다. 뷰 힌트는 서명 해시를 계산할 때 포함하기에 특히 좋은 속성이지만 힌트 문자열은 휴대전화의 언어에 따라 변경될 수 있습니다. 이 문제를 해결하기 위해 Android 11은 AssistStructure.ViewNode를 새로운 getHintIdEntry() 메서드로 확장하여 뷰의 힌트 텍스트의 리소스 식별자를 반환합니다. 이 메서드는 서명 해시 계산에 사용할 수 있는 언어 독립적인 값을 제공합니다.

이벤트가 표시된 데이터 세트

자동 완성 서비스의 추천 기능을 개선하기 위해 Android 11에서는 자동 완성 서비스에서 데이터세트를 제공했지만 사용자가 어느 것도 선택하지 않은 경우를 식별하는 방법을 제공합니다. Android 11에서는 FillEventHistory가 새로운 TYPE_DATASETS_SHOWN 이벤트 유형을 보고합니다. FillEventHistory는 자동 완성 서비스에서 사용자에게 하나 이상의 데이터세트를 제공할 때마다 이 유형의 이벤트를 기록합니다. 자동 완성 서비스는 이러한 이벤트를 기존 TYPE_DATASET_SELECTED 이벤트와 함께 사용하여 사용자가 제공된 자동 완성 옵션을 선택했는지 확인할 수 있습니다.

IME 통합

이제 키보드 및 기타 IME가 자동 완성 추천을 드롭다운 메뉴 대신 인라인, 추천란 또는 유사한 인터페이스에 표시할 수 있습니다. 비밀번호 및 신용카드 번호와 같은 민감한 정보를 보호하기 위해 추천이 사용자에게 표시되지만 추천은 사용자가 선택할 때까지 IME에 알려지지 않습니다. IME 및 비밀번호 관리자가 이 기능을 지원하는 방법에 관한 자세한 내용은 키보드와 자동 완성 통합을 참조하세요.

콘텐츠 캡처 서비스와 데이터 공유

Android 11부터 앱에서는 기기의 콘텐츠 캡처 서비스와 데이터를 공유할 수 있습니다. 이 기능을 사용하면 사용자 환경에서 현재 재생 중인 노래 제목을 표시하는 것과 같이 상황에 맞는 정보를 기기에서 더 쉽게 제공할 수 있습니다.

앱의 데이터를 콘텐츠 캡처 서비스에서 사용할 수 있으려면 ContentCaptureManager 인스턴스에서 shareData() 메서드를 호출하세요. 시스템에서 데이터 공유 요청을 수락하면 앱에서는 쓰기 전용 파일 설명자를 수신하여 콘텐츠 캡처 서비스와 공유합니다.