기능 및 API 개요

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

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

새로운 환경

기기 제어

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를 새로운 센서에 제공하여 힌지 각을 확인할 수 있고 기기의 두 필수 부분 사이의 각도를 측정할 수 있습니다. 이러한 원시 측정값을 사용하여 사용자가 기기를 조작할 때 세분화된 애니메이션을 실행할 수 있습니다.

일부 앱(예: 런처 및 배경화면)에서 정확한 힌지 각을 아는 것이 유용할 수 있다고 해도 대부분의 앱에서는 DeviceState.getPosture()를 호출하여 기기 상태를 검색하는 데 Jetpack 창 관리자 라이브러리를 사용해야 합니다.

또는 앱에서 registerDeviceStateChangeCallback()을 호출하여 DeviceState가 변경될 때 알림을 받고 상태가 변경되면 반응할 수 있습니다.

현재 시장에 있는 그리고 향후 나올 많은 다양한 창과 기기 구성으로 인해 기기 상태에 응답하는 것이 더 안전하고 안정적입니다.

대화

대화 개선사항

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

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

채팅 버블

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

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

5G 시각적 표시기

Android 11(API 수준 30) 이상에서 android.Manifest.permission.READ_PHONE_STATE 권한이 있는 앱은 PhoneStateListener.onDisplayInfoChanged()를 통해 텔레포니 디스플레이 정보 업데이트를 요청할 수 있습니다. 여기에는 마케팅 및 브랜딩을 위한 무선 액세스 기술 정보가 포함됩니다.

이 새로운 API는 다양한 이동통신사를 위한 여러 5G 아이콘 디스플레이 솔루션을 제공합니다. 지원되는 기술은 다음과 같습니다.

  • LTE
  • 캐리어 어그리게이션 기술이 적용된 LTE(LTE+)
  • Advanced pro LTE(5Ge)
  • NR(5G)
  • 밀리미터파 셀룰러 대역(5G+)의 NR

개인정보 보호

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

보안

생체 인식 인증 업데이트

Android 11에서는 앱 데이터의 보안 수준을 제어할 수 있도록 생체 인식 인증을 몇 가지 개선했습니다.

인증 유형

Android 11에서는 BiometricManager 클래스가 지원하는 인증 유형을 정의하는 BiometricManager.Authenticators 인터페이스가 도입되었습니다.

BIOMETRIC_STRONG
호환성 정의 페이지에 정의된 강함 강도 수준을 충족하는 하드웨어 요소를 사용하는 인증
BIOMETRIC_WEAK
호환성 정의 페이지에 정의된 약함 강도 수준을 충족하는 하드웨어 요소를 사용하는 인증
DEVICE_CREDENTIAL
화면 잠금 사용자 인증 정보를 사용하는 인증 - 사용자의 PIN, 패턴 또는 비밀번호

앱에서 허용하는 생체 인식 인증 유형을 정의하려면 인증 유형 또는 비트별 유형 조합을 setAllowedAuthenticators() 메서드에 전달합니다. 예를 들어 앱에서 '강한' 하드웨어 요소나 화면 잠금 사용자 인증 정보를 허용하는 경우 BIOMETRIC_STRONG | DEVICE_CREDENTIAL을 전달합니다.

필요한 인증 요소가 사용 가능한지 확인하려면 동일한 비트별 유형 조합을 canAuthenticate() 메서드에 전달합니다. 필요한 경우 ACTION_BIOMETRIC_ENROLL 인텐트 작업을 호출합니다. 추가 인텐트에 앱에서 허용하는 인증자 세트를 제공합니다. 이 인텐트는 사용자에게 앱에서 허용하는 인증자의 사용자 인증 정보를 등록하라는 메시지를 표시합니다.

사용자가 인증한 이후에는 getAuthenticationType()을 호출함으로써 사용자가 기기 사용자 인증 정보를 사용하여 인증했는지 아니면 생체 인식 사용자 인증 정보를 사용하여 인증했는지 확인할 수 있습니다.

사용당 인증 키의 추가 지원

Android 11은 BiometricPrompt 클래스 내에서 사용당 인증 키의 추가 지원을 제공합니다. 이러한 키를 사용하려면 앱이 키로 보호되는 데이터에 액세스해야 할 때마다 사용자가 생체 인식 사용자 인증 정보, 기기 사용자 인증 정보 또는 사용자 인증 정보 중 하나를 제시해야 합니다. 사용당 인증 키는 많은 금액을 결제하거나 개인의 건강 기록을 업데이트하는 등의 중요한 트랜잭션에 유용합니다.

BiometricPrompt 객체를 사용당 인증 키와 연결하려면 다음과 비슷한 코드를 추가합니다.

Kotlin

val authPerOpKeyGenParameterSpec =
        KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // 2nd argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG or
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build()

자바

KeyGenParameterSpec authPerOpKeyGenParameterSpec =
        new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // 2nd argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG |
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build();

지원 중단된 메서드

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

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

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

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

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

성능 및 품질

무선 디버깅

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

무선 디버깅을 사용하려면 페어링 코드를 사용하여 기기와 워크스테이션을 페어링해야 합니다. 워크스테이션과 기기가 동일한 무선 네트워크에 연결되어 있어야 합니다. 기기에 연결하려면 다음 단계를 따르세요.

무선 adb 페어링 대화상자
  1. 워크스테이션에서 최신 버전의 SDK 플랫폼 도구로 업데이트합니다.
  2. 기기에서 개발자 옵션을 사용 설정합니다.
  3. 무선 디버깅 옵션을 사용 설정합니다.
  4. 이 네트워크에서 무선 디버깅을 허용하시겠습니까? 라고 묻는 대화상자에서 허용을 클릭합니다.
  5. 기기와 페어링 코드 페어링을 선택합니다. 기기에 표시된 페어링 코드, IP 주소 및 포트 번호를 기록해 두세요(이미지 참조).
  6. 워크스테이션에서 터미널을 열고 android_sdk/platform-tools로 이동합니다.
  7. adb pair ipaddr:port를 실행합니다. 5단계의 IP 주소와 포트 번호를 사용합니다.
  8. 메시지가 표시되면 5단계에서 받은 페어링 코드를 입력합니다. 기기가 성공적으로 페어링되었다는 메시지가 표시되어야 합니다.

    Enter pairing code: 482924
    Successfully paired to 192.168.1.130:37099 [guid=adb-235XY]
    
  9. (Linux 또는 Microsoft Windows에만 적용) adb connect ipaddr:port를 실행합니다. 무선 디버깅에서 IP 주소와 포트를 사용합니다(아래 이미지 참조).

    무선 adb IP 및 포트 번호

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()에 전달하면 코덱이 짧은 지연 시간 디코딩을 지원하는지 확인할 수 있습니다.

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

OpenSL ES는 지원 중단됨

NDK r21b 베타 2부터 OpenSL ES API는 지원 중단되었습니다. 대신 Oboe를 사용해야 합니다.

플랫폼은 여전히 기존 앱에서 OpenSL ES를 지원합니다. 그러나 minSdkVersion이 30 이상인 OpenSL ES를 사용하면 빌드 경고가 나타납니다.

새 AAudio 함수 AAudioStream_release()

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

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

MediaParser API

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

출력 전환기

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

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

미디어 알림에서 경로 선택 버튼을 누르면 기본적으로 다음 선택사항이 있는 출력 전환기가 표시됩니다.

  • 현재 기기의 스피커
  • 연결된 모든 블루투스 오디오 기기

앱은 기능(예: Cast)에 따라 더 많은 옵션을 제공할 수도 있습니다.

앱은 새 MediaRouter2 API를 사용하여 라우팅 선택을 맞춤설정할 수 있습니다. 지원하지 않는 기기를 제외하거나(Netflix 스마트 TV를 시청한다면 오디오 전용 Chromecast를 필터링) 앱에서 인식하는 다른 특수 기기를 포함할 수 있습니다.

연결

Wi-Fi Passpoint 개선사항

Passpoint를 통해 앱은 자동으로 조용히 인증을 실행하고 안전한 Wi-Fi 핫스팟에 연결할 수 있습니다. API 수준 30 이상을 타겟팅하는 앱은 다음과 같은 Passpoint의 추가 기능을 사용할 수 있습니다.

만료일 적용 및 알림
프로필에 만료일을 적용하면 프레임워크에서 사용자 인증 정보가 만료된 액세스 포인트에 자동 연결되는 것을 방지할 수 있습니다(자동 연결이 실패함). 이렇게 하면 송수신 시간 사용이 방지되고 배터리 및 백엔드 대역폭이 절약됩니다. 사용자 프로필이 범위 내에 있고 만료되면 사용자에게 알림이 표시됩니다.
FQDN 일치
PerProviderSubscription(PPS) 관리 객체(MO)에서 Extension/Android 노드를 사용하여 ANQP(Access Network Query Protocol) 정규화된 도메인 이름(FQDN)과 별도로 명명된 AAA 도메인을 구성하도록 허용합니다.
자체 서명 비공개 CA
Passpoint R1 프로필의 경우 Android는 연결 인증을 위해 자체 서명 비공개 CA를 허용합니다.
FQDN이 동일한 여러 프로필 허용
FQDN이 동일한 여러 Passpoint 프로필을 설치할 수 있습니다. FQDN은 프로필의 키로 사용되지 않습니다. remove와 같은 FQDN이 필요한 기존 Passpoint API는 동일한 FQDN이 있는 모든 일치하는 프로필에 요청을 적용합니다.
루트 CA 인증서가 없는 프로필 설치 허용
루트 CA 인증서가 없는 프로필이 허용됩니다. 이 경우 시스템은 신뢰할 수 있는 저장소에 설치된 공개 루트 CA 인증서와 비교해 AAA 서버 인증서를 확인합니다.
향상된 홈 및 로밍 제공업체 일치
시스템은 광고된 인증 메서드와 관계없이 홈 또는 로밍 네트워크와 일치합니다. 또한 OtherHomePartnersHomeOIList 목록의 홈 일치 지원이 추가되었습니다.

Wi-Fi Suggestion API 확장됨

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

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

CallScreeningService 업데이트

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

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

GNSS 안테나 지원

Android 11에는 GnssAntennaInfo 클래스가 도입되었습니다. 이를 통해 앱에서 GNSS(글로벌항법위성시스템)가 제공할 수 있는 센티미터 정확도의 위치 지정을 더 효과적으로 사용할 수 있습니다. 사용자가 앱에 ACCESS_FINE_LOCATION 권한을 부여하면 앱이 GNSS 안테나와 관련된 다음 세부정보에 액세스할 수 있습니다.

  • 위상 중심 오프셋(PCO) 좌표
  • 위상 중심 변이(PCV) 교정
  • 신호 이득 교정

기기가 앱에 GNSS 안테나 정보를 제공할 수 있는지 확인하려면 hasGnssAntennaInfo()를 호출합니다.

개인정보 보호 고려사항

  • GNSS 안테나는 개별 기기가 아닌 기기 모델만 식별할 수 있습니다.
  • GnssAntennaInfo 클래스를 사용하려면 ACCESS_FINE_LOCATION 권한이 필요합니다.

그래픽

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>

OpenGL ES용 ANGLE

ANGLE을 사용하는 비핵심 앱을 실행하여 성능을 평가하고 특정 앱이 네이티브 OpenGL ES 드라이버 대신 ANGLE을 사용해야 하는지 판단할 수 있습니다. 자세한 내용은 OpenGL ES용 ANGLE 사용을 참조하세요.

이미지 및 카메라

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

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

Android Emulator의 카메라 지원 확장

Android 11은 향상된 Android Emulator 카메라 기능을 도입합니다. 추가된 기능에는 다음이 포함됩니다.

  • RAW 캡처
  • YUV 재처리
  • 레벨 3 기기
  • 논리 카메라 지원
  • 센서 관리자의 데이터를 사용하여 센서 방향 에뮬레이션
  • 핸드셰이크 실행 빈도를 줄여 동영상 안정화 적용
  • 일반적으로 YUV 파이프라인에서 실행되는 확대를 제거하여 에지 개선 적용
  • 동시 카메라

여러 프레임이 있는 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 작업을 요청할 수 있습니다.

추가 기능

앱 프로세스 종료 이유

Google은 항상 소중한 의견에 귀 기울이고 있습니다. 이 간단한 설문조사를 통해 기능 사용 방식을 알려주세요. 특히 이 기능의 영향을 받은 사용 사례에 관해 알려주세요.

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

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

리소스 로더

Google은 항상 소중한 의견에 귀 기울이고 있습니다. 이 간단한 설문조사를 통해 기능 사용 방식을 알려주세요. 특히 이 기능의 영향을 받은 사용 사례에 관해 알려주세요.

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 이벤트와 함께 사용하여 사용자가 제공된 자동 완성 옵션을 선택했는지 확인할 수 있습니다.

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

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

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