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