啟用 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"
        }
        ...
    }
    

如果 lib 標示為 vendor_available:true,就會建構該 lib 兩次:

  • 一次針對平台 (並安裝至 /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 後,建構系統 強制執行下列依附元件和標頭規定。

管理依附元件

依附 core 元件的 vendor 物件 不存在於 vndk 中,或做為 vendor 物件 必須透過下列其中一個選項解決:

  • 您可以移除依附元件。
  • 如果 core 元件的擁有者為 vendor,即可 標示為 vendor_availablevendor
  • 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。為了管理 請根據這些標頭執行下列其中一項操作:

  • 移除以下依附元件: 全部取代 private/android_filesystem_config.h AID_* 巨集搭配 getgrnam/ getpwnam 呼叫 (可能的話)。例如:
    • (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