एंड्रॉइड 11 में शुरू होकर, सिस्टम विभाजन में चलने वाली मूल एआईडीएल सेवाओं को आवश्यकतानुसार गतिशील रूप से शुरू और रोका जा सकता है। गतिशील सेवाएँ तब शुरू होती हैं जब उनका पहली बार अनुरोध किया जाता है और जब वे उपयोग में नहीं रह जाती हैं तो स्वचालित रूप से बंद हो जाती हैं।
सेवाएँ जो गतिशील रूप से चल सकती हैं
यह सुविधा केवल मूल सेवाओं के लिए उपलब्ध है जिनके जीवनचक्र को init
और servicemanager
द्वारा नियंत्रित किया जा सकता है। ऐप पैकेज के भीतर सेवाएँ समर्थित नहीं हैं और इसके बजाय बाध्य सेवाओं का उपयोग करना चाहिए।
डायनेमिक शटडाउन उस प्रक्रिया को बंद करके काम करता है जिसमें सेवा चलती है। यदि एक ही प्रक्रिया में कई सेवाएँ मौजूद हैं, तो उन सभी को इस सुविधा के साथ संगत होने के लिए गतिशील के रूप में पंजीकृत किया जाना चाहिए। जब सभी सेवाएँ अप्रयुक्त हो जाएँगी तो वह प्रक्रिया बंद हो जाएगी।
किसी सेवा की init .rc फ़ाइल को कॉन्फ़िगर करना
किसी सेवा को गतिशील रूप से चलाने के लिए, सेवा की init .rc
फ़ाइल में अग्रणी service <name> <cmd>
लाइन के बाद निम्नलिखित विकल्प जोड़ें।
interface aidl serviceName
disabled
oneshot
ये विकल्प निम्न कार्य करते हैं:
-
interface aidl serviceName
:servicemanager
सेवा ढूंढने की अनुमति देता है। यदि सेवा एकाधिक इंटरफ़ेस का उपयोग करती है, तो प्रत्येक इंटरफ़ेस को अपनी लाइन पर घोषित करें। ये नाम बिल्कुल वही होने चाहिए जोservicemanager
अपेक्षा करता है और प्रक्रिया नाम से भिन्न हो सकते हैं। -
disabled
: सेवा को बूट पर स्वचालित रूप से प्रारंभ होने से रोकता है। -
oneshot
: सेवा को हर बार बंद होने पर स्वचालित रूप से पुनरारंभ होने से रोकता है।
अधिक जानकारी के लिए, AOSP में Android Init भाषा रीडमी देखें।
उदाहरण:
किसी सेवा का पंजीकरण करना
प्रत्येक सेवा 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
के साथ संचार करता है।
उदाहरण:
एआईडीएल सेवा ग्राहकों को कॉन्फ़िगर करना
सेवा प्राप्त करना
किसी आलसी सेवा को पुनः प्राप्त करने के लिए, सेवा को प्रारंभ करना होगा और फिर पुनः प्राप्त करना होगा। सेवा प्रबंधक पर getService
कॉल करने से सेवा शुरू हो जाएगी, लेकिन आमतौर पर, आप सेवा उपलब्ध होते ही प्राप्त करना चाहते हैं, और waitForService
वेरिएंट का उपयोग किया जाना चाहिए। इनका उपयोग कैसे करें, इस पर बैकएंड-विशिष्ट दस्तावेज़ देखें।
सेवा जारी करना
डायनेमिक शटडाउन संदर्भ गणना पर आधारित है, इसलिए जब यह उपयोग में न हो तो ग्राहकों को सेवा को रोककर नहीं रखना चाहिए।
उदाहरण:
शटडाउन को अस्थायी रूप से अक्षम किया जा रहा है
यदि आप चाहते हैं कि कुछ कार्य पूरे होने तक कोई सेवा स्वतंत्र रूप से चले और फिर गतिशील व्यवहार पर स्विच हो जाए, तो आप गतिशील शटडाउन को चालू और बंद करने के लिए LazyServiceRegistrar::forcePersist
उपयोग कर सकते हैं। यदि इसे सर्वर साइड से कॉल किया जाता है, तो इसे registerService
पहले कॉल किया जाना चाहिए।
उदाहरण: एपेक्ससर्विस