פרוטוקול 'חיישנים מרובי-HAL' הוא מסגרת שמאפשרת לחיישן HAL לרוץ לצד ערכי HAL של חיישנים אחרים. באמצעות חיישן Multi-HAL נטען באופן דינמי חיישנים משניים של חיישנים מאוחסנים כספריות דינמיות במחיצת הספק ונותנים להן קריאה חוזרת אובייקט שיכול לטפל בפרסום אירועים, לקבל ולבטל את חסימת מצב השינה. רכיב משנה של חיישנים הוא HAL של חיישן שמובנה באובייקט משותף של ספק מסוים, והוא נמצא בשימוש של מסגרת multi-HAL. תהליכי המשנה האלה לא תלויים זה בזה או בקוד מרובה HAL שמכיל את הפונקציה הראשית לתהליך.
חיישנים Multi-HAL 2.1, זמינים במכשירים עם מערכת Android 11 ומעלה, הוא איטרציה של חיישנים Multi-HAL 2.0 שתומך בטעינת תתי-HALs לחשוף את זווית הציר סוג החיישן. כדי לתמוך בסוג החיישן הזה, רכיבי משנה של HAL צריכים להשתמש בממשקי Sub-HAL API מוגדר בתוך 2.1 כותרת SubHal.
למכשירים עם Android מגרסה 13 ומעלה שנעשה בהם שימוש אפשר להשתמש ב-Sensors AIDL HAL שכבת shim במספר HAL כדי לאפשר יכולת ריבוי HAL. לפרטים על ההטמעה: לראות שימוש בחיישנים מסוג Multi-HAL עם החיישנים AIDL HAL.
ההבדל בין חיישנים Multi-HAL 2 לחיישנים HAL 2
חיישנים Multi-HAL 2, זמינים במכשירים עם מערכת Android
10 ומעלה,
מציג כמה פשטות בנוסף לחיישן HAL של חיישנים
2 שיהיה לכם קל יותר
לאינטראקציה עם ממשקי API עם HAL. התכונה 'חיישנים Multi-HAL 2' מציגה
שרת ה-HalProxy
לטיפול בהטמעה של ממשק החיישנים HAL 2
V2_1/SubHal
(או
V2_0/SubHal
)
שמאפשר ל-HalProxy
לקיים אינטראקציה עם רכיבי משנה של HAL.
הממשק של ISensorsSubHal
שונה
2.1/ISensors.hal
(או
2.0/ISensors.hal
)
משתמש בדרכים הבאות:
- שיטת האתחול מעבירה
IHalProxyCallback
במקום שני FMQ ו-ISensorsCallback
. - רכיבי Sub-HAL חייבים להטמיע פונקציית ניפוי באגים לניפוי באגים מידע בדוחות איתור באגים.
- רכיבי Sub-HAL חייבים להטמיע פונקציית שם, כדי שאפשר יהיה לטעון את תת-ה-HAL להבדיל מ-HALs אחרים.
ההבדל העיקרי בין חיישנים Multi-HAL 2 לחיישנים HAL 2 הוא
לאתחל פונקציות. במקום לספק קטעי FMQ, IHalProxyCallback
הממשק מספק שתי שיטות – אחת לפרסום אירועי חיישנים בחיישנים
ושיטה אחת ליצירת חסימות מצב שינה. מתחת למכסה החיישנים,
פרוטוקול Multi-HAL מנהל את כל האינטראקציות עם ערוצי ה-FMQ כדי להבטיח אספקה מהירה של
אירועי חיישנים בכל תתי-HAL. מומלץ מאוד שכלי משנה ל-HAL ישתמשו
שיטה createScopedWakelock
להאציל את הנטל של תזמון חסימות מצב שינה אל
באמצעות החיישנים עם מולטי HAL, וניתן לרכז את השימוש בחסימות מצב שינה באמצעות התכונה 'נעילת מצב שינה' משותפת
לחיישן Multi-HAL כולו, שמצמצם שיחות נעילה וביטול נעילה.
לחיישן Multi-HAL 2 יש גם כמה תכונות בטיחות מובנות. הוא מטפל
מצבים שבהם החיישן FMQ מלא או מסגרת של חיישן Android
מופעלת מחדש וצריך לאפס את מצב החיישן. בנוסף, כשהאירועים
פורסמה בכיתה HalProxy
, אבל מסגרת החיישן לא יכולה לקבל
את האירועים באופן מיידי, באמצעות החיישנים Multi-HAL יש אפשרות להעביר את האירועים לרקע
כדי לאפשר לעבודה להמשיך בכל משימות המשנה במהלך המתנה
אירועים שיתפרסמו.
הטמעת קוד מקור והפניות
קוד מרובה HAL של כל החיישנים זמין
hardware/interfaces/sensors/common/default/2.X/multihal/
בהמשך מופיעות כמה קישורים למקורות מידע.
HalProxy.h
: האובייקטHalProxy
נוצר באמצעות חיישנים מרובי-HAL ומטפל העברת נתונים מתת-ה-HAL למסגרת החיישן.HalProxy.cpp
: ההטמעה שלHalProxy
כוללת את כל הלוגיקה שנדרשת כדי תקשורת Multiplex בין תת-HAL למסגרת החיישן.SubHal.h
: הממשקISensorsSubHal
מגדיר את הממשק שדפי משנה חייבים עוקבים כדי להתאים ל-HalProxy
. פרוטוקול המשנה HAL מיישם את מתחילה את ה-method כדי שיהיה אפשר להשתמש באובייקטHalProxyCallback
בשבילpostEvents
וגםcreateScopedWakelock
להטמעות של Multi-HAL 2.0, צריך להשתמש בגרסה 2.0 של
SubHal.h
hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: בדיקות היחידה האלה מאמתות את ההטמעה שלHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: בדוגמה הזו להטמעה של Sub-HAL נעשה שימוש בחיישנים מזויפים כדי ליצור . שימושי לבדיקת האינטראקציה של מספר תתי-פלטפורמות של HAL במכשיר.
הטמעה
בקטע הזה מתואר איך להטמיע חיישנים Multi-HAL בסעיפים הבאים מצבים:
- שימוש בחיישנים מסוג Multi-HAL עם החיישנים AIDL HAL
- הטמעת חיישנים Multi-HAL 2.1
- ניוד מחיישנים Multi-HAL 2.0 אל Multi-HAL 2.1
- ניוד מחיישנים HAL 2.0
- ניוד מחיישנים HAL 1.0
- ניוד מחיישנים Multi-HAL 1.0
שימוש בחיישנים עם מולטי HAL עם חיישנים AIDL HAL
כדי לאפשר יכולות מרובות HAL עם החיישנים AIDL HAL, צריך לייבא את הפונקציה AIDL מודול שכבת shim מרובה-HAL, שנמצא hardware/interfaces/sensors/aidl/default/multihal/. המודול מטפל בהמרה שבין חיישני AIDL להגדרת HAL של חיישני HAL ומגדיר wrapper במסגרת ממשק ריבוי HAL שמתואר הטמעת חיישנים Multi-HAL 2.1. מודל HAL מרובה AIDL שכבת ה-shim תואמת למכשירים שמוטמעים בהם חיישנים Multi-HAL 2.1.
שכבת AIDL Multi-HAL shim מאפשרת לחשוף את מכשיר המעקב אחר ראש
סוגי חיישנים של IMU עם ציר מוגבל בחיישנים AIDL HAL. כדי להשתמש בחיישנים האלה
שמוגדרים על ידי ממשק AIDL HAL, מגדירים את השדה type
מבני SensorInfo
בהטמעה של getSensorsList_2_1()
. זה בטוח
כי השדות של סוג החיישן עם גיבוי שלם של חיישני AIDL ו-HIDL
לא חופפות.
הטמעת חיישנים עם Multi-HAL 2.1
כדי להטמיע את החיישנים Multi-HAL 2.1 במכשיר חדש:
- הטמעת הממשק של
ISensorsSubHal
כפי שמתואר בSubHal.h
. - ליישם את
sensorsHalGetSubHal_2_1
ב-SubHal.h
. צריך להוסיף יעד
cc_library_shared
כדי ליצור את תת-ה-HAL החדש שהוטמע. כשמוסיפים את היעד:- מוודאים שהיעד נדחף למקום כלשהו בספק למחיצה של המכשיר.
- בקובץ התצורה שנמצא בכתובת
/vendor/etc/sensors/hals.conf
, להוסיף את הנתיב לספרייה בשורה חדשה. אם יש צורך, יוצרים את התחילית קובץhals.conf
.
לרשומת
Android.bp
לדוגמה עבור בניית ספריית משנה HAL, ראהhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
.יש להסיר את כל
android.hardware.sensors
הרשומות מmanifest.xml
שמכיל את רשימת ה-HALs הנתמכים במכשיר.הסרת כל שירות
android.hardware.sensors
ו-service.rc
קבצים מ- את הקובץdevice.mk
ומוסיפים אתandroid.hardware.sensors@2.1-service.multihal
ו-android.hardware.sensors@2.1-service.multihal.rc
עדPRODUCT_PACKAGES
.
בזמן האתחול, HalProxy
מתחיל, מחפש את תת-ה-HAL החדש שהוטמע,
מאתחל אותו באמצעות קריאה
sensorsHalGetSubHal_2_1
.
יציאה מחיישנים Multi-HAL 2.0 ל-Multi-HAL 2.1
כדי לצאת מגרסת Multi-HAL 2.0 ל-Multi-HAL 2.1, יש להטמיע את
SubHal
ולתכנת מחדש את ה-Sub-HAL.
אלה ההבדלים בין הממשק של SubHal
בגרסה 2.0 ובגרסה 2.1:
IHalProxyCallback
משתמש בסוגים שנוצרו ב גרסה 2.1 של המפרט שלISensors.hal
.- הפונקציה
initialize()
מעבירה ערךIHalProxyCallback
במקום זה מהממשק שלSubHal
2.0 - רכיבי Sub-HAL חייבים להטמיע את
getSensorsList_2_1
ואתinjectSensorData_2_1
במקום ב-getSensorsList
וב-injectSensorData
, כי השיטות האלה עושות שימוש הסוגים החדשים שנוספו בגרסה 2.1 של המפרטISensors.hal
. - רכיבי Sub-HAL חייבים לחשוף את
sensorsHalGetSubHal_2_1
במקוםsensorsHalGetSubHal
ל-Multi-HAL כדי להתייחס אליהם כמו לגרסה 2.1 תמיכה ב-HAL.
יציאה מחיישנים HAL 2.0
כשמשדרגים לחיישן Multi-HAL 2.0 מ-Sensors HAL 2.0, יש לוודא שתקן HAL שעומד בדרישות הבאות.
אתחול HAL
לחיישנים HAL 2.0 יש פונקציה אתחול שמאפשרת לשירות החיישן
העברת אותות FMQ וקריאה חוזרת (callback) של חיישן דינמי. ב-Sensors Multi-HAL 2.0,
הפונקציה initialize()
מעבירה קריאה חוזרת אחת (callback) שצריך להשתמש בה כדי לפרסם
אירועי חיישנים, קבלת חסימות מצב שינה, והתראה על חיבור חיישן דינמי
בזמן ניתוקים.
פרסום אירועים של חיישנים בהטמעת Multi-HAL
במקום לפרסם אירועי חיישנים דרך ה-FMQ, רכיב ה-Sub-HAL חייב לכתוב חיישן
אירועים
IHalProxyCallback
כשאירועי חיישנים זמינים.
אירועי WAKE_UP
בחיישן HAL 2.0, טכנולוגיית HAL יכולה לנהל את התכונה 'נעילת מצב שינה' לצורך הטמעה. לחשבון
באמצעות חיישנים Multi-HAL 2.0, תתי-ה-HAL מאפשרים להטמעה של Multi-HAL
לנהל חסימות מצב שינה ולבקש נעילת מצב שינה על ידי הפעלה
createScopedWakelock
יש לרכוש חסימת מצב שינה בהיקף נעול ולהעביר אותה אל postEvents
כאשר
פרסום אירועי יציאה ממצב שינה בהטמעה של Multi-HAL.
חיישנים דינמיים
לחיישנים Multi-HAL 2.0 נדרשת התאמה של onDynamicSensorsConnected
ושל
onDynamicSensorsDisconnected
אינץ'
IHalProxyCallback
מופעלות בכל פעם שחיבורי החיישנים הדינמיים משתנים. הקריאות החוזרות האלה
זמין כחלק מהסמן IHalProxyCallback
שמסופק
את הפונקציה initialize()
.
יציאה מחיישנים HAL 1.0
כשמשדרגים לחיישן Multi-HAL 2.0 מ-Sensors HAL 1.0, יש לוודא שתקן HAL שעומד בדרישות הבאות.
אתחול HAL
צריך לתמוך בפונקציה initialize()
כדי ליצור את הקריאה החוזרת (callback)
הטמעת Sub-HAL והטמעת Multi-HAL.
חשיפת חיישנים זמינים
בחיישן Multi-HAL 2.0, הפונקציה getSensorsList()
חייבת להחזיר את אותה
ערך במהלך הפעלה יחידה של מכשיר, גם בין חיישנים של HAL בהפעלה מחדש. כך אפשר
המסגרת בניסיון ליצור מחדש חיבורי חיישן, אם שרת המערכת
מופעלת מחדש. הערך שמוחזר על ידי getSensorsList()
יכול להשתנות אחרי שהמכשיר
מבצע הפעלה מחדש.
פרסום אירועים של חיישנים בהטמעת Multi-HAL
בגרסה HAL 2.0 של החיישנים, במקום להמתין לקריאת poll()
, אפשר לתת ל-Sub-HAL
חייבים לכתוב באופן יזום אירועי חיישנים
IHalProxyCallback
בכל פעם שאירועי חיישן זמינים.
אירועי WAKE_UP
בגרסה HAL 1.0 של החיישנים, טכנולוגיית HAL יכולה לנהל את התכונה 'נעילת מצב שינה' לצורך הטמעה. לחשבון
בעזרת חיישנים Multi-HAL 2.0, תת-הבית מאפשר הטמעת Multi-HAL
לנהל חסימות מצב שינה ולבקש נעילת מצב שינה על ידי הפעלה
createScopedWakelock
יש לרכוש חסימת מצב שינה בהיקף נעול ולהעביר אותה אל postEvents
כאשר
פרסום אירועי יציאה ממצב שינה בהטמעה של Multi-HAL.
חיישנים דינמיים
בחיישן HAL 1.0, החיישנים הדינמיים מוחזרים דרך הפונקציה poll()
.
לחיישנים Multi-HAL 2.0 נדרשת התאמה של onDynamicSensorsConnected
ושל
onDynamicSensorsDisconnected
אינץ'
IHalProxyCallback
מופעלות בכל פעם שחיבורי החיישנים הדינמיים משתנים. הקריאות החוזרות האלה
זמין כחלק מהסמן IHalProxyCallback
שמסופק
את הפונקציה initialize()
.
יציאה מחיישנים Multi-HAL 1.0
כדי לנייד הטמעה קיימת מ: Sensors Multi-HAL 1.0, יש לבצע את השלבים הבאים.
- צריך לוודא שהגדרת ה-HAL של החיישנים ממוקמת ב
/vendor/etc/sensors/hals.conf
יכול להיות שתצטרכו להעביר את הקובץ שנמצא/system/etc/sensors/hals.conf
. - צריך להסיר את כל ההפניות אל
hardware/hardware.h
וגםhardware/sensors.h
מכשירים כאלה לא נתמכים ב-HAL 2.0. - שקעי משנה של יציאות כפי שמתואר במאמר ניוד מחיישנים עם האלר 1.0.
- מגדירים את החיישנים Multi-HAL 2.0 כ-HAL הייעודי. לשם כך צריך לבצע את השלבים 3 ו 4 בסעיף הטמעת חיישנים Mutli-HAL 2.0.
אימות
הפעלת VTS
אם אתם משלבים תת-HAL אחד או יותר עם חיישנים Multi-Hal 2.1. להשתמש בחבילת הבדיקה של הספק (VTS) כדי לוודא שגרסת המשנה HAL שלכם וההטמעות עומדות בכל הדרישות שנקבעו בממשק HAL של החיישנים.
כדי להריץ רק את בדיקות VTS של החיישנים כשמגדירים VTS במכונה מארחת: מריצים את הפקודות הבאות:
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_0Target && \
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_1Target
אם מפעילים את שכבת AIDL Multi-HAL shim, מריצים את VtsAidlHalSensorsTargetTest
.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
הרצת בדיקות יחידה (unit testing)
היחידה שנבדקת בHalProxy_test.cpp
בודקת את HalProxy
באמצעות תתי-HAL מזויפים
נוצרים בבדיקת היחידה ולא נטענות באופן דינמי. כשיוצרים
בדיקות משנה חדשות
כדי לוודא שגרסת המשנה החדשה של ה-HAL הוטמעה כראוי.
כדי להריץ את הבדיקות, מריצים את הפקודות הבאות:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
בדיקה באמצעות תהליכי משנה מזויפים
דפי המשנה המזויפים הם יישומי דמה של הממשק של ISensorsSubHal
.
תתי-ה‐HAL חושפות רשימות שונות של חיישנים. כשהחיישנים מופעלים,
הם מפרסמים מדי פעם אירועי חיישנים שנוצרו באופן אוטומטי ב-HalProxy
מבוסס על המרווחים שמצוינים בבקשת חיישן נתונה.
אפשר להשתמש ב-Sub-HAL המזויפים כדי לבדוק איך קוד Multi-HAL המלא פועל עם תהליכי משנה אחרים שנטענות במערכת וכדי להדגיש היבטים שונים של קוד Multi-HAL מחיישנים.
שני תהליכי משנה מזויפים זמינים בכתובת
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
כדי ליצור ולדחוף הודעות משנה מזויפות למכשיר, מבצעים את השלבים הבאים:
מריצים את הפקודות הבאות כדי ליצור ולדחוף את שלושת הצורות המזויפות השונות השלמת פעולות משנה למכשיר:
$ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
mma
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
עדכון הגדרת HAL של החיישנים ב-
/vendor/etc/sensors/hals.conf
עם את הנתיבים של תוכניות המשנה המזויפות./vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
צריך להפעיל מחדש את
HalProxy
ולטעון את נושאי המשנה החדשים שמפורטים בהגדרה.adb shell stop
adb shell start
ניפוי באגים
מפתחים יכולים לנפות באגים ב-framework באמצעות הפקודה lshal
. כדי לבקש את
בפלט ניפוי הבאגים של אפליקציית החיישנים HAL, מריצים את הפקודה הבאה:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
לאחר מכן המידע על המצב הנוכחי של HalProxy
ו-HALs שלו
פלט לטרמינל. למטה תוכלו לראות דוגמה לפלט של הפקודה
אובייקט HalProxy
ומזהי משנה מזויפים.
Internal values:
Threads are running: true
Wakelock timeout start time: 200 ms ago
Wakelock timeout reset time: 73208 ms ago
Wakelock ref count: 0
# of events on pending write queue: 0
# of non-dynamic sensors across all subhals: 8
# of dynamic sensors across all subhals: 0
SubHals (2):
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
אם המספר שצוין בשדה # of events on pending write queue
הוא
מספר גדול (1000 או יותר),
זה מציין שיש אירועים רבים בהמתנה לכתיבה לחיישנים
. הדבר מציין ששירות החיישן נמצא בנעילה או שהוא קרס,
אינו מעבד אירועי חיישנים, או שקבוצה גדולה של אירועי חיישנים
פורסם לאחרונה מגרסת משנה של HAL.
אם מספר הסימוכין לחסימות מצב שינה גדול מ-0
, פירוש הדבר הוא של-HalProxy
בוצעה נעילה של מצב שינה. הערך צריך להיות גדול מ-0
רק אם ScopedWakelock
מתבצע במכוון, או אם אירועי התעוררות נשלחו אל HalProxy
לא עבר עיבוד על ידי מסגרת החיישן.
מתאר הקובץ שמועבר לשיטת ניפוי הבאגים של HalProxy
מועבר לכל אחד מהם
Sub-HAL, כך שמפתחים צריכים להטמיע את שיטת ניפוי הבאגים כחלק
ממשק ISensorsSubHal
.