הפעלת VNDK

ערכת הפיתוח המקורית של הספק (VNDK) דורשת מספר שינויים ב-codebase כדי להפריד בין או בעיות בין הספק למערכת. במדריך הזה מוסבר איך להפעיל VNDK אצל ספק או OEM ב-codebase.

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

מערכת ה-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)

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

target: { vendor: { … } }

הפעלת VNDK ל-codebase

כדי להפעיל את ה-VNDK ל-codebase:

  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__. לדוגמה, כותרות תת-קישורים כמו 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