제품 파티션

Android 9 및 이후 버전에는 Android 빌드 시스템을 사용한 product 파티션 빌드 지원이 포함됩니다. 이전의 Android 8.x에서는 Android 빌드 시스템에서 빌드한 OEM 관련 구성요소의 공간을 할당하지 않고 SoC 관련 구성요소를 system 파티션에서 vendor 파티션으로 분리했습니다. Android 9 이상에서는 여러 파티션의 priv-app에 적용되는 권한 및 허용 목록 기능을 추가로 제공합니다.

제품 파티션 정보

많은 OEM에서 AOSP 시스템 이미지를 맞춤설정하여 자체 기능과 이동통신사 요구사항을 구현합니다. 그러나 이러한 맞춤설정으로 인해 여러 소프트웨어 SKU에 단일 시스템 이미지를 사용할 수 없습니다. 맞춤설정을 지원하려면 각각의 이미지가 언어나 이동통신사 등에 따라 달라야 합니다. 별도의 product 파티션을 사용하여 맞춤설정을 포함하면 여러 소프트웨어 SKU에 단일 시스템 이미지를 사용할 수 있습니다. (system 파티션은 여러 소프트웨어 SKU 간에 공유할 수 있는 일반 코드를 호스팅합니다.) vendor 파티션은 특정 SoC를 기반으로 여러 기기 간에 공유할 수 있는 SoC 관련 BSP 코드를 계속 호스팅합니다.

별도의 파티션을 사용하면 디스크 공간을 관리(향후 확장을 위해 제한된 공간을 예약해 상태로 남겨두어야 함)하고 파티션 간에 안정적인 Application Binary Interface(ABI)를 유지해야 하는 등의 단점이 있습니다. product 파티션을 사용하기로 결정하기 전에 고유한 AOSP 구현 및 가능한 완화 전략을 고려해 보세요. 예를 들어 Google이 아닌 일부 OEM에서는 실행하는 무선 업데이트(OTA) 중에 기기 파티션을 다시 나눌 수 있습니다. 이를 위해서는 동적 파티션 나누기가 적합합니다.

제품 파티션 및 권한

Android 9 이상에서 권한 및 허용 목록 변경 프로세스는 제품 파티션의 priv-app 권한을 부여하는 방식에 영향을 줍니다. permissions.xml 파일은 priv-app과 동일한 파티션에 있어야 합니다. priv-app을 위해 system 파티션에 permissions.xml 파일을 배치하면 시스템 파티션이 product 파티션의 확장임에도 불구하고 제품 파티션에 있는 priv-app으로 권한이 확장되지 않습니다. 권한 및 허용 목록 프로세스에 관한 자세한 내용은 독점 권한 허용 목록을 참고하세요.

기존 /oem과 /product 비교

제품 인터페이스 적용에 따라 두 가지의 product 파티션 속성이 있습니다. 또한 product 파티션은 기존 oem 파티션과 다릅니다.

파티션 속성
oem
  • 업데이트할 수 없으며 대개 공장 출하 시 플래시됩니다.
  • 브랜드 및 색상 등 사소한 부분만 다르게 빌드됩니다. oem 파티션의 콘텐츠가 다르다고 해서 제품 소프트웨어가 다른 것은 아닙니다.
  • system 파티션은 oem 파티션을 사용하지 않으며, 특정 파일이 있는 경우에만 oem 파티션을 사용합니다.
  • system 파티션에서는 공개 API만 사용합니다.
product
  • 업데이트 가능합니다.
  • 시스템 이미지와 결합(함께 업데이트됨)됩니다.
  • 제품 또는 제품군별로 빌드됩니다.
  • 시스템 파티션은 product 파티션을 사용할 수 있습니다.
  • 비공개 API는 동시에 업데이트되므로 사용할 수 있습니다.
product(적용된 인터페이스)
  • 업데이트 가능합니다.
  • 시스템 이미지와 분리됩니다.
  • 제품 또는 제품군별로 빌드됩니다.
  • system 파티션은 product 파티션을 사용하지 않습니다.
  • 숨겨진 API는 사용할 수 없으며 system 파티션에서는 공개 및 시스템 API만 사용합니다.

이러한 이유로 Android 9은 product 파티션을 지원하면서 기존 oem 파티션을 사용하는 기기를 위해 oem 파티션도 계속 지원합니다. Android 11에서는 product 파티션을 system 파티션에서 분리하기 위해 product 인터페이스 적용을 지원합니다.

/product 구성요소

product 파티션에는 다음 구성요소가 포함됩니다.

  • 제품 관련 시스템 속성(/product/build.prop)
  • 제품 관련 RRO(/product/overlay/*.apk)
  • 제품 관련 앱(/product/app/*.apk)
  • 제품 관련 priv-app(/product/priv-app/*.apk)
  • 제품 관련 라이브러리(/product/lib/*)
  • 제품 관련 자바 라이브러리(/product/framework/*.jar)
  • 제품 관련 Android 프레임워크 시스템 구성(/product/etc/sysconfig/*/product/etc/permissions/*)
  • 제품 관련 미디어 파일(/product/media/audio/*)
  • 제품 관련 bootanimation 파일

custom_images 사용 불가

custom_images는 사용할 수 없습니다. 이 이미지는 다음을 지원할 수 없습니다.

  • 특정 타겟에 모듈 설치: custom_images는 아티팩트를 이미지로 복사하는 것은 지원하지만, 타겟 파티션을 빌드 규칙의 일부로 지정하여 모듈을 특정 파티션에 설치할 수는 없습니다.
  • Soong 지원: custom_images는 Soong 빌드 시스템을 사용하여 빌드할 수 없습니다.
  • OTA 업데이트 지원: custom_images는 OTA 업데이트를 수신할 수 없는 공장 출고 시 ROM 이미지로 사용됩니다.

파티션 간 ABI 유지

Android 9의 product 파티션은 system 파티션의 확장입니다. productsystem 파티션 간에는 취약한 ABI가 있으므로 둘은 동시에 업그레이드되어야 하며 ABI는 시스템 SDK 기반이어야 합니다. 시스템 SDK가 productsystem 간의 모든 API 노출 영역을 포함하지 않는 경우 OEM은 두 파티션 간에 자체 ABI를 유지해야 합니다.

productsystem 파티션은 서로에 대한 종속성을 가질 수 있습니다. 하지만 일반 시스템 이미지(GSI)를 이용한 테스트는 product 파티션 없이도 제대로 작동해야 합니다.

product 인터페이스가 적용되면 product 파티션이 system 파티션과 분리됩니다. product 파티션에서는 system 파티션에서 허용하는 인터페이스만 사용합니다.

product 파티션에는 vendor 파티션에 불안정한 인터페이스를 통해 연결된 종속 항목이 없어야 합니다. productvendor 파티션 간의 직접적인 상호작용은 금지됩니다. 이 정책은 SEpolicy에 의해 적용됩니다.

제품 파티션 구현

새 제품 파티션을 구현하기 전에 AOSP의 관련 제품 파티션 변경사항을 검토합니다. 그런 다음 product를 설정하기 위해 다음 보드 또는 제품 빌드 플래그를 포함합니다.

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • /product/build.prop의 경우 PRODUCT_PRODUCT_PROPERTIES입니다. PRODUCT_PRODUCT_PROPERTIES += product.abc=ok와 같이 $(call inherit-product path/to/device.mk) 내에 있어야 합니다.

제품 파티션에 모듈 설치

다음 빌드 플래그를 사용하여 모듈을 product 파티션에 설치합니다.

  • Android.bpproduct_specific: true
  • Android.mkLOCAL_PRODUCT_MODULE := true

자체 검사 부팅 사용 설정

악성 소프트웨어가 product 파티션을 변조하지 못하게 하려면 vendorsystem 파티션에 한 것처럼 파티션에 Android 자체 검사 부팅(AVB)을 사용 설정합니다. AVB를 사용 설정하려면 BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS 빌드 플래그를 포함합니다.