IT/Android

Android TREBLE

2sonnn 2018. 4. 19. 22:46


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
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

  • 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]
(degenerated)

/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

ld.config*.txt

    • 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

  1. 공유 라이브러리의 의존성 체크
  2. VNDK 세트를 계산
  3. 의존성 위반 체크
  • 명령어
    1. 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

    2. 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

    3. 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

/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



Reference

https://source.android.com/devices/architecture/