VNDK 사용 설정

VNDK는 공급업체와 시스템 간의 문제를 분리하기 위해 코드베이스에 여러 변경사항을 적용합니다. 다음 가이드를 사용하여 VNDK를 공급업체/OEM 코드베이스에 사용 설정하세요.

빌드 시스템 라이브러리

빌드 시스템에는 라이브러리(공유, 정적 또는 헤더) 및 바이너리를 비롯한 여러 유형의 객체가 포함됩니다.

빌드 시스템 라이브러리
그림 1. 빌드 시스템 라이브러리
  • core 라이브러리는 시스템 이미지에서 시스템 이미지에 사용합니다. 이러한 라이브러리는 vendor, vendor_available, vndk 또는 vndk-sp 라이브러리에서 사용할 수 없습니다.
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • vendor-only(또는 proprietary) 라이브러리는 공급업체 이미지에서 공급업체 이미지에 사용합니다.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • vendor_available 라이브러리는 공급업체 이미지에서 공급업체 이미지(core의 중복이 포함될 수 있음)에 사용합니다.
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • 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,
        }
        ...
    }
    
  • llndk 라이브러리는 시스템 이미지와 공급업체 이미지에서 모두 사용합니다.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

lib가 vendor_available:true로 표시되면 다음과 같이 두 번 빌드됩니다.

  • 플랫폼에 1회(따라서 /system/lib에 설치됨)
  • 공급업체에 1회(따라서 /vendor/lib 또는 VNDK APEX에 설치됨)

lib의 공급업체 버전은 -D__ANDROID_VNDK__로 빌드됩니다. Android의 향후 버전에서 크게 변경될 수 있는 비공개 시스템 구성요소는 이 플래그로 사용 중지됩니다. 또한 다른 라이브러리는 다른 헤더 집합(예: liblog)을 내보냅니다. 타겟의 공급업체 변형과 관련된 옵션은 다음 위치의 Android.bp 파일에 지정할 수 있습니다.

target: { vendor: { … } }

코드베이스에 VNDK 사용 설정

코드베이스에 VNDK를 사용 설정하는 방법은 다음과 같습니다.

  1. vendor.imgsystem.img 파티션에서 필요한 크기를 계산하여 자격 요건을 확인합니다.
  2. BOARD_VNDK_VERSION=current를 사용 설정합니다. BoardConfig.mk에 추가하거나 이를 사용하여 구성요소를 직접 빌드할 수 있습니다(예: m -j BOARD_VNDK_VERSION=current MY-LIB).

BOARD_VNDK_VERSION=current를 사용 설정한 후에는 빌드 시스템에서 다음 종속 항목과 헤더 요구사항을 적용합니다.

종속 항목 관리

vndk에 없거나 vendor 객체로 존재하지 않는 core 구성요소에 종속되는 vendor 객체는 다음 옵션 중 하나를 사용하여 해결해야 합니다.

  • 종속 항목을 제거할 수 있습니다.
  • vendor에서 core 구성요소를 소유한 경우 vendor_available 또는 vendor로 표시될 수 있습니다.
  • vndk의 핵심 객체 부분을 이루는 변경사항을 Google로 업스트림할 수 있습니다.

또한 core 구성요소가 vendor 구성요소에 종속되어 있다면 vendor 구성요소를 core 구성요소로 만들거나 또는 종속 항목이 다른 방법으로 삭제되어야 합니다(예: 종속 항목을 삭제하거나 vendor 구성요소로 이동).

헤더 관리

빌드 시스템에서 헤더 빌드 시 -D__ANDROID_VNDK__의 사용 여부를 알 수 있도록 전역 헤더의 종속 항목은 삭제되어야 합니다. 예를 들어 utils/StrongPointer.h와 같은 libutils 헤더에 계속 헤더 라이브러리 libutils_headers를 사용하여 액세스할 수 있습니다.

일부 헤더(예: unistd.h)는 더 이상 전이하여 포함될 수 없지만 로컬로는 포함될 수 있습니다.

마지막으로 private/android_filesystem_config.h의 공개 부분은 cutils/android_filesystem_config.h로 이동했습니다. 이러한 헤더를 관리하려면 다음 중 하나를 실행해야 합니다.

  • 가능하다면 getgrnam/getpwnam 호출로 모든 AID_* 매크로를 대체하여 private/android_filesystem_config.h에 연결된 종속 항목을 삭제합니다. 예:
    • (uid_t)AID_WIFIgetpwnam("wifi")->pw_uid가 됩니다.
    • (gid_t)AID_SDCARD_Rgetgrnam("sdcard_r")->gr_gid가 됩니다.
    자세한 내용은 private/android_filesystem_config.h를 참조하세요.
  • 하드 코딩 AIS의 경우 cutils/android_filesystem_config.h를 포함합니다.