במהדורה 8.0 של Android, הטיפול בפקודות 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 ו-Treble
הסקריפטים הספציפיים למכשיר init
שימשו כתחליף לשכבות HAL כדי לבצע פעולות USB ספציפיות למכשיר. USB (דרך ADB) הוא הממשק הראשי לניפוי באגים בבעיות מערכת. שימוש ב-daemon מקורי לביצוע הגדרת USB מבטל את התלות בקוד של המסגרת, כך שגם אם המסגרת קורסת, ה-USB אמור לפעול.
במסגרת המודל Treble, שהוצג גם ב-Android 8.0, כל ממשקי ה-HAL מבודדים משירותי המערכת ומוגדרים לפעול ב-daemons מקומיים משלהם. כך אין צורך ב-daemon USB בלעדי, כי שכבת ה-HAL משמשת גם כ-daemon USB.
הטמעת ברירת המחדל של HAL מטפלת בכל המכשירים שקדמו ל-Android 8.0. לכן, לא תהיה עבודה ספציפית למכשירים עם גרסת Android 8.0 ומטה. ב-Android 8.0 נעשה שימוש בממשק HAL כדי לבצע שאילתות לגבי הסטטוס של יציאות USB ולבצע החלפות של תפקידי נתונים ותפקידי מתח.
הטמעה
צריך להטמיע את ממשק ה-HAL החדש של USB בכל מכשיר שיושקו עם Android 8.0.
הטמעת ברירת המחדל אמורה לטפל במכשירים עם גרסת Android ישנה יותר מ-8.0. הטמעת ברירת המחדל מספיקה אם המכשיר משתמש בכיתה dual_role_usb
כדי לדווח על סטטוס היציאה מסוג C. יכול להיות שיהיה צורך בשינויים טריוויאליים בסקריפטים ספציפיים למכשיר USB כדי להעביר את הבעלות על הצמתים מסוג typc-c למערכת.