啟用 VNDK

供應商原生開發套件 (VNDK) 需要對程式碼庫進行幾項變更,才能將供應商和系統之間的疑慮區隔開來。請參閱以下指南,在供應商/原始設備製造商程式碼集中啟用 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,或直接使用該元件建構元件 (例如 m -j BOARD_VNDK_VERSION=current MY-LIB)。

啟用 BOARD_VNDK_VERSION=current 後,建構系統會強制執行下列依附元件和標頭規定。

管理依附元件

如果 vendor 物件依附於 core 元件,而該元件不存在於 vndk 中,或以 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。如要管理這些標頭,請執行下列任一操作:

  • 盡可能將所有 AID_* 巨集替換為 getgrnam/getpwnam 呼叫,以移除對 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