כדי לוודא שרכיבי החומרה והתוכנה (כמו מסך, אודיו ואינטראקציה קולית) מופעלים ומושבתים באופן סלקטיבי לפי הצורך, מערכת AAOS מספקת מדיניות ניהול צריכת חשמל, שמורכבת ממערכת של מצבי הפעלה והשבתה צפויים לרכיבי חומרה ותוכנה. VHAL, או שירותי ספקים עם הרשאות מערכת, יכולים להחיל מדיניות חדשה בנושא צריכת חשמל כשמצב צריכת החשמל של Android משתנה או כשהתנאים שהם ממתינים להם מתקיימים.
אפשר להחיל מדיניות ניהול צריכת חשמל במצבים Wait for VHAL, On ו-Pre Shutdown Prepare (לפעמים עם הגבלות מסוימות). בניגוד ל-Wait for VHAL ול-On, אי אפשר להגדיר מדיניות ברירת מחדל להפעלה עבור Pre Shutdown Prepare בקבוצת מדיניות להפעלה. במהלך השלב המרכזי של הכנת הכיבוי, מצב חנייה פועל ואסור להפריע לו על ידי שינוי מצב ההפעלה. אמנם אי אפשר להחיל מדיניות רגילה לניהול צריכת הסוללה, אבל מדיניות מיוחדת לניהול צריכת הסוללה, שהיא מדיניות המערכת לניהול צריכת הסוללה שנקראת no user interaction, מוחלת בשלב ההכנה של כיבוי הליבה.
מצב צריכת החשמל ב-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.
כללי מדיניות בנושא אספקת חשמל למערכת
ב-AAOS יש תמיכה בשני כללי מדיניות של מערכת ההפעלה בנושא צריכת חשמל: ללא אינטראקציה מצד המשתמש והכנה למצב השהיה. מדיניות ניהול צריכת החשמל של המערכת מופעלת כשהמכשיר עובר למצב שקט, למצב חנייה, למצב השעיה ל-RAM או למצב השעיה לדיסק.
בטבלאות הבאות מפורט אופן הפעולה של כל רכיב במדיניות ניהול צריכת החשמל של המערכת.
מפתחים יכולים לבטל את ההגדרה של Bluetooth, NFC וזיהוי מכשירים מהימנים במדיניות צריכת החשמל של המערכת ללא אינטראקציה מצד המשתמש. השינויים חלים ב-/vendor/etc/automotive/power_policy.xml.
ללא אינטראקציה של משתמש
ההתנהגות של מדיניות ניהול צריכת החשמל של המערכת no user interaction מוגדרת בטבלה הזו:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה |
|---|---|---|
| אודיו | כבוי | לא |
| מדיה | כבוי | לא |
| תצוגה | כבוי | לא |
| Bluetooth | כבוי | כן |
| Wi-Fi | מופעל | לא |
| רשת סלולרית | מופעל | לא |
| אתרנט | מופעל | לא |
| תחזית | כבוי | לא |
| NFC | כבוי | כן |
| קלט | כבוי | לא |
| Assistant | כבוי | לא |
| אינטראקציה של משתמש | כבוי | לא |
| זיהוי מכשירים מהימנים בכניסה של משתמשים | מופעל | כן |
| מיקום | כבוי | לא |
| מיקרופון | כבוי | לא |
| CPU | מופעל | לא |
השעיית ההכנה
התנהגות המערכת בהתאם למדיניות ניהול צריכת החשמל הכנה להשהיה מוגדרת בטבלה הזו:
| רכיבים | מצב צריכת החשמל | ניתן להגדרה על ידי יצרן ציוד מקורי (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