כדי להשתמש ב-Vendor Native Development Kit (VNDK), צריך לבצע כמה שינויים בקוד הבסיסי כדי להפריד בין הבעיות של הספק לבין הבעיות של המערכת. במדריך הבא מוסבר איך מפעילים את VNDK בבסיס קוד של ספק או יצרן ציוד מקורי (OEM).
פיתוח ספריות מערכת
מערכת ה-build מכילה כמה סוגים של אובייקטים, כולל ספריות (משותפות, סטטיות או כותרות) וקבצים בינאריים.

איור 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
, היא נוצרת פעמיים:
- פעם אחת לפלטפורמה (ולכן מותקנת ב-
/system/lib
) - פעם אחת עבור הספק (ולכן מותקן ב-
/vendor/lib
או ב-VNDK APEX)
גרסאות הספק של הספריות נוצרות באמצעות -D__ANDROID_VNDK__
.
הדגל הזה משבית רכיבי מערכת פרטיים שעשויים להשתנות באופן משמעותי בגרסאות עתידיות של Android. בנוסף, ספריות שונות מייצאות קבוצה שונה של כותרות (כמו liblog
). אפשר לציין אפשרויות ספציפיות לגרסה של יצרן של יעד בקובץ Android.bp
ב:
target: { vendor: { … } }
הפעלת VNDK בקוד בסיס
כדי להפעיל את VNDK בקוד בסיס:
- כדי לקבוע את הזכאות, מחשבים את הגדלים הנדרשים של המחיצות
vendor.img
ו-system.img
. - מפעילים את
BOARD_VNDK_VERSION=current
. אפשר להוסיף ל-BoardConfig.mk
או ליצור רכיבים באמצעותו ישירות (לדוגמה,m -j BOARD_VNDK_VERSION=current MY-LIB
).
אחרי הפעלת BOARD_VNDK_VERSION=current
, מערכת ה-build אוכפת את הדרישות הבאות לגבי יחסי תלות וכותרות.
ניהול יחסי התלות
אובייקט vendor
שמבוסס על רכיב core
שלא קיים ב-vndk
או כאובייקט vendor
צריך לעבור פתרון באמצעות אחת מהאפשרויות הבאות:
- אפשר להסיר את התלות.
- אם רכיב
core
נמצא בבעלותvendor
, אפשר לסמן אותו כ-vendor_available
או כ-vendor
. - שינוי שגורם לאובייקט הליבה להפוך לחלק מ-
vndk
יכול לעבור ל-Google.
בנוסף, אם לרכיב core
יש יחסי תלות ברכיב vendor
, צריך להפוך את הרכיב vendor
לרכיב core
או להסיר את יחסי התלות בדרך אחרת (לדוגמה, על ידי הסרת יחסי התלות או העברת יחסי התלות לרכיב vendor
).
ניהול כותרות
צריך להסיר את יחסי התלות של הכותרות הגלובליות כדי לאפשר למערכת ה-build לדעת אם לפתח את הכותרות עם -D__ANDROID_VNDK__
או בלי -D__ANDROID_VNDK__
.
לדוגמה, עדיין אפשר לגשת לכותרות של libutils כמו utils/StrongPointer.h
באמצעות ספריית הכותרות 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
.