מניפסטים

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

מניפסט מכשיר

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

  • מניפסט הספק מפרט HALs, גרסאות מדיניות SELinux וכו' המשותפות ל-SoC. מומלץ למקם בעץ המקור של אנדרואיד 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
  • המניפסט של הספק מפרט HALs ספציפיים למוצר במחיצת הספק. אובייקט 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 (מורשת, ללא שברים)

    ציין זאת:

    • במכשירים מדור קודם, נעשה שימוש במניפסט של ספק מדור קודם ובמניפסט ODM. המניפסט של ODM עשוי לעקוף לחלוטין את המניפסט של הספק מדור קודם.
    • במכשירים שהושקו עם אנדרואיד 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>

לפרטים נוספים, ראה פיתוח מניפסט התקן .

מניפסט מסגרת

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

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

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

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

<?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>

שברי מניפסט

באנדרואיד 10 ומעלה, אתה יכול לשייך ערך מניפסט למודול HAL במערכת הבנייה. זה מקל על הכללה מותנית של מודול HAL במערכת הבנייה.

דוגמא

בקובץ 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 , צור את המניפסט עבור מודול זה. בזמן הבנייה, המניפסט הזה מתווסף למכשיר. הוספת ערך כאן זהה להוספת ערך במניפסט הראשי של המכשיר. זה מאפשר ללקוחות להשתמש בממשק ומאפשר ל-VTS לזהות אילו יישומי HAL נמצאים במכשיר. כל דבר שמניפסט רגיל עושה, גם המניפסט הזה עושה.

הדוגמה להלן מיישמת את android.hardware.foo@1.0::IFoo/default , המותקן על vendor או במחיצת odm . אם הוא מותקן במחיצת system , product או system_ext , השתמש ב-type framework במקום ב-type 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>

סכימת קובץ מניפסט

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

?xml
אופציונאלי. מספק מידע רק למנתח XML.
manifest.version
נדרש. מטא-גרסה של מניפסט זה . מתאר את האלמנטים הצפויים במניפסט. לא קשור לגרסת XML.
manifest.type
נדרש. סוג המניפסט הזה. יש לו את device הערך עבור קובץ המניפסט של המכשיר ואת framework עבור קובץ המניפסט של המסגרת.
manifest.target-level
נדרש עבור מניפסט המכשיר. מציין את גרסת מטריצת תאימות המסגרת (FCM) שאליה מכוון מניפסט המכשיר הזה להיות תואם. זה נקרא גם גרסת המשלוח FCM של המכשיר.
manifest.hal
אופציונלי, יכול לחזור. HAL בודד (HIDL או מקורי, כגון GL), בהתאם לתכונת format .
manifest.hal.format
אופציונאלי. הערך יכול להיות אחד מ:
  • hidl : HIDL HALs. זוהי ברירת המחדל.
  • aidl : AIDL HALs . תקף רק במטא-גרסת מניפסט 2.0 ומעלה.
  • native : HALs ילידים.
manifest.hal.max-level
אופציונאלי. תקף רק על מניפסטים של מסגרת. אם מוגדר, HALs עם רמה מקסימלית נמוכה מגירסת היעד 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 : שקע 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 , framework/hardware/interfaces או system/hardware/interfaces .

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

עבור AIDL HALs, <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 .
  • עבור HALs HIDL, הפורמט הוא @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • עבור AIDL HALs, הפורמט הוא INTERFACE / INSTANCE .
manifest.sepolicy
נדרש. מכיל את כל הערכים הקשורים למדיניות.
manifest.sepolicy.version
נדרש עבור מניפסט המכשיר. מכריז על גרסת SELinux. יש לו את הפורמט SDK_INT . PLAT_INT .
manifest.vendor-ndk
נדרש, יכול לחזור; נדרש למניפסט המסגרת. לא חייב להיות נוכח במניפסט המכשיר. לכניסות <vendor-ndk> מרובות חייבות להיות <version> שונות. מתאר קבוצה של תמונות VNDK שסופקו על ידי המסגרת.
manifest.vendor-ndk.version
נדרש. זהו מספר שלם חיובי המייצג את הגרסה של תמונת המצב של VNDK.
manifest.vendor-ndk.library
אופציונלי, יכול לחזור, ללא כפילויות. מתאר קבוצה של ספריות VNDK שסופקה על ידי המסגרת עבור תמונת מצב זו של ספק VNDK. הערך הוא שם הקובץ של ספרייה, למשל libjpeg.so , כולל הקידומת lib והסיומת .so . אסור להשתמש ברכיבי נתיב.
manifest.system-sdk.version
אופציונלי, יכול לחזור, ללא כפילויות; בשימוש רק במניפסט המסגרת. מתאר קבוצה של גירסאות SDK של המערכת שסופקה על ידי המסגרת ליישומי ספקים.
manifest.kernel
אופציונאלי. מתאר מידע סטטי על הליבה.
manifest.kernel.target-level
אופציונאלי. מתאר את ענף הגרעין. ברירת המחדל של הערך שלו הוא manifest.target-level אם אינו קיים. חייב להיות גדול או שווה ל- manifest.target-level . ראה כללי התאמת ליבה לפרטים.