הפעלת 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)

גרסאות הספק של הספריות נוצרות באמצעות -D__ANDROID_VNDK__. הדגל הזה משבית רכיבי מערכת פרטיים שעשויים להשתנות באופן משמעותי בגרסאות עתידיות של Android. בנוסף, ספריות שונות מייצאות קבוצה שונה של כותרות (כמו liblog). אפשר לציין אפשרויות ספציפיות לגרסה של יצרן של יעד בקובץ Android.bp ב:

target: { vendor: { … } }

הפעלת VNDK בקוד בסיס

כדי להפעיל את VNDK בקוד בסיס:

  1. כדי לקבוע את הזכאות, מחשבים את הגדלים הנדרשים של המחיצות vendor.img ו-system.img.
  2. מפעילים את 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.