App에서 Manifest는 권한, 버전, app의 name 등을 관리한다.
그리고 안드로이드에서 다양한 HAL서비스를 관리하기위해서 manifest를 사용한다. 이 때 공급업체에서 프레임워크에 제공하고 또 프레임워크에서 기기에 제공하는 정보를 manifest를 통해 설명한다.
1. Manifest
VINTF(Vendor Interface)는 manifest파일들을 읽어와서 설정을 진행합니다.
기기설정을 위한 각종 HAL, SELinux 등 기본적인 H/W 설정부터 framework 설정까지를 담당합니다. 물론 manifest안에 HAL 의 모든내용이 정의 된 것은아니고 기본적으로 VINTF가 manifest를 읽어와서 HAL의 정보를 간단히 판단하고 또 빌드에 포함할 수 있으며 manifest.xml을 시작으로 HAL파일들을 읽어와 직접적으로 HAL을 사용할 수 있습니다.
이러한 manifest파일은 device manifest, farmework manifest 두 종류가 있습니다.
1) device manifest
기본적으로 기기 매니페스트에서는 vendor manifest, odm manifest로 나누어 집니다.
- vendor manifest
vendor manifest의 경우 공급업체 즉 vendor 파티션 HAL, SELinux를 정의합니다. vendor manifest는 기본적으로 /vendor/etc/vintf/manifest.xml에 정의됩니다.
<hal format="hidl"> <name>vendor.samsung_slsi.hardware.configstore</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IExynosHWCConfigs</name> <instance>default</instance> </interface> <fqname>@1.0::IExynosHWCConfigs/default</fqname> </hal> <hal format="hidl"> <name>vendor.trustonic.tee</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ITee</name> <instance>default</instance> </interface> <fqname>@1.0::ITee/default</fqname> </hal> <hal format="hidl"> <name>vendor.trustonic.teeregistry</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ITeeRegistry</name> <instance>default</instance> </interface> <fqname>@1.0::ITeeRegistry/default</fqname> </hal> <sepolicy> <version>28.0</version> </sepolicy> |
위는 vendor manifest의 일부이며 selinux정책에 대한 정의부터 각종 HAL에 대한 정의가 되어있습니다. 기본적으로 각각의 서비스는 어떤 서비스인지 알려주는 format, application 이름, application사용을 위한 방법을 제시하는 transport, version(HAL인경우 HAL 버전), interface(HAL인경우 HAL 인터페이스)를 알 수 있습니다.
VINTF는 manifest.xml을 읽어와 각 HAL에 대한 기본적인 정보를 모을 수 있고 이렇게 모은 정보를 바탕으로 빌드를 진행할 때 interaface를 찾아 결과적으로 HAL Server, Client 소스 코드들을 찾아 빌드하고 HAL기능을 동작시킬 수 있도록 합니다.
- ODM Manifest
android에서는 SoC 여러 H/W가 변경 및 업그레이드 되더라도 동일한 binary 즉 one binary 정책을 지원할 수 있게 ODM 파티션을 제공한다.
Android 10 이상에서는 /odm 파티션 설정 변경을통한 여러 SKU를 one binary로 지원할 수 있도록 지원하며 동적 파티션 기능을 제공하여 파티션의 크기를 동적으로 변경할 수 있도록 한다.
기본적으로 안드로이드 단말에는 여러 H/W(지역향별)가들어가고 H/W위에 여러 S/W(통신사별 등)가 올라가게 된다. 즉 H/W가 n개 S/W가 m개의 다향성을 가진다면 총 생성되는 바이너리는 m*n개의 바이너리가 생성되는 비효율적인 요소가 존재한다.
구글에서는 이러한 문제를 막기위해 android os 9.0 이상부터 /product, android os 10.0이상부터 /odm 파티션을 각각지원한다.
/product파티션의 경우 위 S/W sku에 따른 바이너리 분할을 막기위한 파티션으로 해당 파티션에서 sku별 동작을 분기하고 하나의 바이너리로 모든 s/w 다향성을 처리할 수 있도록 지원한다.
/odm 파티션의 경우 H/W sku에 따른 바이너리 분할을 막기위한 파티션으로 해당 파티션에서 sku별 동작을 분기하고 하나의 바이너리로 모든 h/w 다향성을 처리할 수 있도록 지원한다.
ODM Manifest는 이러한 /odm 파티션에 대한 HAL 등의 설정을 위한 manifest라고 볼 수 있다.
VINTF는 vendor manifest, odm manifest를 읽어와 결합하는 역할을 진행하며 순서는 vendor -> odm이 된다. 여기서 odm manifest에 overwrite=true로 설정하면 vendor manifest를 읽고 odm manifest를 읽을 때 동일한 application에 대해서 overwrite가 된다.
즉 여러 제품의 공통적인 hal을 vendor manifest에서 정의하되 특별 제품에에 대한 hal code를 odm manifest에 정의하여 처리할 수 있다.
여기에 OTA manifest도 존재하는데 이는 우리가 흔히 갤럭시 스마트폰을 사용하다보면 안드로이드 OS version up등의 여러 업그레이드를 마주하게되는데 이 때 hal version이 올라가거나할 때 바로 OTA manifest에 정의해서 OTA service를 통해서 단말 내 HAL 정보 업데이트를 진행한다.
2) Framework manifest
Frmaework manifest는 system manifest, product manifest, system_ext manifest로 구성된다.
여기서 system, product는 각각의 /system, /product 파티션에 따른 HAL 설정을 정의하는 역할을 진행한다. 그리고 system_ext_manifest의 경우 system_ext 파티션은 물론 system sdk버전과 vndk버전을 설정한다.
3) BoradConfig.mk
위에서 언급한 내용과 같이 Android는 각 manifest.xml을 읽어와 설정값들을 정리하고 그에맞느 HAL service, SELinux를 제공한다.
여기서 위 하나하나의 기능을 모두 담아 manifest.xml을 직접 정의하는 것은 많은 어려움이 있을 수 있어 구글은 개발상 편의를 위해 다양한 방법과 도구를지원한다. 기본적으로 manifest.xml을 자동으로 만들어주는 도구들을 지원하며 추가로 BoardConfig.mk파일을 지원한다
Android는 빌드 시 soong-build를 통해 mk파일들을 읽어 빌드를 진행한다. 즉 BoardConfig.mk파일은 H/W board에 대한 설정을 담은 파일로 Andorid 빌드 시 .mk파일로써 포함되어 빌드된다. 개발자는 해당 .mk파일을 통해 manifest.xml을 정의할 수 있다.
기본적으로 HAL 인터페이스, 소스 코드를 정의하고 만들어진 .xml파일에 대해서
BoardConfig.mk파일 안에 아래와 같의 정의한다.
DEVICE_FRAMEWORK_MANIFEST_FILE := \ device/manufacturer/device_name/device_system_manifest.xml |
위와 같이 특정 Feature에 정의된 xml파일을 더해주게되면 Android는 빌드 진행 시 해당 Feature를 읽어 자동으로 manifest.xml을 생성해준다.
(vendor, odm, product 등 여러 manifest파일 모두가 위처럼 자동으로 manifest.xml파일을 만들 수 있도록 위 기능을 지원한다)
- ref
'Android > 안드로이드 운영체제' 카테고리의 다른 글
[Android] Android Freeze (0) | 2022.05.28 |
---|---|
[Android] Protected Broadcast (0) | 2022.03.20 |
[Android] 안드로이드(15) - bp파일, go파일 (0) | 2021.06.11 |
[Android] 안드로이드(14) - Framework(Native) (0) | 2021.03.06 |
[Android] 안드로이드(13) - Binder (0) | 2021.02.28 |