Concept & Purpose
벤더 구현 분리(특정 device 구현 or 칩 벤더 SW)
더 쉽고, 더 빠르고, 적은 비용으로 업그레이드!
Technical information
HAL
Hardware Abstraction Layer
HW 벤더가 구현할 수 있는 표준 인터페이스를 정의
Binderized HALs
- HIDL 로 표현된 HAL
- Binderized HAL에서 프레임워크와 HAL은 바인더 IPC call 로 통신을 함
Passthrough HALs
- HIDL로 래핑된 기존 HAL
- Android 8.0으로 업그레이드 하는 기기는 Passthrough HAL을 사용할 수 있음(Same-process)
HAL 모드 요구사항
Device |
Passthrough |
Binderized |
Launch with Android 8.0 |
Passthrough HALs에 있는 HAL은 무조건 passthrough |
vendor의 HAL을 포함한 다른 모든 HAL은 binderized |
Upgrade to Android 8.0 |
Passthrough HALs에 있는 HAL은 무조건 passthrough |
Binderized HALs의 HAL은 무조건 binderized |
나머지 벤더에 의해 제공되는 HAL은 모드 상관 없음 |
HIDL
HAL interface definition language or HIDL (pronounced "hide-l")
HAL과 사용자간의 인터페이스를 지정하는 IDL
HIDL은 Process간의 IPC에 사용하기 위함이고, 프로세스간의 통신을 binderized 라고 함
HIDL의 목표는 벤더 변경 없이 프레임워크 교체
Binder IPC
IPC Domain |
Description |
/dev/binder |
AIDL로 구성된 프레임워크와 app 프로세스간의 IPC |
/dev/hwbinder |
HIDL로 구성된 프레임워크와 벤더 프로세스간의 IPC |
/dev/vndbinder |
AIDL로 구성된 벤더 프로세스간의 IPC |
VNDK
The Vendor Native Development Kit (VNDK)
벤더 모듈을 구현하는 라이브러리 집합
벤더의 변경 없이 system 파티션만 update 가능
- 프레임워크 프로세스는 벤더의 공유라이브러리 로드 못함
- 모든 벤더 프로세스는 벤더의 공유라이브러리만 로드 할 수 있음(system 라이브러리 일부 포함)
- 프레임워크와 벤더 프로세스 간의 통신은 HIDL및 Hardware binder를 통해서
Categories
LLNDK
- 안정된 API와 프레임워크와 느슨하게 결합된(?) 공유라이브러리
- 시스템 이미지에 포함되고 시스템, 벤더 모두 사용 가능
libEGL.so, libGLESv1_CM.so, libGLESv2.so, libGLESv3.so, libandroid_net.so, libc.so, libdl.so, liblog.so, libm.so, libnativewindow.so, libsync.so, and libvndksupport.so
VNDK
- vendor 모듈용으로 변형된 라이브러리
- 보통 짝을 이루는 동일한 이름의 FWK-ONLY 라이브러리 존재
- 시스템 이미지에 포함되고 벤더 이미지에서 사용
시스템과 서로 IPC 주고받지 않아야 함
ART virtual machine과 관련 없어야 함
불안정한 파일 형식의 파일이나 파티션을 RW 하지 않아야 함
법적 검토가 필요한 특수 SW 라이센스 없어야 함
코드 소유자는 벤더의 사용에 이의가 없어야 함
VNDK-SP
- VNDK와 같음
- SP-HALs에 의해 사용할 수 있음
- 프레임워크 프로세스에 로드 됨
- LLNDK 혹은 VNDK-SP만 종속되어야 함
- VNDK-SP 와 짝을 이루는 같은 이름의 FWK-ONLY 라이브러리가 같은 프로세스에 로드 됨
- 구글에 의해 정의됨
- 시스템 이미지에 포함되고 시스템 이미지에서 우회적으로 사용됨
FWK-ONLY
- 시스템 파티션에 있는 다른 SO
- 벤더 모듈은 의존할 수 없음
- 시스템 이미지에 포함되고 시스템 이미지에서 사용됨 (다른 모든 모듈에서 사용 불가)
VND-ONLY
- non-SP-HAL을 포함한 벤더파티션에 있는 다른 모든 SO
- 시스템 모듈은 의존할 수 없음
- 벤더 이미지에 포함되고 벤더 이미지에서 사용
Summary
- 파티션을 엇갈려 로드할 때에는 LLNDK, VNDK, VNDK-SP, SP-HAL 중에 하나여야 함(O-MR1에서 recommended, P에서 강제)
- API26에서 사용되는 라이브러리 정의 리스트
Directory layout
|
Android O |
Android O-MR1 |
Independent system updates |
FWK-ONLY |
/system/lib[64] |
/system/lib[64] |
모든게 변할 수 있음 |
LLNDK |
/system/lib[64] |
/system/lib[64] |
새로 구현된 사항 |
VNDK-SP |
/system/lib[64]/vndk-sp |
/system/lib[64]/vndk-sp |
이전 API에 대한 보안 수정사항 |
VNDK-SP-EXT |
/vendor/lib[64]/vndk-sp |
/vendor/lib[64]/vndk-sp |
N/A |
VNDK |
/system/lib[64] |
/system/lib[64]/vndk |
이전 API에 대한 보안 수정 사항(O-MR1에서만) |
VNDK-EXT |
/system/lib[64] |
/vendor/lib[64]/vndk |
N/A |
VNDK-ONLY |
/vendor/lib[64] |
/vendor/lib[64] |
N/A |
Dynamic linker support
- Dynamic linker namespace 설정 파일, INI file 포맷으로 되어 있음
- 수정 불가 (CTS Fail)
SP-HAL and VNDK-SP 분리
- 벤더 파티션의 SP-HAL은 시스템 프로세스에 로드됨
- SP-HAL은 VNDK-SP에 의존할 수 있음
- 프레임워크모듈은 VNDK-SP와 같은 이름으로 짝을 이루는 FWK-ONLY SO에 의존
- 같은 이름의 두 SO가 로드되면 아래와 같은 문제 야기
- update 이후 다른 symbol을 갖을 될 수 있음
- Android Oreo에서 강제됨
(PRODUCT_FULL_TREBLE := true)
system and vendor 분리
- SO의 의존성 분리
- VNDK와 SP-HAL을 제외한 다른 파티션의 SO는 로드되지 못함
- Requirement
- Not in Oreo
- Recommended in Oreo-MR1
- Enforced in P
- 오레오에서 BOARD_VNDK_VERSION이 정의되면 기본으로 강제됨
- BOARD_VNDK_RUNTIME_DISABLE := true 추가해서 disable 가능
Framework Process linker namespaces
- Oreo-MR1
Vendor Process linker namespaces
- Oreo
- Oreo-MR1
Build System Support
Motivation
- 필요하다면 SO 복제 가능
- 벤더 파티션에서 사용을 위한 벤더 variant 작성
- VNDK, VNDK-SP는 필요하다면 복제될 수 있음
- 빌드 의존성을 명시화
- 헤더, 정적 라이브러리, 공유라이브러리가 사용가능한지 확인
- GSI에 인스톨 될 VNDK 정의
- 교차 버전 시스템 이미지 개발을 위한 VNDK snapshot 생성
Android Oreo
- 모듈을 벤더 파티션에 이동하는 방법
- Android.mk
LOCAL_VENDOR_MODULE := true
or
LOCAL_PROPRIETARY_MODULE := true
- Android.bp
vendor:true
or
proprietary:true
- 시스템과 벤더에 모두 설치하기 위해 약간의 트릭을 사용
Android Oreo-MR1
- Enable full VNDK support
- BoradConfig.mk 에 아래 코드로 enable
BOARD_VNDK_VERSION := current
- 헤더 검색 경로를 확인하고 모든 전역 기본 검색 경로를 제거
- 공유 라이브러리의 링크 유형 확인(벤더 모듈은 LLNDK나 vendor_vailable만 link 가능)
- 벤더 별 VNDK 라이브러리 빌드하여 /system/lib\[64\]/\{vndk,vndk-sp\} 에 설치
- 벤더 별 라이브러리 빌드하고 /vendor/lib\[64\] 에 설치
- Android.bp에서 VNDK 와 연관된 property
- vendor: true
- 벤더 모듈
- LLNDK와 vendor_available에만 의존할 수 있음
- false라면 벤더 모듈에 의존할 수 없음
- vendor_available: true
- 벤더에서 사용 가능
- 프레임워크 모듈이 사용하면, 벤더용으로 변형되어 빌드됨
- vndk.enabled: true
- VNDK 라이브러리
- vndk.support_system_process: true
- VNDK-SP 라이브러리
- target.vendor
- 벤더 특화된 빌드 옵션
- exclude_srcs : exclude framework-specific source files
- exclude_shared_libs : exclude framework-specific shared libraries
- Example
- LLNDK
llndk_library {
name: "libThasIsLlndk",
}
- VNDK
cc_library {
name: "libThatIsVndk",
vendor_available: true,
vndk: {
enabled: true,
}
...
}
- VNDK-SP
cc_library {
name: "libThatIsVndkSp",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
}
...
}
- FWK-ONLY
cc_library {
name: "libThatIsCore",
...
}
- VND-ONLY
cc_library {
name: "libThatIsVendorOnly",
proprietary: true,
# or: vendor: true, # (for things in AOSP)
...
}
VNDK definition tool
- 공유 라이브러리의 의존성 체크
- VNDK 세트를 계산
- 의존성 위반 체크
- 명령어
- vndk
벤터 파티션에 복사되어야 할 VNDK-SP 라이브러리 기타 다른 라이브러리 나열vndk_definition_tool.py vndk \
--system path/system \
--vendor path/vendor \
--aosp-system path/gsi/system \
--tag-file eligible-list.csv \
--load-extra-deps deps.txt
- check-dep
종속성을 검사하여 위반된 라이브러리와 심볼 나열vndk_definition_tool.py check-dep \
--system path/system \
--vendor path/vendor \
--aosp-system path/gsi/system \
--tag-file eligible-list.csv \
--load-extra-deps deps.txt \
--module-info module-info.json
- deps & deps-insight
모든 공유 라이브러리의 종속성을 출력하는 디버깅 명령어vndk_definition_tool.py deps \
--system path/system \
--vendor path/vendor \
--load-extra-deps deps.txt \
--module-info module-info.json
vndk_definition_tool.py deps-insight \
--system path/system \
--vendor path/vendor \
--aosp-system path/gsi/system \
--tag-file eligible-list.csv \
--load-extra-deps deps.txt \
--module-info module-info.json
JNI libraries in bundled apps (O-MR1)
Shared libraries location |
Bundled System app |
Bundled vendor app |
Downloaded app |
/system/lib[64] |
All |
/system/etc/public.libraries.txt(NDK)+LLNDK |
/system/etc/public.libraries.txt(NDK) |
/vendor/lib[64] |
/vendor/etc/public.libraries.txt |
All |
/vendor/etc/public.libraries.txt |
/system/lib[64]/vndk-sp |
X |
Public VNDK-SP |
X |
/system/lib[64]/vndk |
X |
X |
X |
VNDK Rules
- 프레임워크 프로세스는 벤더파티션에서 SP-HAL이 아닌 라이브러리를 로드할 수 없음 (O는 완전 강제는 아님)
- 벤더 프로세스는 시스템 파티션에서 LL-NDK, VNDK-SP, VNDK를 제외한 다른 라이브러리를 로드할 수 없음 (O는 완전 강제는 아님)
- Note: 어차피 할거 OTA를 위해 8.0부터 지켜주는 것이 좋음
- 설치되는 VNDK는 Google 에서 정의한 Eligible VNDK 라이브러리에 포함되어야 함
- SP-HAL, SP-HAL-Dep의 외붖오속성은 LL-NDK or Google이 정의한 VNDK-SP로 제한
- SP-HAL의 종속성은 LL-NDK, VNDK-SP, SP-HAL or SP-HAL-Dep로 분류될 수 있는 다른 벤더의 SO로 제한
- 벤더의 SO는 AOSP가 아니고 종속성이 LL-NDK, VNDK-SP, SP-HAL이나 다른 SP-HAL-Dep에만 있을 경우 Sp-HAL-Dep로 분류할 수 있음
- VNDK-SP는 반드시 self-contained. libRS_internal.so는 8.0 이후에 다시 검토 예정
- 바인더,소켓, 공유메모리, 파일 등 HIDL이 아닌 프레임워크와 벤더간의 통신 사용 불가
- 시스템 파티션은 모든 VNDK의 복사본 두개와 부적격한 프레임워크 라이브러리 복사본을 포함할 만큼 커야 함
Terminology
Modules
Shared Libraries or Executables
Processes
Operating system tasks spawned from Executables
Framework-qualified terms
concepts related to the system partition
Framework Executables |
executables in /system/bin or /system/xbin |
Framework Shared Libraries |
shared libraries under /system/lib[64] |
Framework Modules |
Framework Shared Libraries and Framework Executables |
Framework Processes |
Processes spawned from Framework Executables |
Vendor-qualified terms
concepts related to the vendor partition
Vendor Executables | executables in /vendor/bin |
Vendor Shared Libraries | shared libraries under /vendor/lib[64] |
Vendor Modules | Vendor Shared Libraries and VEndor Executables |
Vendor Processes | Processes spawned from Vendor Executables |