SDK 확장 프로그램

SDK 확장 프로그램 모듈은 기기의 확장 SDK 수준을 결정하고 앱이 확장 SDK 수준을 쿼리할 수 있는 API를 제공합니다. 이 모듈은 업데이트할 수 있습니다. 즉, 일반적인 Android 출시 주기 외에도 기능 업데이트를 받을 수 있습니다.

SDK 확장 프로그램의 역할:

  • 기기의 확장 SDK 수준 결정
  • 앱이 확장 SDK 수준을 쿼리할 수 있는 API 제공
  • (Android 12 이상) BOOTCLASSPATH, DEX2OATBOOTCLASSPATH, SYSTEMSERVERCLASSPATH 환경 변수의 값 결정

모듈 형식

SDK 확장 프로그램 모듈(com.android.sdkext)은 APEX 형식이며 Android 11 이상을 실행하는 기기에서 사용할 수 있습니다.

패키지 형식

SDK 확장 프로그램 모듈(com.google.android.sdkext)은 APEX 형식이며 다음 구성요소를 포함합니다.

  • (Android 12 이상) bin/derive_classpath: 기기 부팅 프로세스 초기에 실행되는 네이티브 바이너리입니다. 이 바이너리는 시스템 및 다른 모듈에서 개별 클래스 경로 구성 파일을 읽고 병합하며 CLASSPATH 환경 변수의 정의를 정의합니다.

  • bin/derive_sdk: 이 네이티브 바이너리는 기기 부팅 프로세스 초기에 실행되며 다른 모듈의 메타데이터를 읽어 확장 SDK와 관련된 시스템 속성(예: build.version.extensions.r)을 설정합니다.

  • javalib/framework-sdkextension.jar: 이 파일은 확장 SDK 수준을 쿼리할 수 있도록 API를 앱에 노출하는 bootclasspath에 있습니다.

확장 SDK 수준 도출

derive_sdk 프로그램은 각 APEX 모듈 내의 etc/sdkinfo.binarypb 하위 경로에 바이너리 protobuf 파일로 저장된 메타데이터를 읽습니다. protobuf 구조에 관한 자세한 내용은 protobuf 파일을 참고하세요.

확장 SDK 수준 읽기

SDK 확장 프로그램 모듈은 android.os.ext 패키지의 SdkExtensions java 클래스를 노출합니다. getExtensionVersion(int) 메서드를 사용하여 SDK 확장 프로그램의 버전을 읽습니다(예: getExtensionVersion(Build.VERSION_CODES.R)).

클래스 경로 도출

derive_classpath 서비스는 /system/etc/classpaths//apex/*/etc/classpaths/에 있는 개별 구성 파일을 읽고 병합합니다. 각 구성은 classpaths.proto의 protobuf 메시지를 proto 바이너리 형식으로 저장합니다. 클래스 경로 항목의 순서를 결정하는 정확한 병합 알고리즘은 derive_classpath.cpp에 설명되어 있으며 추후 변경될 수 있습니다.