מניפסטים

אובייקט VINTF צובר נתונים ממכשיר קובצי מניפסט ומניפסט של framework (XML). שתי השיטות יש פורמט משותף למניפסטים, אבל לא כל הרכיבים חלים על שניהם (פרטים נוספים) בסכימה, ראו סכימת קובצי מניפסט).

מניפסט מכשיר

מניפסט המכשיר (מסופק על ידי המכשיר) מורכב ממניפסט של הספק ואת המניפסט של ODM.

  • במניפסט של הספק מצוין HAL, גרסאות של מדיניות SELinux וכו' שמשותפים ל-SoC. הוא מומלץ למקם את עץ המקור של Android ב device/VENDOR/DEVICE/manifest.xml, אבל מספר מקטעים קבצים שימושיים. לפרטים נוספים אפשר לעיין בקטעי מניפסט יצירה DM מקטעים.
  • במניפסט ODM מפורטים HALs ספציפיים למוצר מחיצת ODM. האובייקט VINTF טוען את המניפסט של ODM לפי הסדר הבא:
    1. אם מוגדר SKU (כאשר SKU הוא הערך של הנכס ro.boot.product.hardware.sku), /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. אם מגדירים את SKU, /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • במניפסט של הספק מפורטות דרישות HAL שספציפיות למוצר במחיצת הספק. אובייקט ה-VINTF טוען את המניפסט של הספק לפי הסדר הבא:
    1. אם מוגדר SKU (כאשר SKU הוא הערך של הנכס ro.boot.product.vendor.sku), /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • אובייקט ה-VINTF טוען את המניפסט של המכשיר לפי הסדר הבא:
    1. אם יש מניפסט של ספק, צריך לשלב את הפרטים הבאים:
      1. המניפסט של הספק
      2. קטעים אופציונליים במניפסט של הספק
      3. מניפסט אופציונלי ל-ODM
      4. קטעים אופציונליים של מניפסט ODM
    2. אחרת, אם קיים מניפסט ODM, משלבים את המניפסט של ODM עם ה-ODM האופציונלי מקטעי מניפסט.
    3. /vendor/manifest.xml (מדור קודם, ללא מקטעים)
    4. לבסוף, צריך לשלב מקטעי מניפסט מכל APEX של ספק.

    הערה:

    • במכשירים מדור קודם, נעשה שימוש במניפסט של הספק הקודם ובמניפסט של ODM. מניפסט ODM עשוי לבטל לחלוטין את המניפסט הקודם של הספק.
    • במכשירים עם Android 9, המניפסט של ODM משולב באמצעות המניפסט של הספק.
    • כשמשלבים רשימת מניפסטים, מניפסטים שמופיעים בהמשך הרשימה עשויים לבטל במניפסטים שמופיעים מוקדם יותר ברשימה, בתנאי שהתגים למניפסט יש את המאפיין override="true". לדוגמה, המניפסט של ODM עשוי לשנות חלק מתגי <hal> מהמניפסט של הספק. אפשר לעיין במסמכי התיעוד עבור מאפיין override למטה.

ההגדרה הזו מאפשרת לכמה מוצרים בעלי אותו לוח לשתף את אותו לוח תמונה של הספק (שמאפשרת HALs נפוצים) אבל יש לה תמונות ODM שונות לציין ערכי HAL ספציפיים למוצר).

הנה דוגמה למניפסט של ספק.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="2.0" type="device" target-level="1">
    <hal>
        <name>android.hardware.camera</name>
        <transport>hwbinder</transport>
        <version>3.4</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>legacy/0</instance>
            <instance>proprietary/0</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <version>2.0</version>
        <interface>
            <name>INfc</name>
            <instance>nfc_nci</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
        <fqname>@2.0::INfc/default</fqname>
    </hal>
    <hal>
        <name>android.hardware.drm</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ICryptoFactory</name>
            <instance>default</instance>
        </interface>
        <interface>
            <name>IDrmFactory</name>
            <instance>default</instance>
        </interface>
        <fqname>@1.1::ICryptoFactory/clearkey</fqname>
        <fqname>@1.1::IDrmFactory/clearkey</fqname>
    </hal>
    <hal format="aidl">
        <name>android.hardware.light</name>
        <version>1</version>
        <fqname>ILights/default</fqname>
    </hal>
    <hal format="aidl">
        <name>android.hardware.power</name>
        <version>2</version>
        <interface>
            <name>IPower</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal format="native">
        <name>EGL</name>
        <version>1.1</version>
    </hal>
    <hal format="native">
        <name>GLES</name>
        <version>1.1</version>
        <version>2.0</version>
        <version>3.0</version>
    </hal>
    <sepolicy>
        <version>25.0</version>
    </sepolicy>
</manifest>

הנה דוגמה למניפסט ODM.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="device">
    <!-- camera 3.4 in vendor manifest is ignored -->
    <hal override="true">
        <name>android.hardware.camera</name>
        <transport>hwbinder</transport>
        <version>3.5</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>legacy/0</instance>
        </interface>
    </hal>
    <!-- NFC is declared to be disabled -->
    <hal override="true">
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
    </hal>
    <hal>
        <name>android.hardware.power</name>
        <transport>hwbinder</transport>
        <version>1.1</version>
        <interface>
            <name>IPower</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

הנה דוגמה למניפסט של מכשיר בחבילת OTA.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="device" target-level="1">
    <!-- hals ommited -->
    <kernel version="4.4.176">
        <config>
            <key>CONFIG_ANDROID</key>
            <value>y</value>
        </config>
        <config>
            <key>CONFIG_ARM64</key>
            <value>y</value>
        </config>
    <!-- other configs ommited -->
    </kernel>
</manifest>

אפשר לקרוא מידע נוסף במאמר מניפסט מכשירים פיתוח.

מניפסט של המסגרת

קובץ המניפסט של framework מורכב ממניפסט המערכת, מניפסט המוצר system_ext למניפסט.

  • מניפסט המערכת (מסופק על ידי Google) נוצר באופן ידני נמצא בעץ המקור של Android /system/libhidl/manifest.xml
  • במניפסט המוצר (מסופק על ידי המכשיר) מפורטות דפי HAL שמקבלים שירות על ידי מודולים שהותקנו חלוקת מוצרים.
  • המניפסט system_ext (מסופק על ידי המכשיר) מפרט את הפרטים הבאים:
    • שירות HAL שמספק מודולים שמותקנים במחיצת system_ext;
    • גרסאות VNDK;
    • גרסת ה-SDK של המערכת.

בדומה למניפסט של המכשיר, ניתן להשתמש במספר קובצי מקטעים. פרטים נוספים זמינים במאמר קטעי מניפסט.

הנה דוגמה למניפסט של framework.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="framework">
    <hal>
        <name>android.hidl.allocator</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IAllocator</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.memory</name>
        <transport arch="32+64">passthrough</transport>
        <version>1.0</version>
        <interface>
            <name>IMapper</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.manager</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IServiceManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal>
        <name>android.frameworks.sensorservice</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ISensorManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal max-level="5">
        <name>android.frameworks.schedulerservice</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ISchedulingPolicyService</name>
            <instance>default</instance>
        </interface>
    </hal>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</manifest>

קטעי מניפסט

ב-Android מגרסה 10 ואילך, אפשר לשייך מניפסט עם מודול HAL במערכת ה-build. כך קל יותר לכלול באופן מותנה את מודול ה-HAL במערכת ה-build.

דוגמה

בקובץ Android.bp או Android.mk, מוסיפים vintf_fragments לכל מודול. לדוגמה, אפשר לשנות של המודול עם הטמעת תקן HAL (my.package.foo@1.0-service-bar).

... {
    ...
    vintf_fragments: ["manifest_foo.xml"],
    ...
}
LOCAL_MODULE := ...
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml

בקובץ בשם manifest_foo.xml, יוצרים את המניפסט עבור של המודול הזה. בזמן ה-build, המניפסט הזה מתווסף למכשיר. ההוספה מתבצעת רשומה כאן זהה להוספת רשומה במניפסט הראשי של המכשיר. האימות מאפשר ללקוחות להשתמש בממשק ומאפשר ל-VTS לזהות איזה HAL נמצאים במכשיר. כל דבר שמניפסט רגיל כן, המניפסט הזה כן רלוונטי.

הדוגמה הבאה מטמיעה android.hardware.foo@1.0::IFoo/default, שמותקן ל- המחיצה vendor או odm. אם היא מותקנת חלוקה למחיצה system, product או system_ext, סוג השימוש framework במקום מקלידים device.

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.foo</name>
        <transport>hwbinder</transport>
        <fqname>@1.0::IFoo/default</fqname>
    </hal>
</manifest>

אם מודול HAL ארוז ב-APEX של ספק, לארוז את מקטעי ה-VINTF המשויכים בתוך אותו APEX עם prebuilt_etc כמו שמוסבר בקטעים של VINTF.

סכימה של קובץ מניפסט

בקטע הזה מתוארת המשמעות של תגי ה-XML האלה. כמה "חובה" תגים יכול להיות חסר בקובץ המקור בעץ המקור של Android והוא נכתב על ידי assemble_vintf בזמן ה-build. תגים נדרשים חייבים להופיע בקבצים המתאימים באתר במכשיר.

?xml
אופציונלי. מספק מידע רק למנתח ה-XML.
manifest.version
חובה. מטא-גרסת של המניפסט הזה. מתאר את הרכיבים הצפויים במניפסט. לא קשור לגרסת ה-XML.
manifest.type
חובה. סוג המניפסט הזה. הערך שלו הוא device עבור קובץ המניפסט של המכשיר ו-framework למניפסט של ה-framework
manifest.target-level
חובה למניפסט של המכשיר. מציינת את מטריצת התאימות של framework (FCM) שלפיה מניפסט המכשיר הזה מיועד לתאימות עם. היא נקראת גם גרסת FCM למשלוח של המכשיר.
manifest.hal
אופציונלי, אפשר לחזור על הפעולה. HAL יחיד (HIDL או מותאם, כמו GL), בהתאם למאפיין format.
manifest.hal.format
אופציונלי. הערך יכול להיות אחד מהערכים הבאים:
  • hidl: HIDL HALs. (זוהי ברירת המחדל)
  • aidl: AIDL HALs. תקף רק בגרסת מטא של המניפסט 2.0 ומעלה.
  • native: מודעות HTML מותאמות.
manifest.hal.max-level
אופציונלי. תקף רק למניפסטים של framework. אם המדיניות מוגדרת, שיעורי HAL עם רמה מקסימלית נמוכה יותר גרסת היעד של FCM במניפסט של המסגרת מושבתת.
manifest.hal.override
אופציונלי. הערך יכול להיות אחד מהערכים הבאים:
  • true: שינוי רכיבי <hal> אחרים עם ונותנים את אותה גרסה <name> וגרסה ראשית. אם לא <version> או <fqname> נמצאים בזה הרכיב <hal>, ולאחר מכן הרכיב <hal> הצהרה על השבתת ה-HAL הזה.
  • false: לא לבטל רכיבי <hal> אחרים עם אותן <name> והגרסה הראשית.
manifest.hal.name
חובה. שם חבילה שמוגדר במלואו של HAL. אפשר להשתמש במספר רשומות HAL אותו שם. למשל:
  • android.hardware.camera (HIDL או AIDL HAL)
  • GLES (HAL מקורי, נדרש שם בלבד)
manifest.hal.transport
חובה כאשר manifest.hal.format == "hidl". לא יכול להיות קיים אחרת. מציין באיזו העברה נעשה שימוש בממשק של החבילה הזו נשאלת במנהל השירות. הערך יכול להיות אחד מהערכים הבאים:
  • hwbinder: מצב משני
  • passthrough: מצב העברה
אופציונלי כאשר manifest.hal.format == "aidl". לא יכול להיות קיים אחרת. קובעת באיזו העברה נעשה שימוש כשמוצג ממשק מרחוק. הערך חייב להיות:
  • inet: שקע פנימי
manifest.hal.transport.ip וגם manifest.hal.transport.port כדי לציין פרטי חיבור נוספים ב-Inet.
manifest.hal.transport.arch
חובה עבור passthrough ולא ניתן לכלול אותה עבור hwbinder. תיאור הביטים של שירות המעבר שניתנו. הערך יכול להיות אחד מהערכים הבאים:
  • 32: מצב 32 ביט
  • 64: מצב 64 ביט
  • 32+64: גם וגם
manifest.hal.transport.ip
חובה עבור inet ואין להציג אותה אחרת. מתאר את כתובת ה-IP שממנו מוצג הממשק המרוחק.
manifest.hal.transport.port
חובה עבור inet ואין להציג אותה אחרת. מתאר את היציאה מ- שבו מוצג הממשק המרוחק.
manifest.hal.version
אופציונלי, אפשר לחזור על הפעולה. גרסה של התגים hal ב .

בשביל HIDL ו-HALs מקוריים, הפורמט הוא MAJOR.MINOR. עבור דוגמאות: hardware/interfaces, vendor/${VENDOR}/interfaces, frameworks/hardware/interfaces, או system/hardware/interfaces

ב-HIDL וב-HALs מקוריים מותר להשתמש בכמה שדות של גרסאות, כל עוד הם מייצגים גרסאות ראשיות ייחודיות, עם גרסה משנית אחת בלבד לכל ראשי שסופקה. לדוגמה, העמודות 3.1 ו-3.2 לא יכולות להתקיים בו-זמנית, אבל הסטטוסים 1.0 ו-3.4 יכולים להופיע בו-זמנית. הכלל הזה חל על כל רכיבי hal שיש להם אותו שם, אלא אם override="true". הערכים של <version> הם לא משויך אל <fqname> כי <fqname> כוללת גרסה.

ל-AIDL HAL, לא ניתן לכלול את <version> במכשירים שפועלים Android מגרסה 11 ומטה. <version> חייב להיות מספר שלם יחיד במכשירים עם Android מגרסה 12 ואילך. לכל היותר צריך להיות <version> אחד טמפל (package, interface, instance). אם הוא לא נמצא, ברירת המחדל היא 1 הערך של <version> משויך אל כל <fqname> באותו <hal> כי ל-<fqname> אין גרסה.
manifest.hal.interface
חובה, אפשר לחזור על הפעולה ללא כפילויות. לציין ממשק חבילה שיש לה שם של מכונה. יכולים להיות כמה רכיבי <interface> ב-<hal>; שמות חייב להיות ייחודי.
manifest.hal.interface.name
חובה. שם הממשק.
manifest.hal.interface.instance
חובה, אפשר לחזור על הפעולה. שם המופע של הממשק. יכול להיות כמה פעמים מופעים של ממשק אבל ללא כפילויות של <instance> רכיבים.
manifest.hal.fqname
אופציונלי, אפשר לחזור על הפעולה. דרך חלופית לציין מופע ל-HAL בשם manifest.hal.name.
  • עבור HIDL HAL, הפורמט הוא @MAJOR.MINOR::INTERFACE/INSTANCE
  • ב-AIDL HALs, הפורמט הוא INTERFACE/INSTANCE
manifest.sepolicy
חובה. יש בו את כל הרשומות שקשורות למדיניות.
manifest.sepolicy.version
חובה למניפסט של המכשיר. מצהירה על גרסת SELinux. כולל את פורמט SDK_INT.PLAT_INT.
manifest.vendor-ndk
חובה, אפשר לחזור על הפעולה; שנדרשת למניפסט של ה-framework. לא מופיע במניפסט של המכשיר. חייבים להיות כמה רשומות של <vendor-ndk> <version> שונים. תיאור קבוצה של תמונות מצב VNDK שסופקו על ידי המסגרת.
manifest.vendor-ndk.version
חובה. זהו מספר שלם חיובי שמייצג את הגרסה של ה-VNDK קובץ snapshot.
manifest.vendor-ndk.library
אופציונלי, אפשר לחזור על עצמן ללא כפילויות. תיאור קבוצה של ספריות VNDK סופקו על ידי ה-framework עבור תמונת המצב של הספק VNDK הזה. הערך הוא של ספרייה, למשל libjpeg.so, כולל הקידומת lib והסיומת .so. אין רכיבי נתיב .
manifest.system-sdk.version
אופציונלי, אפשר לחזור על כך, ללא כפילויות; משמש רק את ה-framework . מיועד לתיאור קבוצה של גרסאות SDK של מערכת שמסופקות על ידי ה-framework כדי אפליקציות של ספקים.
manifest.kernel
אופציונלי. מתאר מידע סטטי על הליבה.
manifest.kernel.target-level
אופציונלי. מתאר את הסתעפות הליבה. ערך ברירת המחדל הוא manifest.target-level אם הוא לא קיים. חייב להיות גדול מ- או שווה ל-manifest.target-level. צפייה כללים להתאמה של ליבה (kernel) לקבלת פרטים.