בגרסה Android 8.0, הטיפול בפקודות USB הועבר מסקריפטים ל-daemon מקורי של USB, כדי לשפר את ההגדרה ואת מהימנות הקוד.init במסגרת ההגדרה של פונקציית הגאדג'ט, נעשה שימוש בסקריפטים של init (טריגרים של מאפיינים) כדי לבצע פעולות של גאדג'טים שספציפיות למכשיר.
בגרסאות קודמות, ההגדרות הספציפיות למכשיר הושגו באמצעות סקריפטים ספציפיים למכשיר init (באמצעות טריגרים של מאפיינים). מעבר לעיצוב של שכבת הפשטה של חומרה (HAL) מוביל להטמעה נקייה יותר שפותרת את הבעיות האלה:
- יכול להיות שפעולות כמו כתיבה לצמתי sysfs של ליבת המערכת ייכשלו, אבל לא יועברו בחזרה לקוד של מסגרות העבודה שמגדיר את טריגר המאפיין. כתוצאה מכך, המערכות מניחות שהפעולות הצליחו למרות שהן נכשלו בלי להציג הודעה.
- לסקריפטים של
initיש מספר מוגבל של פעולות שאפשר לבצע.
בגרסה Android 12 נוספה תמיכה ב-USB Gadget HAL עבור Network Control Models (NCM) וקריאות ל-API שמחזירות גם את מספר גרסת ה-HAL וגם את מהירות ה-USB. מידע נוסף על הקריאות ל-API שזמינות דרך USB HAL מופיע בסיכום של חבילת android.hardware.usb.
HAL ו-Treble
הסקריפטים הספציפיים למכשיר init שימשו כתחליף לשכבות HAL כדי לבצע פעולות USB ספציפיות למכשיר. USB (באמצעות ADB) הוא ממשק עיקרי לניפוי באגים בבעיות במערכת. אם יש דמון מקומי לביצוע הגדרת USB, אין תלות בקוד של המסגרת, ולכן גם אם המסגרת קורסת, ה-USB אמור לפעול.
במסגרת מודל Treble שהוצג גם ב-Android 8.0, כל ה-HAL מבודדים משירותי המערכת וצריכים לפעול בדמונים המקוריים שלהם. כך לא נדרש דמון USB בלעדי, כי שכבת ה-HAL משמשת גם כדמון USB.
ההטמעה של HAL כברירת מחדל מטפלת בכל המכשירים עם גרסה ישנה יותר מ-Android 8.0. לכן, לא יהיו פעולות שספציפיות למכשירים עם גרסה ישנה יותר מ-Android 8.0. ב-Android 8.0 נעשה שימוש בממשק HAL כדי לבצע שאילתות על הסטטוס של יציאות USB, וכדי לבצע החלפות של תפקידי נתונים ותפקידי מתח.
הטמעה
צריך להטמיע ממשק HAL חדש של USB בכל מכשיר שמופעל ב-Android 8.0.
ההטמעה שמוגדרת כברירת מחדל אמורה לטפל במכשירים עם גרסה ישנה יותר מ-Android 8.0. ההטמעה שמוגדרת כברירת מחדל מספיקה אם המכשיר משתמש במחלקה dual_role_usb כדי לדווח על הסטטוס של יציאת Type-C. יכול להיות שיהיה צורך בשינויים קלים בסקריפטים של USB ספציפיים למכשיר כדי להעביר את הבעלות על הצמתים מסוג C למערכת.