כדי לוודא שרכיבי חומרה ותוכנה (כמו תצוגה, אודיו ואינטראקציה קולית) מופעלים ומושבתים באופן סלקטיבי לפי הצורך, מערכת AAOS מספקת מדיניות צריכת חשמל, שמורכבת מקבוצה של מצבי הפעלה וכיבוי צפויים של רכיבי חומרה ותוכנה. VHAL, או שירותי ספקים עם הרשאות מערכת, יכולים להחיל מדיניות צריכת חשמל חדשה כשמצב צריכת החשמל של Android משתנה או כשהתנאים שהם מחכים להם מתקיימים.
אפשר להחיל מדיניות צריכת חשמל במצבים Wait for VHAL, On ו-Pre Shutdown Prepare (לפעמים עם הגבלות מסוימות). בניגוד ל-Wait for VHAL ו-On, אי אפשר להגדיר מדיניות צריכת חשמל שמוגדרת כברירת מחדל ל-Pre Shutdown Prepare בקבוצת מדיניות צריכת חשמל. בשלב הליבה של ההכנה לכיבוי, מצב מוסך פועל ואין להפריע לו על ידי שינוי מצב ההפעלה. למרות שלא ניתן להחיל מדיניות צריכת חשמל רגילה, מדיניות צריכת חשמל מיוחדת, שהיא מדיניות צריכת החשמל של המערכת שנקראת ללא אינטראקציה של המשתמש, מוחלת בשלב הליבה של הכנה לכיבוי.
מצב צריכת החשמל של AAOS
מכשירי AAOS פועלים לפי הדיאגרמה הבאה של מצב צריכת החשמל:
איור 1. תרשים מצב צריכת החשמל של AAOS.
הסבר על כל מצב צריכת חשמל:
| ערך | תיאור |
|---|---|
| כבוי |
|
| המתנה ל-VHAL |
|
| מופעל |
|
| הכנה לכיבוי |
|
| צריך להמתין עד שה-VHAL יסיים את הפעולה |
|
| השהיה ל-RAM (STR) |
|
| השהיה לדיסק (STD) |
|
איך מוגדרת מדיניות צריכת החשמל?
מיישמי המדיניות מגדירים את מדיניות צריכת החשמל ב-/vendor/etc/automotive/power_policy.xml,
שבה:
- הגדרת מדיניות צריכת החשמל.
- ההגדרה הזו מגדירה קבוצות של מדיניות צריכת חשמל, שכוללות את מדיניות ברירת המחדל של צריכת החשמל ומוחלות באופן אוטומטי כשמתרחשים מעברים בין מצבי צריכת חשמל.
- המדיניות הזו מבטלת את מדיניות צריכת החשמל של המערכת.
מדיניות צריכת החשמל
מדיניות צריכת החשמל מורכבת מקבוצה של מצבי צריכת חשמל צפויים של רכיבי חומרה ותוכנה. מערכת AAOS תומכת ברכיבים הבאים במדיניות צריכת החשמל:
|
AUDIO MEDIA DISPLAY BLUETOOTH |
WIFI CELLULAR ETHERNET PROJECTION |
NFC INPUT VOICE_INTERACTION VISUAL_INTERACTION |
TRUSTED_DEVICE_DETECTION LOCATION MICROPHONE CPU |
ספקים יכולים גם להגדיר רכיבי צריכת חשמל מותאמים אישית משלהם לשימוש עם מדיניות צריכת החשמל. מגדירים רכיבי חשמל בהתאמה אישית באותו קובץ XML שבו נמצאות מדיניות החשמל, כמו בדוגמה הזו:
<customComponents>CUSTOM_COMPONENT_1000 CUSTOM_COMPONENT_SPECIAL_SENSOR CUSTOM_COMPONENT_AUX_INPUT </customComponents>
קבוצת מדיניות צריכת החשמל
קבוצת מדיניות צריכת החשמל מציינת את מדיניות ברירת המחדל של צריכת החשמל שתחול באופן אוטומטי במעברים בין מצבי צריכת החשמל. הספקים יכולים להגדיר את מדיניות ברירת המחדל של צריכת החשמל למצבים "המתנה ל-VHAL" ו"מופעל".
מדיניות ברירת המחדל של צריכת החשמל במצב Wait for VHAL או On מופעלת בכל מעבר למצב הזה, כולל כשמבטלים את הכיבוי ו-Android חוזר למצב Wait for VHAL. אם לא מוגדרת מדיניות צריכת חשמל כברירת מחדל למצב מסוים בקבוצת המדיניות הנוכחית, ה-daemon של מדיניות צריכת החשמל ברכב מחיל מדיניות מובנית. יש חריג אחד: כשהמערכת נמצאת במצב שקט, ה-daemon של מדיניות צריכת החשמל ברכב שומר את מדיניות צריכת החשמל הרגילה הנוכחית או המבוקשת כממתינה, נועל את השינויים במדיניות צריכת החשמל הרגילה ומחיל את מדיניות צריכת החשמל של המערכת ללא אינטראקציה של המשתמש. כשמחילים מדיניות צריכת חשמל, רק הרכיבים שהמדיניות חלה עליהם משתנים, והרכיבים האחרים נשארים במצב הנוכחי שלהם.
כללי מדיניות בנושא צריכת החשמל של המערכת
ב-AAOS יש תמיכה בשתי כללי מדיניות של צריכת חשמל במערכת: ללא אינטראקציה מצד המשתמש והכנה להשעיה. מדיניות צריכת החשמל של המערכת חלה כשהמכשיר עובר למצב שקט, למצב מוסך, למצב השעיה ל-RAM או למצב השעיה לדיסק.
בטבלאות הבאות מפורטת ההתנהגות של כל רכיב במדיניות צריכת החשמל של המערכת.
מטמיעים יכולים לשנות את הגדרות הזיהוי של Bluetooth, NFC ומכשירים מהימנים במדיניות צריכת החשמל של המערכת ללא אינטראקציה מצד המשתמש. ההגדרות המבוטלות חלות ב-/vendor/etc/automotive/power_policy.xml.
בלי אינטראקציה של משתמשים
בטבלה הזו מוגדרת ההתנהגות של מדיניות צריכת החשמל של המערכת ללא אינטראקציה של המשתמש:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה |
|---|---|---|
| אודיו | כבוי | לא |
| מדיה | כבוי | לא |
| תצוגה | כבוי | לא |
| Bluetooth | כבוי | כן |
| Wi-Fi | מופעל | לא |
| רשת סלולרית | מופעל | לא |
| אתרנט | מופעל | לא |
| תחזית | כבוי | לא |
| NFC | כבוי | כן |
| קלט | כבוי | לא |
| Assistant | כבוי | לא |
| אינטראקציה של משתמשים | כבוי | לא |
| זיהוי מכשיר מהימן להתחברות של משתמשים | מופעל | כן |
| מיקום | כבוי | לא |
| מיקרופון | כבוי | לא |
| CPU | מופעל | לא |
הכנה להשעיה
ההתנהגות של מדיניות צריכת החשמל של המערכת הכנה להשעיה מוגדרת בטבלה הזו:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה על ידי יצרן הציוד המקורי (OEM) |
|---|---|---|
| אודיו | כבוי | לא |
| מדיה | לא רלוונטי | לא |
| תצוגה | לא רלוונטי | לא |
| Bluetooth | כבוי | לא |
| Wi-Fi | כבוי | לא |
| רשת סלולרית | לא רלוונטי | לא |
| אתרנט | לא רלוונטי | לא |
| תחזית | לא רלוונטי | לא |
| NFC | לא רלוונטי | לא |
| קלט | לא רלוונטי | לא |
| Assistant | לא רלוונטי | לא |
| אינטראקציה של משתמשים | לא רלוונטי | לא |
| זיהוי מכשיר מהימן להתחברות של משתמשים | לא רלוונטי | לא |
| מיקום | כבוי | לא |
| מיקרופון | כבוי | לא |
| CPU | כבוי | לא |
אינטראקציה עם ה-VHAL
הדמון של מדיניות צריכת החשמל של הרכב שפועל בשכבת המערכת, מנוי לשני מאפיינים כדי להאזין לבקשות מה-VHAL:
-
POWER_POLICY_REQה-VHAL כותב את מזהה מדיניות צריכת החשמל במאפיין הזה. -
POWER_POLICY_GROUP_REQה-VHAL כותב את מזהה הקבוצה של מדיניות צריכת החשמל במאפיין הזה.
מודולים אחרים, מלבד VHAL, יכולים לשנות את מדיניות צריכת החשמל הנוכחית במערכת. במקרה כזה, הדמון של מדיניות צריכת החשמל ברכב מעדכן את המאפיין CURRENT_POWER_POLICY כדי להודיע על השינוי ל-VHAL.
אינטראקציה עם תהליכים מקוריים
CarPowerManagementService (CPMS) מקצה את ניהול מדיניות צריכת החשמל לדמון של מדיניות צריכת החשמל ברכב. הדמון הוא המקור הקובע למדיניות צריכת החשמל במערכת. הדמון של מדיניות צריכת החשמל ברכב מנהל את מצב מדיניות צריכת החשמל ומודיע ל-CPMS, ל-VHAL וללקוחות מקוריים אחרים על שינויים.
ה-daemon של מדיניות צריכת החשמל ברכב מייצא ממשקי AIDL לשימוש על ידי HAL ותהליכים מקוריים אחרים. הם יכולים לקבל התראה כשמדיניות צריכת חשמל חדשה משתנה. במילים אחרות, מתי כל אחד מהם צריך לשנות את מצב צריכת החשמל שלו.
ICarPowerPolicyServer.aidl
package android.frameworks.automotive.powerpolicy;
import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
import android.frameworks.automotive.powerpolicy.PowerComponent;
/**
* ICarPowerPolicyServer is an interface implemented by the power policy daemon.
* VHAL changes the power policy and the power policy daemon notifies the change to
* registered subscribers. When subscribing to policy changes, a filter can be specified so
* that the registered callbacks can listen only to a specific power component's change.
*/
@VintfStability
interface ICarPowerPolicyServer {
/**
* Gets the current power policy.
* @throws IllegalStateException if the current policy is not set.
*/
CarPowerPolicy getCurrentPowerPolicy();
/**
* Gets whether the power component is turned on or off.
*
* @param componentId Power component ID defined in PowerComponent.aidl to check power
* state.
* @return True if the component's power state is on.
* @throws IllegalArgumentException if the componentId is invalid.
*/
boolean getPowerComponentState(in PowerComponent componentId);
/**
* Subscribes to power policy change.
* Notification is sent to the registered callback when the power policy changes and the
* power state of the components which the callback is interested in changes.
*
* @param callback Callback that is invoked when the power policy changes.
* @param filter The list of components which the callback is interested in.
* @throws IllegalArgumentException if the callback is already registered.
* @throws IllegalStateException if the callback is dead.
*/
void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
in CarPowerPolicyFilter filter);
/**
* Unsubscribes from power policy change.
*
* @param callback Callback that doesn't want to receive power policy change.
* @throws IllegalArgumentException if the callback is not registered.
*/
void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);
/**
* Applies the power policy.
*
* {@code policyId} should be one of power policy IDs defined in
* {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies.
*
* @param policyId ID of power policy.
* @throws IllegalArgumentException if {@code policyId} is invalid.
*/
void applyPowerPolicy(in @utf8InCpp String policyId);
/**
* Sets the current power policy group.
*
*
{@code policyGroupId} should be one of power policy group IDs defined in
* {@code /vendor/etc/automotive/power_policy.xml}.
*
* @param policyGroupId ID of power policy group.
* @throws IllegalArgumentException if {@code policyGroupId} is invalid.
*/
void setPowerPolicyGroup(in @utf8InCpp String policyGroupId);
}
ICarPowerPolicyChangeCallback.aidl
package android.frameworks.automotive.powerpolicy;
import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
/**
* ICarPowerPolicyChangeCallback is notified when a power policy changes.
*/
@VintfStability
oneway interface ICarPowerPolicyChangeCallback {
/**
* Called when a power policy is fully changed.
*
* @param policy The current policy.
*/
void onPolicyChanged(in CarPowerPolicy policy);
}
אינטראקציה עם מודולים של Java
ב-CarPowerManager יש שיטות להפעלת ניהול מדיניות צריכת החשמל:
- קבלת מדיניות החשמל הנוכחית
- החלת מדיניות צריכת חשמל חדשה
- הגדרת קבוצה חדשה של מדיניות צריכת חשמל
רק מודולים עם הרשאות מערכת יכולים להשתמש בשיטות. מודולים שרוצים לקבל עדכון כשמדיניות צריכת חשמל מופעלת יכולים לרשום מאזין לשינויים במדיניות צריכת החשמל ב-CarPowerManager