החל מ-27 במרץ 2025, מומלץ להשתמש ב-android-latest-release
במקום ב-aosp-main
כדי ליצור תרומות ל-AOSP. מידע נוסף זמין במאמר שינויים ב-AOSP.
הפעלת VNDK
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
כדי להשתמש ב-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)
הגרסאות של הספקים של ספריות ה-lib נוצרות באמצעות -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
.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-07-27 (שעון UTC)."],[],[],null,["# Enable VNDK\n\nThe Vendor Native Development Kit (VNDK) requires several changes to a codebase to separate\nconcerns between vendor and system. Use the following guide to enable VNDK in a vendor/OEM\ncodebase.\n\nBuild system libraries\n----------------------\n\nThe build system contains several types of objects including libraries\n(shared, static, or header) and binaries.\n\n**Figure 1.** Build system libraries.\n\n- `core` libraries are used by the system image, on the system image. These libraries can't be used by `vendor`, `vendor_available`, `vndk`, or `vndk-sp` libraries. \n\n ```carbon\n cc_library {\n name: \"libThatIsCore\",\n ...\n }\n ```\n- `vendor-only` (or `proprietary`) libraries are used by the vendor image, on the vendor image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorOnly\",\n proprietary: true,\n # or: vendor: true, # (for things in AOSP)\n ...\n }\n ```\n- `vendor_available` libraries are used by the vendor image, on the vendor image (may contain duplicates of `core`). \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorAvailable\",\n vendor_available: true,\n ...\n }\n ```\n- `vndk` libraries are used by the vendor image, on the system image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndk\",\n vendor_available: true,\n vndk: {\n enabled: true,\n }\n ...\n }\n ```\n- `vndk-sp` libraries are used by the vendor image, and also by the system image indirectly. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndkSp\",\n vendor_available: true,\n vndk: {\n enabled: true,\n support_system_process: true,\n }\n ...\n }\n ```\n- `llndk` libraries are used by both the system and vendor images. \n\n ```carbon\n cc_library {\n name: \"libThatIsLlndk\",\n llndk: {\n symbol_file: \"libthatisllndk.map.txt\"\n }\n ...\n }\n ```\n\nWhen a lib is marked as `vendor_available:true`, it's built\ntwice:\n\n- Once for platform (and thus installed to `/system/lib`)\n- Once for vendor (and thus installed to `/vendor/lib` or VNDK APEX)\n\nThe vendor versions of libs are built with `-D__ANDROID_VNDK__`.\nPrivate system components that may change significantly in future versions of\nAndroid are disabled with this flag. In addition, different libraries export a\ndifferent set of headers (such as `liblog`). Options specific to a\nvendor variant of a target can be specified in an `Android.bp` file\nin: \n\n```text\ntarget: { vendor: { … } }\n```\n\nEnable VNDK for a codebase\n--------------------------\n\nTo enable the VNDK for a codebase:\n\n1. Determine eligibility by calculating the required sizes of `vendor.img` and `system.img` partitions.\n2. Enable `BOARD_VNDK_VERSION=current`. You can add to `BoardConfig.mk` or build components with it directly (for example, `m -j BOARD_VNDK_VERSION=current `\u003cvar translate=\"no\"\u003eMY-LIB\u003c/var\u003e).\n\nAfter enabling `BOARD_VNDK_VERSION=current`, the build system\nenforces the following dependency and header requirements.\n\n### Manage dependencies\n\nA `vendor` object that depends on a `core` component\nthat doesn't exist in `vndk` or as a `vendor` object\nmust be resolved using one of the following options:\n\n- The dependency can be removed.\n- If the `core` component is owned by `vendor`, it can be marked as `vendor_available` or `vendor`.\n- A change making the core object part of the `vndk` may be upstreamed to Google.\n\nIn addition, if a `core` component has dependencies on a\n`vendor` component, the `vendor` component must be made\ninto a `core` component **or** the dependency must be\nremoved in another way (for example, by removing the dependency or by moving the\ndependency into a `vendor` component).\n\n### Manage headers\n\nGlobal header dependencies must be removed to enable the build system to know\nwhether to build the headers with or without `-D__ANDROID_VNDK__`.\nFor example, libutils headers such as `utils/StrongPointer.h` can\nstill be accessed using the header library\n[`libutils_headers`](https://android.googlesource.com/platform/system/core/+/android16-release/libutils/include/utils).\n\nSome headers (such as `unistd.h`) can no longer be included transitively\nbut can be included locally.\n\nFinally, the public part of `private/android_filesystem_config.h`\nhas been moved to `cutils/android_filesystem_config.h`. To manage\nthese headers, do one of the following:\n\n- Remove the dependency to `private/android_filesystem_config.h` by replacing all `AID_*` macros with [getgrnam](http://man7.org/linux/man-pages/man3/getgrnam.3.html)/ [getpwnam](http://man7.org/linux/man-pages/man3/getpwnam.3.html) calls if possible. For example:\n - `(uid_t)AID_WIFI` becomes `getpwnam(\"wifi\")-\u003epw_uid`.\n - `(gid_t)AID_SDCARD_R` becomes `getgrnam(\"sdcard_r\")-\u003egr_gid`.\n\n For details, refer to [private/android_filesystem_config.h](https://android.googlesource.com/platform/system/core/+/android16-release/libcutils/include/private/android_filesystem_config.h).\n- For hard-coded AIS, include `cutils/android_filesystem_config.h`."]]