כדי לוודא שרכיבי חומרה ותוכנה (כמו תצוגה, אודיו ואינטראקציה קולית) מופעלים ומושבתים באופן סלקטיבי לפי הצורך, מערכת AAOS מספקת מדיניות צריכת חשמל, שמורכבת ממערך של מצבי הפעלה והשבתה צפויים לרכיבי חומרה ותוכנה. VHAL, או שירותי ספקים עם הרשאות מערכת, יכולים להחיל מדיניות חדשה בנושא צריכת חשמל כשמצב צריכת החשמל של Android משתנה או כשמתקיימים התנאים שהם ממתינים להם.
החלת מדיניות ניהול צריכת חשמל מותרת במצבים Wait for VHAL ו-On (לפעמים עם הגבלות מסוימות). במצב Shutdown Prepare, פועל מצב Garage Mode ואסור להפריע לו בשינוי מצב ההפעלה. אי אפשר להחיל מדיניות רגילה לניהול צריכת הסוללה, אבל מדיניות מיוחדת לניהול צריכת הסוללה, שהיא מדיניות המערכת לניהול צריכת הסוללה שנקראת no user interaction, מוחלת ב-Shutdown Prepare.
מצב צריכת החשמל ב-AAOS
מכשירי AAOS פועלים לפי דיאגרמת מצבי ההפעלה הזו:

איור 1. תרשים של מצב הטעינה ב-AAOS.
בהמשך מפורט כל מצב הפעלה:
| ערך | תיאור |
|---|---|
| כבוי |
|
| המתנה ל-VHAL |
|
| מופעל |
|
| הכנות להפסקת השימוש |
|
| המתנה לסיום של VHAL |
|
| השעיה ל-RAM (STR) |
|
| השהיה לדיסק (STD) |
|
איך מוגדרת מדיניות צריכת החשמל?
מיישמים מגדירים מדיניות צריכת חשמל ב-/vendor/etc/automotive/power_policy.xml,
שכוללת:
- הגדרת מדיניות צריכת החשמל.
- ההגדרה מגדירה קבוצות של מדיניות בנושא צריכת חשמל, שכוללות את מדיניות ברירת המחדל בנושא צריכת חשמל ומוחלות באופן אוטומטי כשמתרחשים מעברים במצב צריכת החשמל.
- מבטלת את מדיניות אספקת החשמל למערכת.
מדיניות צריכת החשמל
מדיניות צריכת החשמל מורכבת מקבוצה של מצבי צריכת חשמל צפויים של רכיבי חומרה ותוכנה. AAOS תומך ברכיבים הבאים במדיניות צריכת החשמל:
|
אודיו מדיה תצוגה 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>
קבוצת מדיניות בנושא צריכת חשמל
קבוצת מדיניות צריכת החשמל מציינת את מדיניות צריכת החשמל שמוגדרת כברירת מחדל, שתחול באופן אוטומטי במעברים בין מצבי צריכת חשמל. ספקים יכולים להגדיר את מדיניות ברירת המחדל לניהול צריכת החשמל עבור Wait For VHAL, On ו-Wait for VHAL Finish (Deep Sleep Entry או Shutdown Start).
כללי מדיניות בנושא אספקת חשמל למערכת
ב-AAOS יש תמיכה בשני כללי מדיניות של מערכת ההפעלה בנושא צריכת חשמל: no user interaction ו-suspend prep. מדיניות ניהול צריכת החשמל של המערכת מופעלת כשהמכשיר עובר למצב שקט, למצב מוסך, למצב השעיה ל-RAM או למצב השעיה לדיסק.
בטבלאות הבאות מפורט אופן הפעולה של כל רכיב במדיניות ניהול צריכת החשמל של המערכת.
מפתחים יכולים לבטל את ההגדרה של זיהוי Bluetooth, NFC ומכשירים מהימנים במדיניות ניהול צריכת החשמל של המערכת ללא אינטראקציה מצד המשתמש. השינויים חלים ב-/vendor/etc/power_policy.xml.
ללא אינטראקציה של משתמש
אופן הפעולה של מדיניות ניהול צריכת החשמל של המערכת no user interaction מוגדר בטבלה הזו:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה |
|---|---|---|
| אודיו | כבוי | לא |
| מדיה | כבוי | לא |
| תצוגה | כבוי | לא |
| Bluetooth | כבוי | כן |
| Wi-Fi | מופעל | לא |
| רשת סלולרית | מופעל | לא |
| אתרנט | מופעל | לא |
| תחזית | כבוי | לא |
| NFC | כבוי | כן |
| קלט | כבוי | לא |
| Assistant | כבוי | לא |
| אינטראקציה של משתמשים | כבוי | לא |
| זיהוי מכשירים מהימנים להתחברות משתמשים | מופעל | כן |
| מיקום | כבוי | לא |
| מיקרופון | כבוי | לא |
| CPU | מופעל | לא |
השעיית ההכנה
התנהגות המדיניות suspend prep בנושא ניהול צריכת החשמל של המערכת מוגדרת בטבלה הזו:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה על ידי יצרן ציוד מקורי (OEM) |
|---|---|---|
| אודיו | כבוי | לא |
| מדיה | לא רלוונטי | לא |
| תצוגה | לא רלוונטי | לא |
| Bluetooth | כבוי | לא |
| Wi-Fi | כבוי | לא |
| רשת סלולרית | לא רלוונטי | לא |
| אתרנט | לא רלוונטי | לא |
| תחזית | לא רלוונטי | לא |
| NFC | לא רלוונטי | לא |
| קלט | לא רלוונטי | לא |
| Assistant | לא רלוונטי | לא |
| אינטראקציה של משתמשים | לא רלוונטי | לא |
| זיהוי מכשירים מהימנים להתחברות משתמשים | לא רלוונטי | לא |
| מיקום | כבוי | לא |
| מיקרופון | כבוי | לא |
| CPU | כבוי | לא |
אינטראקציה עם VHAL
הדמון של מדיניות ההפעלה של הרכב שפועל בשכבת המערכת רשום לשני מאפיינים כדי להאזין לבקשות מ-VHAL:
-
POWER_POLICY_REQVHAL כותב את מזהה מדיניות המתח לנכס הזה. -
POWER_POLICY_GROUP_REQVHAL כותב את מזהה קבוצת מדיניות ניהול המתח למאפיין הזה.
מודולים אחרים מלבד VHAL יכולים לשנות את מדיניות ניהול צריכת הסוללה הנוכחית במערכת. במקרה כזה, דמון מדיניות צריכת החשמל של הרכב מעדכן את המאפיין CURRENT_POWER_POLICY כדי להודיע על השינוי ל-VHAL.
אינטראקציה עם תהליכי נייטיב
שירות ניהול צריכת החשמל ברכב (CPMS) מעביר את ניהול מדיניות צריכת החשמל אל דמון מדיניות צריכת החשמל ברכב. הדמון הוא המקור הקובע של מדיניות צריכת החשמל במערכת. הדמון של מדיניות המתח ברכב מנהל את מצב מדיניות המתח ומודיע ל-CPMS, ל-VHAL וללקוחות מקומיים אחרים על שינויים.
הדמון של מדיניות ההפעלה של הרכב מייצא ממשקי 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