啟用 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庫由系統和供應商映像使用。
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

當一個庫被標記為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 標頭(例如utils/StrongPointer.h仍然可以使用標頭庫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_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