एआईडीएल सेवाएं डाइनैमिक तरीके से चलाएं

Android 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 Language के लिए Readme देखें.

उदाहरण:

कोई सेवा रजिस्टर करना

हर सेवा को 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 से पहले कॉल किया जाना चाहिए.

उदाहरण: apexservice