با شروع اندروید 11، سرویسهای بومی AIDL که در پارتیشن سیستم اجرا میشوند، میتوانند در صورت نیاز به صورت پویا راهاندازی و متوقف شوند. سرویسهای پویا از اولین درخواست شروع میشوند و زمانی که دیگر استفاده نمیشوند بهطور خودکار متوقف میشوند.
خدماتی که می توانند به صورت پویا اجرا شوند
این ویژگی فقط برای سرویس های بومی که چرخه حیات آنها توسط init و servicemanager قابل کنترل است در دسترس است. سرویسهای درون بستههای برنامه پشتیبانی نمیشوند و به جای آن باید از سرویسهای محدود استفاده کنند.
خاموش شدن پویا با خاموش کردن فرآیندی که سرویس در آن اجرا می شود کار می کند. اگر چندین سرویس در یک فرآیند وجود داشته باشد، همه آنها باید به عنوان پویا ثبت شوند تا با این ویژگی سازگار باشند. سپس زمانی که همه سرویسها استفاده نشوند، این فرآیند خاموش میشود.
فایل init .rc یک سرویس را پیکربندی کنید
برای اجرای پویا یک سرویس، بعد از خط service <name> <cmd> ، گزینه های زیر را به فایل init .rc سرویس اضافه کنید.
interface aidl serviceName
disabled
oneshot
این گزینه ها کارهای زیر را انجام می دهند:
-
interface aidl serviceName: بهservicemanagerاجازه می دهد تا سرویس را پیدا کند. اگر سرویس از چندین رابط استفاده می کند، هر رابط را در خط خودش اعلام کنید. این نام ها باید دقیقاً همان چیزی باشد کهservicemanagerانتظار دارد و ممکن است با نام فرآیند متفاوت باشد. -
disabled: از شروع خودکار سرویس در هنگام بوت جلوگیری می کند. -
oneshot: از راه اندازی مجدد خودکار سرویس با هر بار توقف جلوگیری می کند.
برای اطلاعات بیشتر، به Android Init Language Readme در AOSP مراجعه کنید.
مثال ها:
ثبت خدمات
هر سرویس با servicemanager ایجاد و ثبت می شود. ثبت اغلب در فایلی به نام main.cpp انجام می شود، اما پیاده سازی می تواند متفاوت باشد. ثبت نام معمولاً چیزی شبیه به این است:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
گاهی اوقات ثبت توسط BinderService::publish یا BinderService::instantiate خلاصه می شود که کد بالا را فراخوانی می کند.
برای ثبت یک سرویس به عنوان پویا، کد ثبت آن را با کد زیر جایگزین کنید:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager با LazyServiceRegistrar ارتباط برقرار می کند تا سرویس ها را بر اساس تعداد مراجعشان خاموش کند.
مثال ها:
سرویس گیرندگان AIDL را پیکربندی کنید
سرویس را دریافت کنید
برای بازیابی سرویس تنبل، سرویس باید راه اندازی شود و سپس بازیابی شود. تماس گرفتن با getService در مدیر سرویس، سرویس را شروع میکند، اما معمولاً میخواهید سرویس را به محض در دسترس بودن دریافت کنید، و باید از انواع waitForService استفاده کنید. در مورد نحوه استفاده از آنها به مستندات خاص باطن مراجعه کنید.
سرویس را آزاد کنید
خاموش شدن پویا بر اساس شمارش مراجع است، بنابراین مشتریان نباید سرویس را زمانی که در حال استفاده نیست نگه دارند.
مثال ها:
خاموش کردن را به طور موقت غیرفعال کنید
اگر میخواهید یک سرویس بهطور مستقل اجرا شود تا زمانی که وظایف خاص کامل شوند و سپس به رفتار پویا تغییر دهید، میتوانید از LazyServiceRegistrar::forcePersist برای روشن و خاموش کردن خاموش شدن پویا استفاده کنید. اگر از سمت سرور فراخوانی شود، باید قبل از registerService فراخوانی شود.
مثال: apexservice