ה-Sensors Multi-HAL הוא מסגרת המאפשרת לחיישנים HALs לפעול לצד HALs חיישנים אחרים. ה-Sensors Multi-HAL טוען באופן דינמי תתי-HAL של חיישנים המאוחסנים כספריות דינמיות על מחיצת הספק ונותן להם אובייקט התקשרות חוזר שיכול להתמודד עם פרסום אירועים ורכישה ושחרור של נעילת ההתעוררות. Sub-HAL חיישנים הוא HAL חיישנים המובנה באובייקט משותף על מחיצת הספק ומשמש את המסגרת הרב-HAL. תת-HALs אלו אינם תלויים זה בזה או בקוד הרב-HAL המכיל את הפונקציה העיקרית של התהליך.
חיישנים Multi-HAL 2.1, זמין במכשירים עם אנדרואיד 11 ומעלה, הוא איטרציה של חיישנים Multi-HAL 2.0 התומכים בטעינת תת-HAL שיכולים לחשוף את סוג חיישן זווית הציר . כדי לתמוך בסוג חיישן זה, תתי-HAL חייבים להשתמש בממשקי ה-API של תת-HAL המוגדרים בכותרת 2.1 SubHal .
עבור מכשירים המריצים אנדרואיד 13 ומעלה המשתמשים ב- Sensers AIDL HAL , ניתן להשתמש בשכבת ה-Multi-HAL shim כדי לאפשר יכולת Multi-HAL. לפרטי יישום, ראה שימוש בחיישנים Multi-HAL עם חיישנים AIDL HAL .
ההבדל בין חיישנים Multi-HAL 2 לחיישנים HAL 2
חיישנים Multi-HAL 2, זמין במכשירים עם אנדרואיד 10 ומעלה, מציג מספר הפשטות על גבי חיישני HAL 2 כדי להקל על האינטראקציה עם ממשקי API של HAL. חיישנים Multi-HAL 2 מציגה את מחלקת HalProxy לטיפול ביישום ממשק ה-SENSORS HAL 2 וממשק V2_1/SubHal
(או V2_0/SubHal
) כדי לאפשר HalProxy
אינטראקציה עם תת-HAL.
ממשק ISensorsSubHal
שונה מממשק 2.1/ISensors.hal
(או 2.0/ISensors.hal
) בדרכים הבאות:
- שיטת האתחול מעבירה מחלקה
IHalProxyCallback
במקום שני FMQs ו-ISensorsCallback
. - Sub-HALs חייבים ליישם פונקציית ניפוי באגים לאספקת מידע איתור באגים בדוחות באגים.
- Sub-HALs חייבים ליישם פונקציית שם כך שניתן יהיה להבחין בין Sub-HAL הטעון לבין תת-HALs אחרים.
ההבדל העיקרי בין חיישנים Multi-HAL 2 לחיישנים HAL 2 הוא בפונקציות האתחול. במקום לספק FMQs, ממשק IHalProxyCallback
מספק שתי שיטות, שיטה אחת לפרסום אירועי חיישנים למסגרת החיישנים ושיטה אחת ליצירת נעילות השכמה. מתחת למכסה המנוע, ה-Sensors Multi-HAL מנהל את כל האינטראקציות עם ה-FMQs כדי להבטיח אספקה בזמן של אירועי חיישנים עבור כל תת-HALs. מומלץ מאוד שתתי-HAL ישתמשו בשיטת createScopedWakelock
כדי להאציל את הנטל של זמן קצוב נעילות ערות ל-Sensors Multi-HAL ולרכז את השימוש ב-Wke Lock ל-Wke Lock משותף אחד עבור כל חיישני Multi-HAL, מה שממזער את הנעילה והפתיחה. שיחות.
חיישנים Multi-HAL 2 כוללים גם כמה תכונות בטיחות מובנות. הוא מטפל במצבים שבהם החיישן FMQ מלא או שבהם מסגרת החיישן של אנדרואיד מופעלת מחדש ויש לאפס את מצב החיישן. בנוסף, כאשר אירועים מתפרסמים במחלקה HalProxy
אך מסגרת החיישנים אינה מסוגלת לקבל את האירועים באופן מיידי, Multi-HAL של חיישנים יכול להעביר את האירועים לשרשור רקע כדי לאפשר המשך עבודה בכל תת-HAL בזמן ההמתנה לאירועים לפרסום.
יישום קוד מקור והפניה
קוד Multi-HAL של כל החיישנים זמין hardware/interfaces/sensors/common/default/2.X/multihal/
. להלן הנחיות לכמה משאבים.
-
HalProxy.h
: אובייקטHalProxy
מופעל על ידי חיישנים multi-HAL ומטפל בהעברת נתונים מתתי-HAL למסגרת החיישנים. -
HalProxy.cpp
: ההטמעה שלHalProxy
מכילה את כל ההיגיון הדרוש לריבוי תקשורת בין תת-HALs למסגרת החיישנים. SubHal.h
: ממשקISensorsSubHal
מגדיר את הממשק שעליו תתי-HAL לעקוב כדי להיות תואמים ל-HalProxy
. תת-HAL מיישם את שיטת האתחול כך שניתן להשתמש באובייקט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/
: יישום תת-HAL לדוגמה זה משתמש בחיישנים מזויפים כדי ליצור נתונים מזויפים. שימושי לבדיקת האופן שבו מספר תת-HALs מתקשרים במכשיר.
יישום
סעיף זה מתאר כיצד ליישם חיישנים 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
השתמש בחיישנים Multi-HAL עם חיישנים AIDL HAL
כדי לאפשר יכולת מולטי-HAL עם חיישני AIDL HAL, ייבא את מודול שכבת ה-shim AIDL Multi-HAL, שנמצא בחומרה/ממשקים/חיישנים/aidl/default/multihal/ . המודול מטפל בהמרה בין סוגי הגדרות AIDL ו-HIDL של חיישני HAL ומגדיר מעטפת סביב ממשק הרב-HAL המתואר ביישום חיישנים Multi-HAL 2.1 . שכבת ה-shim AIDL multi-HAL תואמת למכשירים המיישמים חיישנים Multi-HAL 2.1.
שכבת AIDL multi-HAL shim מאפשרת לך לחשוף את גשש הראש וסוגי חיישני IMU בעלי ציר מוגבל בסנסורים AIDL HAL. כדי להשתמש בסוגי חיישנים אלה המוגדרים על ידי ממשק AIDL HAL, הגדר את שדה type
במבנה SensorInfo
ביישום getSensorsList_2_1()
. זה בטוח מכיוון שהשדות מסוג חיישנים בעלי גיבוי מספרים שלמים של חיישני AIDL ו-HIDL HAL אינם חופפים.
יישום חיישנים 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 שלך.
אלו הם ההבדלים בין ממשקי 2.0 ו-2.1 SubHal
:
-
IHalProxyCallback
משתמש בסוגים שנוצרו בגרסה 2.1 של מפרטISensors.hal
. - הפונקציה
initialize()
מעבירהIHalProxyCallback
חדש במקום זה מממשק 2.0SubHal
- Sub-HALs חייבים ליישם
getSensorsList_2_1
ו-injectSensorData_2_1
במקוםgetSensorsList
ו-injectSensorData
שכן שיטות אלו משתמשות בסוגים החדשים שנוספו בגרסה 2.1 של מפרטISensors.hal
. - Sub-HALs חייבים לחשוף
sensorsHalGetSubHal_2_1
במקוםsensorsHalGetSubHal
כדי שה-Multi-HAL יתייחס אליהם כאל תת-HAL בגרסה 2.1.
יציאה מחיישנים HAL 2.0
בעת שדרוג ל-Sensers Multi-HAL 2.0 מ- Sensors HAL 2.0 , ודא שהטמעת HAL עומדת בדרישות הבאות.
אתחול ה-HAL
לחיישנים HAL 2.0 יש פונקציית אתחול המאפשרת לשירות החיישנים להעביר FMQs והתקשרות חיישן דינמית. ב-Sensers Multi-HAL 2.0, הפונקציה initialize()
מעבירה התקשרות חוזרת אחת שיש להשתמש בה כדי לפרסם אירועי חיישן, להשיג נעילות התעוררות ולהודיע על חיבור חיישן דינמי וניתוקים.
פרסם אירועי חיישן למימוש Multi-HAL
במקום לפרסם אירועי חיישן דרך ה-FMQ, תת-HAL חייב לכתוב אירועי חיישן ל- IHalProxyCallback
כאשר אירועי חיישן זמינים.
אירועי WAKE_UP
בסנסורים HAL 2.0, ה-HAL יכול לנהל את נעילת ההתעוררות לצורך יישומו. ב-Sensers Multi-HAL 2.0, תת-HALs מאפשרים למימוש Multi-HAL לנהל נעילות השכמה ויכולים לבקש רכישת נעילת ערה על ידי הפעלת createScopedWakelock
. יש לרכוש נעילת wake locked בהיקף נעול ולהעביר אותו ל- postEvents
בעת פרסום אירועי השכמה למימוש Multi-HAL.
חיישנים דינמיים
חיישנים Multi-HAL 2.0 דורשים כי onDynamicSensorsConnected
ו- onDynamicSensorsDisconnected
ב- IHalProxyCallback
ייקראו בכל פעם שחיבורי חיישנים דינמיים משתנים. התקשרויות אלו זמינות כחלק ממצביע IHalProxyCallback
המסופק באמצעות הפונקציה initialize()
.
יציאה מחיישנים HAL 1.0
בעת שדרוג ל-Sensers Multi-HAL 2.0 מ- Sensors HAL 1.0 , ודא שהטמעת HAL עומדת בדרישות הבאות.
אתחול ה-HAL
יש לתמוך בפונקציה initialize()
כדי ליצור את ההתקשרות בין תת-HAL ליישום Multi-HAL.
חשוף חיישנים זמינים
ב-Sensors Multi-HAL 2.0, הפונקציה getSensorsList()
חייבת להחזיר את אותו ערך במהלך אתחול של מכשיר בודד, אפילו על פני חיישני הפעלה מחדש של HAL. זה מאפשר למסגרת לנסות ליצור מחדש חיבורי חיישנים אם שרת המערכת יופעל מחדש. הערך המוחזר על ידי getSensorsList()
יכול להשתנות לאחר שהמכשיר מבצע אתחול מחדש.
פרסם אירועי חיישן למימוש Multi-HAL
בסנסורים HAL 2.0, במקום לחכות לקריאה של poll()
, תת-HAL חייב לכתוב באופן יזום אירועי חיישן ל- IHalProxyCallback
בכל פעם שאירועי חיישן זמינים.
אירועי WAKE_UP
בסנסורים HAL 1.0, ה-HAL יכול לנהל את נעילת ההתעוררות לצורך יישומו. ב-Sensors Multi-HAL 2.0, תת-HALs מאפשרים למימוש Multi-HAL לנהל נעילות ערה ויכולים לבקש רכישת נעילת ערה על ידי הפעלת createScopedWakelock
. יש לרכוש נעילת wake locked בהיקף נעול ולהעביר אותו ל- postEvents
בעת פרסום אירועי השכמה למימוש Multi-HAL.
חיישנים דינמיים
בסנסורים HAL 1.0, חיישנים דינמיים מוחזרים דרך הפונקציה poll()
. חיישנים Multi-HAL 2.0 דורשים כי onDynamicSensorsConnected
ו- onDynamicSensorsDisconnected
ב- IHalProxyCallback
ייקראו בכל פעם שחיבורי חיישנים דינמיים משתנים. התקשרויות אלו זמינות כחלק ממצביע IHalProxyCallback
המסופק באמצעות הפונקציה initialize()
.
יציאה מחיישנים Multi-HAL 1.0
כדי להעביר מימוש קיים מ- Sensers Multi-HAL 1.0 , בצע את השלבים הבאים.
- ודא שתצורת ה-HAL של החיישנים ממוקמת ב-
/vendor/etc/sensors/hals.conf.
זה עשוי להיות כרוך בהעברת הקובץ שנמצא ב-/system/etc/sensors/hals.conf
. - הסר כל הפניות ל-
hardware/hardware.h
ול-hardware/sensors.h
מכיוון שאלו אינם נתמכים עבור HAL 2.0. - תת-HAL של יציאות כמתואר ב- Porting from Sensors Hal 1.0 .
- הגדר את חיישנים Multi-HAL 2.0 כ-HAL המיועד על ידי ביצוע שלבים 3 ו-4 בסעיף יישום חיישנים Mutli-HAL 2.0 .
מַתַן תוֹקֵף
הפעל את VTS
כאשר שילבת תת-HAL אחד או יותר עם Sensors 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
אם אתה מפעיל את שכבת ה-shim של AIDL Multi-HAL, הפעל את VtsAidlHalSensorsTargetTest
.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
הפעל בדיקות יחידה
בדיקות היחידה ב- HalProxy_test.cpp
בודקות HalProxy
תוך שימוש בתתי-HAL מזויפים המופקים בבדיקת היחידה ואינם נטענים באופן דינמי. בעת יצירת תת-HAL חדש, בדיקות אלו צריכות לשמש מדריך כיצד להוסיף בדיקות יחידה המוודאות כי תת-HAL החדש מיושם כהלכה.
כדי להפעיל את הבדיקות, בצע את הפקודות הבאות:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
בדוק עם תתי-HAL מזויפים
תת-HALs המזויפים הם יישומי דמה של ממשק ISensorsSubHal
. תת-HALs חושפים רשימות שונות של חיישנים. כאשר החיישנים מופעלים, הם מפרסמים מעת לעת אירועי חיישן שנוצרו אוטומטית ל- HalProxy
בהתבסס על המרווחים שצוינו בבקשת חיישן נתונה.
ניתן להשתמש בתתי-HAL המזויפים כדי לבדוק כיצד פועל קוד ה-Multi-HAL המלא עם תתי-HAL אחרים הטעונים למערכת ולהדגיש היבטים שונים של קוד Multi-HAL של חיישנים.
שני תת-HAL מזויפים זמינים ב- hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
.
כדי לבנות ולדחוף את תת-HALs מזויפים למכשיר, בצע את השלבים הבאים:
הפעל את הפקודות הבאות כדי לבנות ולדחוף את שלושת תת-ה-HAL מזויפים השונים למכשיר:
$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
hals.conf עם הנתיבים של תת-HAL מזויפים./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
וטען את תת-ה-HALs החדשים הרשומים בתצורה.adb shell stop
adb shell start
איתור באגים
מפתחים יכולים לנפות באגים במסגרת באמצעות הפקודה lshal
. כדי לבקש את פלט ניפוי הבאגים של חיישנים HAL, הפעל את הפקודה הבאה:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
מידע על המצב הנוכחי של HalProxy
ותתי-ה-HAL שלו מופק לאחר מכן למסוף. להלן דוגמה לפלט הפקודה עבור אובייקט HalProxy
ותתי-HAL מזויפים.
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
מועבר לכל תת-HAL ולכן על המפתחים ליישם את שיטת ניפוי הבאגים כחלק מממשק ISensorsSubHal
.