기능 및 API 개요

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

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

새로운 환경

위젯 개선사항

Android 12에서는 기존 Widgets API를 개선하여 플랫폼과 런처에서 사용자 환경과 개발자 환경을 개선합니다. Google에서 만든 가이드를 통해 위젯을 Android 12와 호환되도록 설정하고 새로운 기능으로 새로고침할 수 있습니다.

자세한 내용은 Android 12 위젯 개선사항을 참고하세요.

오디오 결합 햅틱 효과

Android 12 앱은 휴대전화의 진동기를 사용하여 오디오 세션에서 파생된 햅틱 반응을 생성할 수 있습니다. 이를 통해 몰입형 게임 및 오디오 환경을 더 많이 제공할 수 있습니다. 예를 들어 햅틱 강화 벨소리로 발신자를 식별할 수 있고 운전 게임은 거친 지형의 느낌을 시뮬레이션할 수도 있습니다.

자세한 내용은 HapticGenerator 참조 문서를 확인하세요.

스플래시 화면 API

Android 12에서는 모든 앱을 위한 새 앱 실행 애니메이션을 도입하며 여기에는 실행 시점의 앱 내 모션, 앱 아이콘을 보여주는 스플래시 화면, 앱 자체로의 전환이 포함됩니다. 자세한 내용은 스플래시 화면 API를 참고하세요.

수신 전화의 중요도 순위 지정을 허용하는 새로운 전화 통화 알림

Android 12에서는 전화 통화의 새 알림 스타일 Notification.CallStyle을 추가합니다. 이 템플릿을 사용하면 앱이 상태 표시줄에 통화 시간을 보여주는 눈에 잘 띄는 칩을 표시하여 진행 중인 통화의 중요도를 나타낼 수 있습니다. 사용자는 이 칩을 탭하여 통화로 돌아갈 수 있습니다.

수신 전화와 진행 중인 통화가 사용자에게 가장 중요하므로 이러한 알림이 알림 창에서 최고 순위로 지정됩니다. 이 순위를 통해 시스템은 우선순위가 지정된 이러한 통화를 잠재적으로 다른 기기로 전달할 수 있습니다.

모든 유형의 통화에 다음 코드를 구현합니다.

Kotlin

// Create a new call with the user as caller.
val incoming_caller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

자바

// Create a new call with the user as caller.
Person incoming_caller = new Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build();

forIncomingCall()을 사용하여 수신 전화의 통화 스타일 알림을 만듭니다.

Kotlin

// Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller)

자바

// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller);

forOngoingCall()을 사용하여 진행 중인 통화의 통화 스타일 알림을 만듭니다.

Kotlin

// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller)

자바

// Create a call style notification for an ongoing call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller);

forScreeningCall()을 사용하여 통화 선택을 위한 통화 스타일 알림을 만듭니다.

Kotlin

// Create a call style notification for screening a call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller)

자바

Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller);

개선된 알림 이미지 지원

Android 12에서는 이제 MessagingStyle()BigPictureStyle() 알림에 애니메이션 이미지를 제공하여 앱의 알림 환경을 개선할 수 있습니다. 이제 사용자가 알림 창의 메시지에 답장할 때 앱에서 이미지 메시지를 보낼 수도 있습니다.

둥근 모서리 API

Android 12에서는 둥근 모서리의 반경과 중심점을 제공하는 RoundedCornerWindowInsets.getRoundedCorner(int position)를 도입합니다. 이러한 API를 통해 앱은 모서리가 둥근 화면에서 UI 요소가 잘리지 않도록 할 수 있습니다.

앱에서 구현될 때 이러한 API는 화면이 둥글지 않은 기기에는 영향을 미치지 않습니다.

반경과 중심점이 있는 둥근 모서리를 보여주는 이미지

이 기능을 구현하려면 애플리케이션 경계를 기준으로 WindowInsets.getRoundedCorner(int position)를 통해 RoundedCorner 정보를 가져옵니다. 앱이 전체 화면을 차지하지 않으면 API는 둥근 모서리의 중심점을 앱의 창 경계에 기반하여 둥근 모서리를 적용합니다.

다음 코드 스니펫은 RoundedCorner의 정보에 따라 뷰의 여백을 설정하여 앱이 UI 잘림을 방지하는 간단한 예를 보여줍니다. 이 경우에는 오른쪽 상단 둥근 모서리입니다.

// Get the top-right rounded corner from WindowInsets.
final WindowInsets insets = getRootWindowInsets();
final RoundedCorner topRight = insets.getRoundedCorner(POSITION_TOP_RIGHT);
if (topRight == null) {
   return;
}

// Get the location of the close button in window coordinates.
int [] location = new int[2];
closeButton.getLocationInWindow(location);
final int buttonRightInWindow = location[0] + closeButton.getWidth();
final int buttonTopInWindow = location[1];

// Find the point on the quarter circle with a 45 degree angle.
final int offset = (int) (topRight.getRadius() * Math.sin(Math.toRadians(45)));
final int topBoundary = topRight.getCenter().y - offset;
final int rightBoundary = topRight.getCenter().x + offset;

// Check whether the close button exceeds the boundary.
if (buttonRightInWindow < rightBoundary && buttonTopInWindow > topBoundary) {
   return;
}

// Set the margin to avoid truncating.
int [] parentLocation = new int[2];
getLocationInWindow(parentLocation);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) closeButton.getLayoutParams();
lp.rightMargin = Math.max(buttonRightInWindow - rightBoundary, 0);
lp.topMargin = Math.max(topBoundary - buttonTopInWindow, 0);
closeButton.setLayoutParams(lp);

PIP 모드 개선사항

Android 12에서는 PIP 모드의 새로운 기능을 도입합니다. 자세한 내용은 PIP 모드 개선사항을 참고하세요.

동작 탐색을 위한 몰입형 모드 개선사항

Android 12에서는 몰입형 모드를 간소화하여 동작 탐색이 더 쉬워지고 동영상 보기 및 책 읽기와 같은 나머지 활동 환경과의 일관성이 높아집니다. 앱은 여전히 전체 화면 게임 환경에서 실수로 인한 동작을 방지하므로 사용자가 게임 중에 실수로 게임을 종료하지 않도록 합니다. 이제 다른 모든 전체 화면 또는 몰입형 환경에서는 사용자가 스와이프 한 번으로 휴대전화를 탐색할 수 있습니다.

이를 위해 비고정 몰입형 환경의 기존 동작(BEHAVIOR_SHOW_BARS_BY_TOUCH, BEHAVIOR_SHOW_BARS_BY_SWIPE)이 Android 12부터 지원 중단됩니다. 시스템 표시줄을 숨길 때 스와이프 한 번으로 동작을 허용하는 기본 동작(BEHAVIOR_DEFAULT)으로 대체되었습니다. 이 플래그는 모드에 따라 다른 시각적 동작과 기능적 동작을 보여 줍니다.

  • 3버튼 모드에서 시각적 및 기능적 동작은 12 이전 Android 버전의 몰입형 모드와 동일합니다.
  • 동작 탐색 모드에서 동작은 다음과 같습니다.
    • 시각적으로 Android 11 이하의 몰입형 모드와 동일합니다.
    • 기능적으로 동작은 표시줄이 숨겨져 있어도 허용됩니다. 시스템 뒤로 기능은 Android 11에 필요했던 스와이프 두 번이 아닌 한 번만 스와이프하여 호출하면 됩니다. 알림바를 아래로 이동하거나 홈으로 이동하기 위해 추가로 스와이프할 필요가 없습니다.

고정 몰입형 모드(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE)는 Android 12에서 변경되지 않았습니다. 이 기능의 다음과 같은 이전 버전과의 호환성에 유의하세요.

리치 콘텐츠 삽입

Android 12에서는 클립보드나 키보드, 드래그 앤 드롭 등 사용 가능한 모든 소스에서 리치 콘텐츠를 수신할 수 있는 새로운 통합 API를 도입합니다.

자세한 내용은 콘텐츠 수신을 위한 통합 API를 참고하세요.

카메라

Quad Bayer 카메라 센서 지원

오늘날 대부분의 Android 기기는 초고해상도 카메라 센서(일반적으로 Quad/Nona Bayer 패턴)와 함께 제공되고 이러한 센서를 통해 이미지 품질과 저조도 성능 측면에서 유연성이 크게 향상됩니다. Android 12에서는 타사 앱이 이러한 다목적 센서를 최대한 활용할 수 있는 새 플랫폼 API를 도입합니다. 새 API는 이러한 센서의 고유한 동작을 지원하고 '기본' 모드와 비교하여 전체 해상도 또는 '최대 해상도' 모드에서 작동할 때 여러 스트림 구성 및 조합을 지원할 수 있음을 고려합니다.

그래픽과 이미지

앱에 Tombstone 트레이스 직접 액세스 권한 제공

Android 12부터는 ApplicationExitInfo.getTraceInputStream() 메서드를 통해 프로토콜 버퍼로 앱의 네이티브 충돌 Tombstone에 액세스할 수 있습니다. 프로토콜 버퍼는 이 스키마를 사용하여 직렬화됩니다. 이전에는 Android 디버그 브리지(adb)를 통해서만 이 정보에 액세스할 수 있었습니다.

다음은 앱에서 이를 구현하는 방법을 보여주는 예입니다.

ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for ( ApplicationExitInfo aei: exitReasons ) {
    if ( aei.getReason() == REASON_CRASH_NATIVE ) {
        // Get the tombstone input stream.
        InputStream tombstoneInputStream = aei.getTraceInputStream();
        // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
        Tombstone tombstone = Tombstone.parseFrom(trace);
    }
}

AVIF 이미지 지원

Android 12는 AV1 이미지 파일 형식(AVIF)을 사용하는 이미지를 지원합니다. AVIF는 AV1을 사용하여 인코딩된 이미지 및 이미지 시퀀스의 컨테이너 형식입니다. 동영상 압축에서 프레임 내 인코딩 콘텐츠를 활용합니다. 이렇게 하면 JPEG와 같은 기존 이미지 형식과 비교할 때 동일한 파일 크기의 이미지 품질이 크게 향상됩니다. 이 형식의 장점에 관한 자세한 내용은 제이크 아치볼드의 블로그 게시물을 참고하세요.

더 간단한 블러, 색상 필터, 기타 효과

Android 12에서는 블러, 색상 필터, Android 셰이더 효과 등 일반적인 그래픽 효과를 View 및 렌더링 계층 구조에 적용하는 새 RenderEffect를 추가합니다. 효과는 체인 효과(내부 및 외부 효과를 구성)나 혼합 효과로 결합할 수 있습니다. 다양한 Android 기기가 제한된 처리 성능으로 인해 이 기능을 지원할 수도 지원하지 못할 수도 있습니다.

View.setRenderEffect(RenderEffect)를 호출하여 View의 기본 RenderNode에 효과를 적용할 수도 있습니다.

RenderEffect를 구현하려면 다음을 실행하세요.

view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))

네이티브 애니메이션 이미지 디코딩

Android 12에서 NDK ImageDecoder API는 애니메이션 GIF 및 애니메이션 WebP 파일 형식을 사용하는 이미지의 모든 프레임과 타이밍 데이터를 디코딩하도록 확장되었습니다. Android 11에서 처음 도입되었을 때 이 API는 이러한 형식의 애니메이션에서 첫 번째 이미지만 디코딩했습니다.

타사 라이브러리 대신 ImageDecoder를 사용하여 APK 크기를 더 줄이고 보안 및 성능 관련 향후 업데이트의 이점을 누리세요.

API에 관한 자세한 내용은 API 참조GitHub의 샘플을 참고하세요.

미디어

호환되는 미디어 트랜스코딩

Android 12에서는 기기에 녹화된 HEVC(H.265)HDR(HDR10 및 HDR10+) 동영상을 표준 플레이어와 널리 호환되는 형식인 AVC(H.264)로 자동 트랜스코딩할 수 있습니다. 이전 애플리케이션과의 호환성을 저하하지 않고 최신 코덱을 사용할 수 있을 때 이를 활용합니다.

자세한 내용은 호환 미디어 트랜스코딩을 참고하세요.

성능 등급

Android 12부터 Android는 성능 등급이라는 표준을 도입합니다. 성능 등급은 Android의 기준 요구사항 이외의 하드웨어 기능을 지정합니다. 각 Android 기기는 지원하는 성능 등급을 선언합니다. 개발자는 런타임에 기기의 성능 등급을 확인하고 기기의 기능을 최대한 활용하는 업그레이드된 환경을 제공할 수 있습니다.

자세한 내용은 성능 등급을 참고하세요.

동영상 인코딩 개선사항

Android 12는 동영상 인코딩의 양자화 매개변수(QP) 값을 제어하는 표준 키 세트를 정의하므로 개발자가 공급업체별 코드를 방지할 수 있습니다.

새 키는 MediaFormat API와 NDK 미디어 라이브러리에서 사용할 수 있습니다.

Android 12부터 동영상 인코더는 최소 품질 기준점을 적용합니다. 따라서 사용자는 장면 복잡성이 높은 동영상을 인코딩할 때 매우 낮은 화질을 경험하지 않습니다.

오디오 포커스

Android 12부터 다른 앱이 포커스를 보유하여 재생되는 동안 앱이 오디오 포커스를 요청하면 프레임워크가 재생 중인 앱을 페이드 아웃합니다.

자세한 내용은 오디오 포커스 개선사항을 참고하세요.

MediaDrm 업데이트

현재 MediaDrm API에 보안 디코더 구성요소가 필요한지 확인하려면 다음 단계를 따라야 합니다.

  1. MediaDrm을 만듭니다.
  2. 세션을 열어 세션 ID를 가져옵니다.
  3. 세션 ID를 사용하여 MediaCrypto를 만듭니다.
  4. MediaCrypto.requiresSecureDecoderComponent(mimeType)를 호출합니다.

새 메서드 requiresSecureDecoder(@NonNull String mime)requiresSecureDecoder(@NonNull String mime, @SecurityLevel int level)를 사용하면 MediaDrm을 만드는 즉시 이를 확인할 수 있습니다.

보안 및 개인 정보 보호

블루투스 권한

Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한을 도입합니다. 이러한 권한을 사용하면 Android 12를 타겟팅하는 앱, 특히 기기 위치 액세스가 필요하지 않은 앱이 블루투스 기기와 더 쉽게 상호작용할 수 있습니다.

자세한 내용은 새 블루투스 권한 가이드를 참고하세요.

개인 정보 대시보드

위치 정보에 액세스한 다양한 앱과 액세스가 발생한 시간을 보여주는 세로 타임라인
그림 1. 개인 정보 대시보드의 일부인 위치 사용 화면

Android 12를 실행하는 지원되는 기기에서는 개인 정보 대시보드 화면이 시스템 설정에 표시됩니다. 이 화면에서 사용자는 앱이 위치나 카메라, 마이크 정보에 액세스할 때 표시되는 별도의 화면에 액세스할 수 있습니다. 각 화면에는 여러 앱이 특정 유형의 데이터에 액세스한 시점의 타임라인이 표시됩니다. 그림 1은 위치 정보 데이터 액세스 타임라인을 보여줍니다.

앱은 사용자에게 앱이 위치나 카메라, 마이크 정보에 액세스하는 이유를 알 수 있도록 근거를 제공할 수 있습니다. 이 근거는 새 개인 정보 대시보드 화면이나 앱의 권한 화면 또는 둘 다에 표시될 수 있습니다.

데이터 액세스 근거 표시

앱이 위치와 카메라, 마이크 정보에 액세스하는 이유를 설명하려면 다음 단계를 완료하세요.

  1. 시작 시 앱이 특정 유형의 데이터 액세스 작업을 실행하는 이유에 관한 근거를 제공하는 활동을 추가합니다.

    앱이 Android 12 이상을 타겟팅하는 경우 명시적으로 android:exported 속성 값을 정의해야 합니다.

  2. 다음 인텐트 필터를 새로 추가된 활동에 추가합니다.

    <!-- android:exported required if you target Android 12. -->
    <activity android:name=".DataAccessRationaleActivity"
              android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
              android:exported="true">
           <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on
                your app permission's page in system settings.
                VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information
                icon on the Privacy Dashboard screen. -->
        <intent-filter
           android:action="android.intent.action.VIEW_PERMISSION_USAGE"
           android:action="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" ... >
        </intent-filter>
    </activity>
    
  3. 데이터 액세스 근거 활동에서 표시할 내용을 결정합니다. 예를 들어 앱의 웹사이트나 고객센터 도움말을 표시할 수 있습니다. 앱이 액세스하는 데이터 유형과 액세스 발생 시점에 관해 좀 더 자세히 설명하려면 시스템에서 권한 사용 인텐트를 호출할 때 포함되는 추가 항목을 처리하세요.

추가하는 인텐트 필터에 따라 사용자에게 특정 화면의 앱 이름 옆에 정보 아이콘이 표시됩니다.

  • VIEW_PERMISSION_USAGE 작업이 포함된 인텐트 필터를 추가하면 시스템 설정의 앱 권한 페이지에 아이콘이 표시됩니다.
  • VIEW_PERMISSION_USAGE_FOR_PERIOD 작업이 포함된 인텐트 필터를 추가하면 앱이 개인 정보 대시보드 화면에 표시될 때마다 앱 이름 옆에 아이콘이 표시됩니다.

사용자가 이 아이콘을 선택하면 앱의 근거 활동이 시작됩니다.

애플리케이션 오버레이 창 숨기기

사용자가 개발자의 앱과 상호작용할 때 사용자에게 표시되는 내용을 개발자가 더 세밀하게 제어할 수 있도록 Android 12에서는 SYSTEM_ALERT_WINDOW 권한이 있는 앱이 그린 오버레이 창을 숨기는 기능을 도입합니다.

HIDE_OVERLAY_WINDOWS 권한을 선언한 후 앱에서는 setHideOverlayWindows()를 호출하여 TYPE_APPLICATION_OVERLAY 유형의 모든 창을 앱의 자체 창이 표시될 때 숨겨야 한다고 나타낼 수 있습니다. 앱은 트랜잭션 확인 흐름과 같은 민감한 화면을 표시할 때 이 작업을 실행할 수 있습니다.

TYPE_APPLICATION_OVERLAY 유형의 창이 표시되는 앱에서는 PIP 모드대화창과 같은 사용 사례에 더 적합할 수 있는 대안을 고려해야 합니다.

알려진 서명자 권한 보호 플래그

Android 12에서는 서명 수준 권한knownCerts 속성을 도입합니다. 이 속성을 사용하여 선언 시 알려진 서명 인증서의 다이제스트를 참조할 수 있습니다.

앱은 이 속성을 선언하고 주어진 서명 수준 권한의 protectionLevel 속성에서 새 knownSigner 플래그를 사용할 수 있습니다. 앱이 이를 실행할 때 시스템은 현재 서명자를 비롯하여 요청 앱의 서명 계보에 있는 서명자가 knownCerts 속성의 권한으로 선언된 다이제스트 중 하나와 일치하면 요청 앱에 권한을 부여합니다.

knownSigner 플래그를 사용하면 기기와 앱이 기기 제조 및 배송 시 앱에 서명하지 않고도 다른 앱에 서명 권한을 부여할 수 있습니다.

기기 속성 증명

Android 12는 기기 속성을 확인할 수 있는 일련의 앱을 확장합니다. 기기 속성은 이러한 앱이 새 키를 생성할 때 증명 인증서에 있습니다.

Android 9(API 수준 28)부터 Keymaster 4.0 이상을 사용하는 기기 정책 소유자(DPO)는 이러한 증명 인증서에 있는 기기 속성을 확인할 수 있습니다. Android 12부터 Android 12를 타겟팅하는 모든 앱은 setDevicePropertiesAttestationIncluded() 메서드를 사용하여 이 확인을 실행할 수 있습니다.

생성된 기기 속성에는 다음과 같은 Build 필드가 포함됩니다.

  • BRAND
  • DEVICE
  • MANUFACTURER
  • MODEL
  • PRODUCT

보안 잠금 화면 알림 작업

Android 12에서는 새 setAuthenticationRequired 플래그를 Notification.Action.Builder에 추가합니다. 이 플래그를 사용하면 잠긴 기기의 알림에 보안 레이어를 추가할 수 있습니다.

이 플래그가 주어진 알림 작업true 값으로 적용되면 잠기 기기에서 이 작업을 호출하는 사용자는 항상 인증 요청을 받습니다. 이전에는 시스템이 사용자의 알림 작업 호출이 활동을 시작했거나 바로 답장인 경우에만 잠긴 기기에서 인증을 요청했습니다.

이 기능을 구현하려면 다음과 같이 setAuthenticationRequired를 알림 작업에 추가합니다.

Notification n1 = new Notification.Builder(context, NotificationListenerVerifierActivity.TAG)
...
.addAction(new Notification.Action.Builder(R.drawable.ic_stat_charlie,
context.getString(R.string.action_test_title), makeBroadcastIntent(context))

// Make sure this notification action will always request authentication when
// invoked from a lock screen
.setAuthenticationRequired(true).build())

.build();

연결성

대역폭 추정 개선사항

Android 12에서는 getLinkDownstreamBandwidthKbps()getLinkUpstreamBandwidthKbps()에서 제공하는 대역폭 추정 기능이 Wi-Fi 및 모바일 데이터 연결에서 모두 개선됩니다. 이제 반환된 값은 기기의 모든 애플리케이션에서 이동통신사 또는 Wi-Fi SSID당 가중치가 적용된 사용자의 전체 기간 평균 처리량과 네트워크 유형, 신호 수준을 나타냅니다. 이렇게 하면 예상 처리량의 더 정확하고 현실적인 추정치를 반환하고 애플리케이션 콜드 스타트에 관한 추정치를 제공할 수 있어 다른 처리량 추정 메서드 사용과 비교할 때 더 적은 주기가 필요합니다.

호환 앱을 켠 상태로 유지

기기 관리를 위해 계속 실행되는 호환 앱의 필요성을 지원하기 위해 Android 12에서는 다음 작업을 실행하는 API를 도입합니다.

  • 부속 기기가 범위 내에 있을 때 앱의 절전 모드를 해제할 수 있습니다.
  • 기기가 범위 내에 있는 동안 프로세스가 계속 실행되도록 보장합니다.

API를 사용하려면 부속 기기 관리도구를 사용하여 기기를 연결해야 합니다. 자세한 내용은 CompanionDeviceManager.startObservingDevicePresence()CompanionDeviceService.onDeviceAppeared()를 참고하세요.

부속 기기 관리도구 프로필

이제 Android 12 이상을 타겟팅하는 파트너 앱은 시계에 연결할 때 부속 기기 프로필을 사용할 수 있습니다. 프로필을 사용하면 기기 유형별 권한 세트 부여를 한 단계로 묶어 등록 프로세스를 간소화할 수 있습니다.

권한 부여에 관한 메시지가 표시된 휴대전화 스크린샷

번들 권한은 기기가 연결되면 호환 앱에 부여되고 기기가 연결된 동안에만 지속됩니다. 앱을 삭제하거나 연결을 제거하면 권한이 삭제됩니다.

자세한 내용은 AssociationRequest.Builder.setDeviceProfile()을 참고하세요.

Wi-Fi Aware(NAN) 개선사항

Android 12에서는 Wi-Fi Aware를 다음과 같이 개선했습니다.

  • Android 12 이상을 실행하는 기기에서는 onServiceLost() 콜백을 사용하여 앱이 서비스의 중지나 범위 이탈로 인해 검색된 서비스를 잃었을 때 알림을 받을 수 있습니다.
  • 여러 데이터 경로(NAN 데이터 경로)를 설정하는 방식은 더 효율적으로 변경됩니다. 이전 버전에서는 L2 메시지를 사용하여 시작자의 피어 정보를 교환했으며 이로 인해 지연 시간이 발생했습니다. Android 12 이상을 실행하는 기기에서는 응답자(서버)가 모든 피어를 수락하도록 구성될 수 있습니다. 즉, 시작자 정보를 미리 알지 않아도 됩니다. 이를 통해 데이터 경로 불러오기 속도가 빨라지고 단 한 번의 네트워크 요청으로 여러 지점 간 링크를 사용 설정할 수 있습니다.
  • 프레임워크가 리소스 부족으로 검색 또는 연결 요청을 거부하지 않도록 하려면 Android 12 이상을 실행하는 기기에서 WifiAwareManager.getAvailableAwareResources()를 호출하면 됩니다. 이 메서드의 반환 값을 통해 사용 가능한 데이터 경로 수, 사용 가능한 게시 세션 수, 사용 가능한 구독 세션 수를 가져올 수 있습니다.

동시 P2P + 인터넷 연결

Android 12 이상을 타겟팅하는 기기가 하드웨어 지원 기기에서 실행되는 경우 P2P 연결을 사용하면 피어 기기에 연결할 때 기존 Wi-Fi 연결이 해제되지 않습니다. 이 기능 지원을 확인하려면 WifiManager.isMultiStaConcurrencySupported()를 사용하세요.

저장용량

Android 12에서는 다음 섹션에서 설명하는 저장용량 관리 API에 몇 가지 변경사항을 도입합니다.

새 음성 녹음 디렉터리

시스템은 새 Environment.DIRECTORY_RECORDINGS 폴더에 저장된 오디오 파일을 녹음으로 인식합니다. 앱이 시스템의 미디어 저장소에서 쿼리를 실행할 때 IS_RECORDING 플래그를 사용하여 녹음을 검색할 수 있습니다.

미디어 관리 액세스

사용자는 미디어 파일을 자주 수정하는 등 미디어 관리를 실행하는 특정 앱을 신뢰할 수 있습니다. 앱이 Android 11(API 수준 30) 이상을 타겟팅하고 기기의 기본 갤러리 앱이 아니라면 앱이 파일을 수정하거나 삭제하려고 할 때마다 사용자에게 확인 대화상자가 표시되어야 합니다.

앱이 Android 12를 타겟팅하면 사용자에게 각 파일 작업에 관한 메시지를 표시하지 않고도 다음 각 작업을 실행하는 권한을 앱에 부여하라고 사용자에게 요청할 수 있습니다.

그러려면 다음 단계를 완료하세요.

  1. MANAGE_MEDIA 권한 및 READ_EXTERNAL_STORAGE 권한을 앱의 매니페스트 파일에서 선언합니다.

    확인 대화상자를 표시하지 않고 createWriteRequest()를 호출하려면 ACCESS_MEDIA_LOCATION 권한도 선언합니다.

  2. 앱에서 사용자에게 UI를 표시하여 미디어 관리 액세스 권한을 앱에 부여하는 것이 좋은 이유를 설명합니다.

  3. ACTION_REQUEST_MANAGE_MEDIA 인텐트 작업을 호출합니다. 그러면 사용자가 시스템 설정의 미디어 관리 앱 화면으로 이동합니다. 여기에서 사용자가 특수 앱 액세스 권한을 부여할 수 있습니다.

앱 저장소 액세스

앱은 시작 시 사용자가 앱이 사용자의 기기에 저장한 데이터를 관리할 수 있는 맞춤 활동을 선언하고 만들 수 있습니다. 앱은 이 맞춤 '공간 관리' 활동을 매니페스트 파일의 android:manageSpaceActivity 속성을 사용하여 선언합니다. 파일 관리자 앱은 앱이 활동을 내보내지 않을 때도 즉, 활동이 android:exportedfalse로 설정하는 때도 이 '공간 관리' 활동을 시작할 수 있습니다.

Android 12에서 MANAGE_EXTERNAL_STORAGE 권한과 QUERY_ALL_PACKAGES 권한이 모두 있는 앱(예: 파일 관리 앱)은 새 getManageSpaceActivityIntent()를 사용하여 사용자를 다른 앱의 맞춤 '공간 관리' 활동(다른 앱에 정의된 경우)으로 보낼 수 있습니다.

getManageSpaceActivityIntent() 메서드는 패키지 이름과 요청 코드를 가져와 다음 중 하나를 반환합니다.

  • PendingIntent: 패키지 이름이 지정된 앱이 맞춤 '공간 관리' 활동을 정의한 경우 반환됩니다. 그러면 getManageSpaceActivityIntent() 메서드를 호출한 앱이 반환된 인텐트를 호출하여 사용자를 맞춤 활동으로 보낼 수 있습니다.
  • null: 패키지 이름이 지정된 앱이 '공간 관리' 활동을 정의하지 않는 경우 반환됩니다.

확장 파일 액세스 지원

이제 getMediaUri() 메서드가 기존 ExternalStorageProvider URI 지원 외에도 MediaDocumentsProvider URI를 지원합니다. 시스템은 이제 이러한 URI를 반환하기 전에 호출자에 부여합니다.

또한 createWriteRequest()에서 부여하는 미디어 URI가 이제 File 클래스의 API를 지원합니다. 이러한 API는 파일을 읽고 쓰고 이름을 바꾸고 삭제하는 기능을 제공합니다.

핵심 기능

자동 앱 업데이트

Android 12에서는 PackageInstaller API를 사용하는 앱을 위한 setRequireUserAction() 메서드를 도입합니다. 이 메서드를 사용하면 설치 프로그램 앱이 사용자에게 작업 확인을 요청하지 않고도 앱 업데이트를 실행할 수 있습니다.

기기 칩셋 정보

Android 12에서는 SDK를 통해 SoC 칩셋 공급업체와 모델 정보를 노출하는 상수 두 개를 android.os.Build에 추가합니다. 이 정보는 Build.SOC_MANUFACTURERBuild.SOC_MODEL을 각각 호출하여 검색할 수 있습니다.