اجرای پویا خدمات AIDL

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