در Android 11 و نسخههای بالاتر، خدمات AIDL بومی که در پارتیشن سیستم اجرا میشوند میتوانند بهصورت پویا و درصورت نیاز شروع و متوقف شوند. سرویسهای پویا وقتی برای اولینبار درخواست میشوند شروع میشوند و وقتی دیگر استفاده نمیشوند بهطور خودکار متوقف میشوند.
سرویسهایی که میتوانند بهصورت پویا اجرا شوند
این ویژگی فقط برای سرویسهای بومی دردسترس است که چرخههای عمر آنها را میتوان با init و servicemanager کنترل کرد. سرویسهای درون بستههای برنامه پشتیبانی نمیشوند و باید بهجای آنها از سرویسهای محدودکننده استفاده شود.
خاموش کردن پویا با خاموش کردن فرایندی که سرویس در آن اجرا میشود کار میکند. اگر چندین سرویس در یک فرایند وجود داشته باشد، همه آنها باید بهعنوان پویا ثبت شوند تا با این ویژگی سازگار باشند. وقتی همه سرویسها استفاده نشوند، آن فرایند خاموش خواهد شد.
پیکربندی فایل init .rc سرویس
برای اجرای پویا سرویس، گزینههای زیر را به فایل init
.rc سرویس پساز خط service <name> <cmd> پیشرو اضافه کنید.
interface aidl serviceName
disabled
oneshot
این گزینهها کارهای زیر را انجام میدهند:
-
interface aidl serviceName: بهservicemanagerاجازه میدهد سرویس را پیدا کند. اگر سرویس از چندین میانای استفاده میکند، هر میانایی را در خط جداگانهای اعلام کنید. این نامها باید دقیقاً همان چیزی باشد کهservicemanagerانتظار دارد و ممکن است با نام فرایند متفاوت باشد. disabled: مانع از شروع خودکار سرویس در زمان راهاندازی میشود.oneshot: از بازراهاندازی خودکار سرویس هر بار که متوقف میشود جلوگیری میکند.
برای اطلاعات بیشتر، فایل Readme زبان راهاندازی Android را در 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