הפעלת VNDK

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

יצירת ספריות מערכת

מערכת ה-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 משמשות לתמונת הספק, בתמונת הספק (יכול להיות שהן מכילות כפילויות של 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.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 תוכל לדעת אם לבצע build של הכותרות עם -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.