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

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