啟用 VNDK

VNDK 需要對代碼庫進行多次更改,以區分供應商和系統之間的關注點。使用以下指南在供應商/OEM 代碼庫中啟用 VNDK。

構建系統庫

構建系統包含多種類型的對象,包括庫(共享、靜態或標頭)和二進製文件。

構建系統庫
圖 1.構建系統庫
  • core庫由系統映像使用,位於系統映像上。 vendorvendor_availablevndkvndk-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庫。
    llndk_library {
        name: "libThatIsLlndk",
    }
    

當一個庫被標記為vendor_available:true時,它會被構建兩次:

  • 一次用於平台(因此安裝到/system/lib
  • 供應商一次(因此安裝到/vendor/lib或 VNDK APEX)

庫的供應商版本是使用-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中不存在的core組件或作為供應vendor對象的vendor對象必須使用以下選項之一進行解析:

  • 可以刪除依賴項。
  • 如果core組件歸vendor所有,則可以將其標記為vendor_availablevendor
  • 使核心對象成為vndk一部分的更改可能會上傳到 Google。

另外,如果core組件依賴於vendor組件,則必須將vendor組件製成core組件,或者必須以其他方式移除依賴項(例如,通過移除依賴項或將依賴項移動到vendor組件中) )。

管理標題

必須刪除全局標頭依賴項,以使構建系統知道是否使用或不-D__ANDROID_VNDK__來構建標頭。例如,仍然可以使用頭庫libutils_headers訪問諸如utils/StrongPointer.h之類的 libutils 頭文件。

某些標頭(例如unistd.h )不能再被包含,但可以在本地包含。

最後, private/android_filesystem_config.h的公共部分已移至cutils/android_filesystem_config.h 。要管理這些標頭,請執行以下操作之一:

  • 如果可能的話,通過用getgrnam / getpwnam調用替換所有AID_*宏來移除對private/android_filesystem_config.h的依賴。例如:
    • (uid_t)AID_WIFI變為getpwnam("wifi")->pw_uid
    • (gid_t)AID_SDCARD_R變為getgrnam("sdcard_r")->gr_gid
    有關詳細信息,請參閱private/android_filesystem_config.h
  • 對於硬編碼的 AIS,包括cutils/android_filesystem_config.h