برای پشتیبانی از مدیریت توان مختص خودرو، اندروید سرویس CarPowerManagementService و رابط CarPowerManager را ارائه میدهد.
انتقال وضعیت توسط واحد کنترل اصلی خودرو (VMCU) آغاز میشود. برای برقراری ارتباط با VMCU، یکپارچهسازها باید چندین مؤلفه را پیادهسازی کنند. یکپارچهسازها مسئول ادغام با لایه انتزاعی سختافزار خودرو (VHAL) و پیادهسازی هسته هستند. یکپارچهسازها همچنین مسئول غیرفعال کردن منابع بیداری و اطمینان از عدم تعویق نامحدود خاموشیها هستند.
اصطلاحات
این اصطلاحات در سراسر این سند استفاده میشوند:
طراحی سیستم
این بخش توضیح میدهد که چگونه AAOS وضعیت توان پردازنده برنامه را نمایش میدهد و کدام ماژولها سیستم مدیریت توان را پیادهسازی میکنند. این مطلب همچنین نحوه همکاری این ماژولها و نحوه معمول انتقال حالتها را شرح میدهد.
دستگاه حالت قدرت خودرو
AAOS از یک ماشین وضعیت برای نمایش وضعیت توان AP استفاده میکند. این ماشین وضعیتها را مطابق شکل زیر ارائه میدهد:

شکل ۱. دستگاه حالت قدرت خودرو.
رایجترین گذارها با رنگ آبی مشخص شدهاند. اینها حالتها و گذارهای رایج هستند:
- اتصال به RAM. دستگاه و SoC خاموش هستند. هیچ کدی اجرا نمیشود. برق به SoC RAM وصل است.
- منتظر VHAL باشید. وقتی راننده با وسیله نقلیه تعامل میکند، مثلاً با باز کردن در، VMCU برق را به SoC اعمال میکند. AAOS از حالت تعلیق به RAM دوباره شروع به کار میکند و وارد حالت منتظر VHAL میشود، جایی که منتظر هماهنگی با VHAL است.
- روشن. VHAL به AAOS میگوید که وارد حالت روشن شود. در این حالت، AAOS کاملاً در حال اجرا و تعامل با درایور است.
- آمادهسازی برای خاموش کردن. وقتی راننده رانندگیاش تمام شد، VHAL به AAOS میگوید که وارد حالت آمادهسازی برای خاموش کردن شود. در این حالت، صفحه نمایش و صدا خاموش هستند و AAOS با راننده تعاملی ندارد. سیستم اندروید هنوز در حال اجرا است و میتواند برنامهها و سیستم اندروید را بهروزرسانی کند. وقتی بهروزرسانیها، در صورت وجود، تکمیل شدند، سیستم اندروید وارد حالت «منتظر پایان VHAL باشید» میشود.
- منتظر پایان VHAL باشید. در این مرحله، AAOS به VHAL اطلاع میدهد که آماده خاموش شدن است. انتظار میرود VMCU، SoC را در حالت خواب عمیق قرار دهد و برق را از پردازنده برنامه قطع کند. سپس AAOS در حالت تعلیق در RAM قرار میگیرد، اگرچه هیچ کدی اجرا نمیشود.
ماژولهای مدیریت توان
سیستم مدیریت انرژی از ماژولهای زیر تشکیل شده است:
| نام ماژول | توضیحات |
|---|---|
| مدیر قدرت خودرو | رابط برنامهنویسی کاربردی جاوا یا سیپلاسپلاس. |
| خدمات مدیریت توان خودرو | انتقال وضعیت مصرف برق را هماهنگ میکند و مدیریت سیاستهای مصرف برق را به CarPowerPolicyDaemon واگذار میکند. |
| دیمن سیاست قدرت خودرو | سیاستهای قدرت را مدیریت میکند و با مشتریان سیاستهای قدرت بومی ارتباط برقرار میکند. |
| خودرو HAL | رابط کاربری VMCU. |
| هسته | اجرای برنامه را به RAM یا دیسک متوقف کنید. |
ویژگی خواب عمیق/خواب زمستانی (معلق کردن اندروید به رم/دیسک) در هسته پیادهسازی شده است. این ویژگی به عنوان یک فایل ویژه واقع در /sys/power/state در فضای کاربر قرار دارد. AAOS با نوشتن mem یا disk در این فایل، به حالت تعلیق در میآید.
CPMS وضعیت برق را با سایر سرویسها و HALها هماهنگ میکند. CPMS ماشین وضعیت شرح داده شده در بالا را پیادهسازی میکند و هنگام وقوع تغییر وضعیت برق، اعلانهایی را برای هر ناظر ارسال میکند. این سرویس همچنین از VHAL برای ارسال پیام به سختافزار استفاده میکند.
CPPD منبع صحت سیاستهای مصرف برق است. این سیستم، سیاستهای مصرف برق را در طول چرخه عمر دستگاه مدیریت میکند و تغییرات سیاستهای مصرف برق را به CPMS، VHAL و سایر شنوندگان بومی اطلاع میدهد. CPMS درخواستهای تغییر سیاستهای مصرف برق را به CPPD واگذار میکند.
CPMS با خواندن و نوشتن ویژگیهای VHAL مربوط به وضعیت برق، مانند AP_POWER_STATE_REQ و AP_POWER_STATE_REPORT ، با VMCU ارتباط برقرار میکند. برنامهها میتوانند از رابط تعریفشده در CPM برای نظارت بر تغییرات وضعیت برق استفاده کنند. این رابط همچنین برنامهها را قادر میسازد تا شنوندههای سیاست برق را ثبت کنند. این API جاوا با @SystemApi و @hide حاشیهنویسی شده است و آن را فقط برای برنامههای دارای امتیاز در دسترس قرار میدهد. رابطه بین این ماژولها، برنامهها و سرویسها در زیر نشان داده شده است:

شکل ۲. نمودار مرجع اجزای قدرت.
توالی پیام
بخش قبلی ماژولهایی را که سیستم مدیریت انرژی را تشکیل میدهند، شرح داد. این بخش از مثالهای ورود به حالت خواب عمیق و خروج از حالت خواب عمیق برای توضیح نحوه ارتباط ماژولها و برنامهها استفاده میکند:
وارد خواب عمیق شوید
فقط VMCU میتواند حالت خواب عمیق را آغاز کند. به محض شروع خواب عمیق، VMCU از طریق VHAL یک اعلان به CPMS ارسال میکند. CPMS وضعیت را به SHUTDOWN PREPARE تغییر میدهد و این انتقال وضعیت را با فراخوانی متد onStateChanged() با یک شناسه وضعیت جدید ارائه شده توسط CPM، به همه ناظران (برنامهها و سرویسهایی که CPMS را نظارت میکنند) اعلام میکند.
CPM بین برنامهها/سرویسها و CPMS واسطهگری میکند. متد onStateChanged() برای برنامهها/سرویسها به صورت همزمان در متد onStateChanged() مربوط به CPM فراخوانی میشود. اکثر برنامهها و سرویسها قبل از بازگشت از این فراخوانی، ملزم به تکمیل آمادهسازی خود هستند. سرویسهای ممتاز مجازند پس از بازگشت برای PRE_SHUTDOWN_PREPARE ، SUSPEND_ENTER ، POST_SUSPEND_ENTER ، آمادهسازیهای خود را به صورت غیرهمزمان ادامه دهند. در این حالت، قرار است سرویس ممتاز پس از اتمام آمادهسازی، تابع complete() را روی شیء CompletablePowerStateChangeFuture ارائه شده فراخوانی کند. توجه داشته باشید که آمادهسازی غیرهمزمان برای SHUTDOWN_PREPARE مجاز نیست. قبل از اینکه DEEP_SLEEP_ENTRY به VHAL ارسال شود، CPMS به صورت دورهای درخواستهای تعویق خاموش کردن را به VHAL ارسال میکند.
وقتی همه اشیاء CPM آمادهسازیهای خاموشسازی را تکمیل کردند، CPMS AP_POWER_STATE_REPORT را به VHAL ارسال میکند که سپس به VMCU اطلاع میدهد که AP آماده تعلیق است. CPMS همچنین متد suspend خود را فراخوانی میکند که هسته را به حالت تعلیق در میآورد.
دنباله ای که در بالا توضیح داده شد در زیر نشان داده شده است:

شکل ۳. ورود به خواب عمیق.
رابطهای برنامهنویسی ارائه شده توسط CPM
این بخش، رابط برنامهنویسی کاربردی جاوا (Java API) ارائه شده توسط CPM برای برنامهها و سرویسهای سیستمی را شرح میدهد. این رابط برنامهنویسی کاربردی (API) نرمافزار سیستم را قادر میسازد تا:
- تغییرات وضعیت برق در نقطه دسترسی (AP) را زیر نظر داشته باشید.
- سیاستهای قدرت را اعمال کنید.
برای فراخوانی API های ارائه شده توسط CPM از این مراحل استفاده کنید:
- برای دریافت نمونه CPM، با API خودرو تماس بگیرید.
- متد مناسب را روی شیء ایجاد شده در مرحله 1 فراخوانی کنید.
یک شیء CarPowerManager ایجاد کنید
برای ایجاد یک شیء CPM، متد getCarManager() شیء Car را فراخوانی کنید. این متد یک facade است که برای ایجاد اشیاء CPM استفاده میشود. android.car.Car.POWER_SERVICE به عنوان آرگومان برای ایجاد یک شیء CPM مشخص کنید.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener و ثبت آن
برنامهها و سرویسهای سیستمی میتوانند با پیادهسازی CarPowerManager.CarPowerStateListener اعلانهای تغییر وضعیت برق را دریافت کنند. این رابط یک متد onStateChanged() تعریف میکند که یک تابع فراخوانی است که هنگام تغییر وضعیت برق CPMS فراخوانی میشود. مثال زیر یک کلاس ناشناس جدید را تعریف میکند که رابط را پیادهسازی میکند:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
برای اینکه به این شیء شنونده دستور دهید تا انتقال وضعیت برق را رصد کند، یک نخ اجرایی جدید ایجاد کنید و شنونده و این نخ را در شیء CPM ثبت کنید:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
وقتی وضعیت برق تغییر میکند، متد onStateChanged() از شیء شنونده با مقداری برای نمایش وضعیت برق جدید فراخوانی میشود. ارتباط بین مقدار واقعی و وضعیت برق در CarPowerManager تعریف شده و در جدول زیر نشان داده شده است:
| نام | توضیحات |
|---|---|
| وضعیت روشن | حالت روشن را وارد کنید. سیستم کاملاً عملیاتی است. |
| تعطیلی دولت لغو شد | خاموشی لغو شده و وضعیت برق به حالت عادی بازگردانده میشود. |
| ورود به حالت خاموش | انتظار میرود برنامهها پاکسازی شده و آمادهی خاموش شدن باشند. |
| وضعیت_پست_خاموش_کردن_ورود | آمادهسازیها برای خاموش کردن کامل شده و VMCU آماده خاموش شدن است. وارد حالت خاموش شدن شوید. |
| وضعیت_قبل_تعطیلی_آمادهسازی | فرآیند خاموش کردن درخواست میشود اما CPMS هنوز این فرآیند را شروع نمیکند. نمایشگر و صدا هنوز روشن هستند. |
| آمادهسازی برای تعطیلی دولت | حالت گاراژ ممکن است در طول دوره اجرا شود. |
| ورود_به_حالت_تعلیق | انتظار میرود برنامهها پاکسازی شده و برای تعلیق در RAM آماده باشند. |
| وضعیت_پست_تعلیق_ورود | آمادهسازیها برای تعلیق به RAM تکمیل شده و VMCU آماده تعلیق به RAM است. وارد حالت تعلیق شوید. |
| وضعیت_تعلیق_خروج | از حالت تعلیق بیدار شوید یا از حالت تعلیق لغو شده، از سر بگیرید. |
| حالت خواب زمستانی | انتظار میرود برنامهها پاکسازی شده و برای حالت خواب زمستانی آماده شوند. |
| وضعیت پست_های_خواب_آلودگی_ورود | آمادهسازی برای خواب زمستانی تکمیل شده و VMCU آماده خواب زمستانی است. وارد حالت خواب زمستانی شوید. |
| حالت خواب زمستانی_خروج | از حالت خواب زمستانی بیدار شوید یا از حالت خواب زمستانی لغو شده، دوباره شروع کنید. |
| منتظر بمانید تا وضعیت اضطراری اعلام شود | سیستم در حال راهاندازی است، اما قبل از رفتن به حالت روشن، منتظر برقراری ارتباط با VHAL است. |
لغو ثبت CarPowerStateListener
برای لغو ثبت تمام اشیاء شنونده ثبت شده در CPM، متد clearListener را فراخوانی کنید:
powerManager.clearListener();
ادغام سیستم در پیادهسازی اندروید شما
یکپارچهسازان مسئول موارد زیر هستند:
- پیادهسازی رابط هسته برای تعلیق اندروید.
- پیادهسازی توابع VHAL برای:
- شروع تعلیق یا خاموش شدن را از ماشین به اندروید منتقل کنید.
- پیام آماده خاموش شدن را از اندروید به خودرو ارسال کنید.
- خاموش کردن یا تعلیق اندروید را از طریق رابط هسته لینوکس آغاز کنید.
- مطمئن شوید که وقتی دستگاه در حالت تعلیق است، همه منابع بیداری غیرفعال باشند.
- مطمئن شوید که برنامهها به سرعت کافی خاموش میشوند تا فرآیند خاموش شدن دستگاه به طور نامحدود به تعویق نیفتد.
- مطمئن شوید که BSP اجزای دستگاه را طبق سیاست مصرف برق روشن (یا خاموش) میکند تا مانع از تعلیق یا خواب زمستانی نشود.
رابط هسته: /sys/power/state
AAOS زمانی یک دستگاه را در حالت تعلیق قرار میدهد که یک برنامه یا سرویس mem برای suspend-to-RAM یا disk برای suspend-to-disk در فایلی واقع در /sys/power/state مینویسد. مجتمعساز باید تابعی را فراهم کند که این فایل را رصد کند و لینوکس را در حالت تعلیق برق قرار دهد. این تابع ممکن است یک GPIO به VMCU ارسال کند تا به VMCU اطلاع دهد که دستگاه به طور کامل خاموش شده است. مجتمعساز همچنین مسئول حذف هرگونه شرایط رقابتی بین VHAL که پیام نهایی را به VMCU ارسال میکند و سیستم که به حالت تعلیق یا خاموش شدن میرود، است.
مسئولیت VHAL
VHAL رابطی بین شبکه خودرو و اندروید فراهم میکند. VHAL:
- شروع تعلیق یا خاموش شدن را از ماشین به اندروید منتقل میکند.
- پیام آماده خاموش شدن را از اندروید به خودرو ارسال میکند.
- خاموش کردن یا تعلیق اندروید را از طریق رابط هسته لینوکس آغاز میکند.
وقتی CPMS به VHAL اطلاع میدهد که آماده خاموش شدن است، VHAL پیام آماده خاموش شدن را به VMCU ارسال میکند. معمولاً لوازم جانبی روی تراشه مانند UART، SPI و USB این پیام را ارسال میکنند. پس از ارسال پیام، CPMS دستور هسته را برای تعلیق یا خاموش کردن دستگاه فراخوانی میکند. قبل از انجام این کار، VHAL یا BSP ممکن است یک GPIO را تغییر دهند تا به VMCU دستور دهد که قطع برق دستگاه ایمن است.
VHAL باید از ویژگیهای زیر که مدیریت توان را از طریق VHAL کنترل میکنند، پشتیبانی کند:
| نام | توضیحات |
|---|---|
| گزارش وضعیت قدرت AP | اندروید با استفاده از این ویژگی و با استفاده از مقادیر شمارشی VehicleApPowerStateReport، انتقال وضعیت را به VMCU گزارش میدهد. |
| AP_POWER_STATE_REQ | VMCU از این ویژگی برای دستور دادن به اندروید جهت انتقال به حالتهای مختلف مصرف انرژی، با استفاده از مقادیر شمارشی VehicleApPowerStateReq، استفاده میکند. |
گزارش وضعیت قدرت AP
از این ویژگی برای گزارش وضعیت فعلی مدیریت انرژی اندروید استفاده کنید. این ویژگی شامل دو عدد صحیح است:
-
int32Values[0]: VehicleApPowerStateReport شمارشی از وضعیت فعلی. -
int32Values[1]: زمان به میلی ثانیه برای به تعویق انداختن یا به خواب رفتن یا خاموش شدن. معنی این مقدار به مقدار اول بستگی دارد.
مقدار اول میتواند یکی از مقادیر زیر را بپذیرد. VehicleApPowerStateReport.aidl شامل توضیحات دقیقتری است که در hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle ذخیره میشوند.
| نام مقدار | توضیحات | مقدار دوم |
|---|---|---|
| منتظر_باشید_و_هال | AP در حال شروع به کار است و باید با VHAL ارتباط برقرار کند. | |
| ورود به خواب عمیق | اکسس پوینت در حال ورود به حالت خواب عمیق است. VMCU باید پس از زمان مشخص شده در مقدار دوم، اکسس پوینت را دوباره روشن کند. | باید تنظیم شود |
| خروج از خواب عمیق | AP در حال خروج از حالت خواب عمیق است. | |
| ورود به خواب زمستانی | اکسس پوینت در حال ورود به حالت خواب زمستانی است. VMCU باید پس از زمان مشخص شده در مقدار دوم، اکسس پوینت را دوباره روشن کند. | باید تنظیم شود |
| خروج از حالت خواب زمستانی | AP در حال خروج از حالت خواب زمستانی است. | |
| خاموش کردن_به تعویق انداختن | اندروید آماده خاموش شدن نیست. VMCU باید قبل از خاموش کردن AP، مدت زمان مشخص شده در مقدار دوم را صبر کند. اندروید ممکن است با صدور گزارشهای SHUTDOWN_POSTPONE اضافی، درخواست تعویق بیشتری کند. | باید تنظیم شود |
| آمادهسازی_خاموش کردن | اندروید در حال آماده شدن برای تعطیلی است. | باید تنظیم شود |
| شروع_خاموش کردن | اکسس پوینت آماده خاموش شدن است. VMCU باید پس از زمان مشخص شده در مقدار دوم، اکسس پوینت را دوباره روشن کند. (نیازی نیست که VMCU از ویژگی روشن شدن زمانبندی شده پشتیبانی کند.) | باید تنظیم شود |
| خاموشی_لغو شد | اندروید آماده شدن برای خاموش شدن را متوقف میکند و به حالت WAIT_FOR_VHAL میرود. | |
| روشن | اندروید به طور عادی کار میکند. |
این وضعیت میتواند به صورت خودکار یا در پاسخ به درخواستی از طریق VMCU تنظیم شود.
AP_POWER_STATE_REQ
این ویژگی توسط VMCU برای انتقال اندروید به حالت قدرت متفاوت ارسال میشود و شامل دو عدد صحیح است:
-
int32Values[0]: مقدار شمارشیVehicleApPowerStateReqکه نشان دهنده حالت جدیدی است که باید به آن منتقل شویم. -
int32Values[1]: مقدار شمارشیVehicleApPowerStateShutdownParam. این مقدار فقط برای پیامSHUTDOWN_PREPAREارسال میشود و گزینههای موجود در آن را به اندروید منتقل میکند.
اولین مقدار صحیح، حالت جدیدی را نشان میدهد که اندروید قرار است به آن منتقل شود. معانی آن در VehicleApPowerStateReq.aidl تعریف شده و در زیر ارائه شده است:
| نام مقدار | توضیحات |
|---|---|
| روشن | AP باید عملیات کامل خود را آغاز کند. |
| آمادهسازی_خاموش کردن | مقدار دوم نشان میدهد که آیا به AP اجازه داده میشود خاموش شدن را به تعویق بیندازد و آیا AP باید انتظار خاموش شدن یا ورود به خواب عمیق را داشته باشد یا خیر. |
| لغو_خاموش کردن | AP باید آماده شدن برای خاموش شدن را متوقف کند و برای روشن شدن آماده شود. |
| تمام شده | اکنون AP خاموش یا به حالت تعلیق در خواهد آمد. |
VehicleApPowerStateShutdownParam در VehicleApPowerStateShutdownParam.aidl تعریف شده است. این enum دارای این عناصر است:
| نام مقدار | توضیحات |
|---|---|
| میتوان خوابید | AP میتواند به جای خاموش شدن کامل، وارد خواب عمیق شود. به تعویق انداختن مجاز است. |
| خواب زمستانی (Hibernate) | AP میتواند به جای خاموش شدن کامل، وارد حالت خواب زمستانی شود. به تعویق انداختن مجاز است. |
| فقط خاموش کردن | AP باید خاموش شود. به تعویق انداختن مجاز است. خواب عمیق مجاز نیست. |
| فوراً بخوابید | AP ممکن است وارد خواب عمیق شود، اما باید فوراً بخوابد یا خاموش شود. به تعویق انداختن مجاز نیست. |
| خواب زمستانی فوری | اکسس پوینت میتواند وارد حالت تعلیق در دیسک شود، اما باید فوراً خاموش یا به خواب زمستانی برود. به تعویق انداختن مجاز نیست. |
| خاموشی_فوری | AP باید فوراً خاموش شود. به تعویق انداختن مجاز نیست. خواب عمیق مجاز نیست. |
منابع بیدار
یکپارچهساز باید منابع بیداری مناسب را هنگامی که دستگاه در حالت تعلیق است غیرفعال کند. منابع بیداری رایج شامل ضربان قلب، مودم، Wi-Fi و بلوتوث است. تنها منبع بیداری معتبر باید یک وقفه از VMCU برای بیدار کردن SoC باشد. این فرض میکند که VMCU میتواند به مودم برای رویدادهای بیداری از راه دور (مانند روشن شدن موتور از راه دور) گوش دهد. اگر این قابلیت به AP منتقل شود، باید منبع بیداری دیگری برای سرویسدهی به مودم اضافه شود.
برنامهها
تولیدکنندگان تجهیزات اصلی (OEM) باید مراقب باشند که برنامهها را طوری بنویسند که بتوان آنها را به سرعت خاموش کرد و این فرآیند را به طور نامحدود به تعویق نیندازند.
پیوست
دایرکتوریها در درخت کد منبع
| محتوا | دایرکتوری |
|---|---|
| کد مربوط به CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
| خدمات مدیریت توان خودرو و غیره. | packages/services/Car/service/src/com/android/car/power |
سرویسهایی که با VHAL سروکار دارند، مانند VehicleHal و HAlClient . | packages/services/Car/service/src/com/android/car/hal |
| تعاریف رابط و ویژگیهای VHAL. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
برنامه نمونه برای ارائه ایدهای در مورد CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
نمودار کلاس
این نمودار کلاس، کلاسها و رابطهای جاوا را در سیستم مدیریت برق نمایش میدهد:

شکل ۴. نمودار کلاس توان.
رابطه شیء
شکل ۵ نشان میدهد که کدام اشیاء به اشیاء دیگر ارجاع دارند. لبه به این معنی است که شیء منبع، ارجاعی به شیء هدف دارد. برای مثال، VehicleHAL ارجاعی به یک شیء PropertyHalService دارد.

شکل ۵. نمودار مرجع شیء.