एआईडीएल सेवाओं को गतिशील रूप से चलाना

एंड्रॉइड 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 पहले कॉल किया जाना चाहिए।

उदाहरण: एपेक्ससर्विस