با شروع اندروید 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