डाइनैमिक तौर पर AIDL सेवाएं चलाना

Android 11 से, सिस्टम सेक्शन में चल रही नेटिव एआईडीएल सेवाओं को ज़रूरत के हिसाब से डाइनैमिक तौर पर शुरू और बंद किया जा सकता है. डाइनैमिक सेवाएं, पहली बार अनुरोध किए जाने पर शुरू होती हैं और इस्तेमाल में न होने पर अपने-आप बंद हो जाती हैं.

डाइनैमिक रूप से चल सकने वाली सेवाएं

यह सुविधा सिर्फ़ उन स्थानीय सेवाओं के लिए उपलब्ध है जिनकी लाइफ़साइकल init और servicemanager के ज़रिए कंट्रोल किया जाता है. ऐप्लिकेशन पैकेज में मौजूद सेवाओं का इस्तेमाल नहीं किया जा सकता. इसके बजाय, बाउंड सेवाओं का इस्तेमाल किया जाना चाहिए.

डाइनैमिक शटडाउन की सुविधा, उस प्रोसेस को शट डाउन कर देती है जिसमें सेवा काम करती है. अगर एक ही प्रक्रिया में कई सेवाएं मौजूद हैं, तो उन सभी को रजिस्टर करना ज़रूरी है डाइनैमिक है, ताकि इस सुविधा के साथ काम किया जा सके. इसके बाद, वह प्रोसेस बंद हो जाएगी जब सभी सेवाओं का इस्तेमाल न किया जा रहा हो.

किसी सेवा की init .rc फ़ाइल कॉन्फ़िगर करें

किसी सेवा को डाइनैमिक तरीके से चलाने के लिए, सेवा की शुरुआत में नीचे दिए गए विकल्प जोड़ें .rc फ़ाइल, आगे की service <name> <cmd> लाइन के बाद मौजूद है.

interface aidl serviceName
disabled
oneshot

इन विकल्पों से ये काम किए जा सकते हैं:

  • interface aidl serviceName: servicemanager को सेवा ढूंढने की अनुमति देता है. अगर कोई सेवा एक से ज़्यादा इंटरफ़ेस का इस्तेमाल करती है, तो हर इंटरफ़ेस का खुद एलान करना लाइन. ये नाम, servicemanager की उम्मीद के मुताबिक होने चाहिए. ये नाम, प्रोसेस के नाम से अलग हो सकते हैं.
  • disabled: चालू होने पर सेवा को अपने-आप शुरू होने से रोकता है.
  • oneshot: इस विकल्प को चुनने पर, सेवा को बंद करने पर वह अपने-आप फिर से शुरू नहीं होगी.

ज़्यादा जानकारी के लिए, 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 से पहले कॉल किया जाना चाहिए.

उदाहरण: apexservice