वीएसआईडीएल (व्हीकल सर्विसेज़ इंटरफ़ेस डेफ़िनिशन लैंग्वेज) मिडलवेयर, रस्ट लाइब्रेरी का एक सेट तय करता है. यह सेट, सॉफ़्टवेयर से तय होने वाले वाहन (एसडीवी) के कम्यूनिकेशन स्टैक पर एक ऐब्स्ट्रैक्शन लेयर बनाता है. इससे एसडीवी इकोसिस्टम का इस्तेमाल करना आसान हो जाता है. मिडलवेयर, सेवाओं के एक-दूसरे से कम्यूनिकेट करने और इंटरैक्ट करने का एक स्टैंडर्ड तरीका उपलब्ध कराता है. वीएसआईडीएलसी से जनरेट किया गया कोड और आपका कस्टम कोड, दोनों इन लाइब्रेरी का इस्तेमाल करते हैं.
वीएसआईडीएल कंपाइलर (वीएसआईडीएलसी), डेफ़िनिशन की पुष्टि करता है. साथ ही, बिल्ड प्रोसेस के दौरान रस्ट मिडलवेयर कोड जनरेट करने के लिए, genrule टारगेट वाली बिल्ड फ़ाइलें (Android.bp) जनरेट करता है. इसके अलावा, कैटलॉग में वीएसआईडीएल और प्रोटोबफ़ फ़ाइलों से डिप्लॉयमेंट कॉन्फ़िगरेशन बनाता है. पहली इमेज में, वीएसआईडीएलसी के लिए इनपुट और वीएसआईडीएलसी से जनरेट किया गया आउटपुट दिखाया गया है:
पहली इमेज. वीएसआईडीएलसी के इनपुट और आउटपुट.
यहां डायग्राम के बारे में बताया गया है:
इनपुट के तौर पर, आपको ये फ़ाइलें देनी होंगी. इन्हें कैटलॉग के तौर पर जानी जाने वाली डायरेक्ट्री में व्यवस्थित किया जाता है:
- प्रोटो फ़ाइलों (जिनका एक्सटेंशन
.protoहोता है) में डेटा स्ट्रक्चर होते हैं. इन्हें वीएसआईडीएल से तय की गई सर्विस यूनिट के बीच शेयर किया जाता है. - वीएसआईडीएल फ़ाइलों (जिनका एक्सटेंशन
.vsidlहोता है) में सर्विस बंडल, सर्विस यूनिट, और यूनिट टाइप के मालिकाना हक की जानकारी होती है. - हर कैटलॉग डायरेक्ट्री में मौजूद
Android.bpफ़ाइलें, कैटलॉग में मौजूद सभी प्रोटो फ़ाइलों के लिएrust_protobufबिल्ड टारगेट तय करती हैं. वीएसआईडीएलसी, रस्ट में जनरेट किए गए प्रोटोबफ़ मैसेज टाइप को रेफ़र करने के लिए, इन टारगेट में तय किए गएcrate_nameका इस्तेमाल करता है.
- प्रोटो फ़ाइलों (जिनका एक्सटेंशन
इन फ़ाइलों को आउटपुट करने के लिए, वीएसआईडीएलसी चलाएं:
Android.bpफ़ाइलें, हर सर्विस बंडल के फ़ोल्डर में जनरेट की जाती हैं. अगर आपने--genruleसेट किया है, तो ये टारगेट, बिल्ड प्रोसेस के दौरान अप-टू-डेट रस्ट फ़ाइलें जनरेट करते हैं. साथ ही, इनमें ज़रूरीrust_protobufलाइब्रेरी डिपेंडेंसी शामिल होती हैं.service_bundle.rsफ़ाइलें, हर सर्विस बंडल के लिए जनरेट की जाती हैं. इनमें मिडलवेयर कॉम्पोनेंट के साथ इंटरैक्ट करने के लिए, मुख्यstructऔर फ़ंक्शन शामिल होते हैं.lib.rsफ़ाइलें, बंडल के मालिकाना हक वाली हर आरपीसी सेवा के लिए जनरेट की जाती हैं. इन्हें आरपीसी सेवा के नाम वाले सबफ़ोल्डर में रखा जाता है. इन फ़ाइलों में ये शामिल हैं:Interfaceट्रेट, सर्वर-साइड लॉजिक को लागू करता है.Clientstruct, आरपीसी सेवा को कॉल करता है.अगर वीएसआईडीएल फ़ाइल में
diagnostics_declarationमौजूद है, तोdiagnostics.rsफ़ाइलें जनरेट की जाती हैं. इनमें यूडीएस पर आधारित डाइग्नोस्टिक्स के लिए ज़रूरी बाइंडिंग होती हैं.--apexफ़्लैग का इस्तेमाल करने पर, डिप्लॉयमेंट और सुरक्षा कॉन्फ़िगरेशन जनरेट किए जाते हैं. इन्हेंapex/औरconfigs/डायरेक्ट्री में रखा जाता है. इनमें ऑर्केस्ट्रेशन.textprotoफ़ाइलें और सेवा-से-सेवा कम्यूनिकेशन के लिए ज़रूरी सुरक्षा नीतियां (अनुमतियां) शामिल होती हैं.--servicesफ़्लैग का इस्तेमाल करने पर, सेवा बॉयलरप्लेट जनरेट किया जाता है. इसेservices/डायरेक्ट्री में रखा जाता है. इसमें रस्ट ऐप्लिकेशन स्केलेटन होता है. इसमेंmain.rsफ़ाइल भी शामिल होती है, ताकि आप अपनी प्रोसेस को तुरंत शुरू कर सकें.
वीएसआईडीएलसी चलाना
वीएसआईडीएलसी चलाने के लिए:
अगर आपने अपना एनवायरमेंट सेट अप नहीं किया है, तो
source build/envsetup.shचलाएं.वीएसआईडीएलसी बनाने के लिए, यह निर्देश चलाएं:
m vsidlcपक्का करें कि आपकी वीएसआईडीएल कैटलॉग डायरेक्ट्री में ज़रूरी बिल्ड, प्रोटोबफ़, और वीएसआईडीएल फ़ाइलें हों.
vsidlcकमांड चलाएं:vsidlc -c path_to_catalog -o output_directory -pयहां:
-c path_to_catalogमुख्य कैटलॉग डायरेक्ट्री का पाथ दिखाता है.-o output_directoryपैरंट डायरेक्ट्री दिखाता है जहांgenerated_rsआउटपुट डायरेक्ट्री बनाई जाती है.- (ज़रूरी नहीं)
--apex, ऑर्केस्ट्रेशन और सुरक्षा कॉन्फ़िगरेशन आर्टफ़ैक्ट जनरेट करता है. - (ज़रूरी नहीं)
--services, रस्ट ऐप्लिकेशन स्केलेटन जनरेट करता है, ताकि आप अपनी प्रोसेस को तुरंत शुरू कर सकें. - (ज़रूरी नहीं)
-p, नई फ़ाइलें जनरेट करने से पहले, जनरेट की गई मौजूदा डायरेक्ट्री (जैसे,generated_rs. साथ ही, अगर लागू हो, तोapex,configs, याservices) मिटा देता है. - (ज़रूरी नहीं)
--genrule, रस्ट कोड के बजायAndroid.bpgenrule जनरेट करता है.mचलाने पर, genrule ज़रूरी रस्ट कोड तुरंत जनरेट करते हैं, ताकि जनरेट किए गए आर्टफ़ैक्ट को वर्शन कंट्रोल में न रखा जाए.
generated_rsडायरेक्ट्री बनाई जाती है. इसमेंAndroid.bpऔर जनरेट की गई मिडलवेयर फ़ाइलें होती हैं. इस डायरेक्ट्री को, तय किए गए सर्विस बंडल के पूरी तरह क्वालिफ़ाइड नामों के हिसाब से सबडायरेक्ट्री में व्यवस्थित किया जाता है.
डिपेंडेंसी हैंडल करना
डिफ़ॉल्ट रूप से, वीएसआईडीएलसी सिर्फ़ मुख्य कैटलॉग के लिए कोड जनरेट करता है, न कि डिपेंडेंसी कैटलॉग के लिए. अगर आपके कैटलॉग में, दूसरे कैटलॉग में तय किए गए टाइप या सर्विस यूनिट का इस्तेमाल किया जाता है, तो -d फ़्लैग का इस्तेमाल करके, हर डिपेंडेंसी कैटलॉग का पाथ तय करें:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
आपको पूरे डिपेंडेंसी ग्राफ़ के लिए पाथ देने होंगे. इनमें ट्रांज़िटिव डिपेंडेंसी (डिपेंडेंसी की डिपेंडेंसी) भी शामिल हैं. उदाहरण के लिए, मान लें कि आपके पास कैटलॉग डिपेंडेंसी ट्री है:
दूसरी इमेज. वीएसआईडीएलसी डिपेंडेंसी ट्री का उदाहरण.
ट्री में मौजूद हर कैटलॉग के लिए मिडलवेयर जनरेट करने के लिए, आपको ये कमांड चलाने होंगे:
| टारगेट कैटलॉग | डिपेंडेंसी | कमांड |
|---|---|---|
| एसडीवी कोर कैटलॉग | लागू नहीं | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| डाइग्नोस्टिक्स कैटलॉग | एसडीवी कोर कैटलॉग | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| SOMEIP कैटलॉग | डाइग्नोस्टिक्स कैटलॉग, एसडीवी कोर कैटलॉग | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| ओईएम कैटलॉग | डाइग्नोस्टिक्स कैटलॉग, SOMEIP कैटलॉग, (ट्रांज़िटिव तौर पर) एसडीवी कोर कैटलॉग | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
रस्ट आउटपुट का फ़ॉर्मैट तय करना
डिफ़ॉल्ट रूप से, वीएसआईडीएल, रस्ट आउटपुट को फ़ॉर्मैट करने के लिए rustfmt का इस्तेमाल करता है. डिफ़ॉल्ट रूप से काम करने के लिए, $ANDROID_BUILD_TOP एनवायरमेंट वैरिएबल या RUSTFMT_PATH और RUSTFMT_TOML_PATH एनवायरमेंट वैरिएबल सेट करें. रस्ट के डिफ़ॉल्ट आउटपुट फ़ॉर्मैट को बदलने के लिए, --rust-formatter विकल्प के साथ pretty-please या none का इस्तेमाल करें:
आउटपुट फ़ॉर्मैट को
prettypleaseक्रेट में बदलने के लिए,pretty-pleaseवैल्यू का इस्तेमाल करें:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseआउटपुट फ़ॉर्मैट को 'कोई नहीं' में बदलने के लिए,
noneवैल्यू का इस्तेमाल करें:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
अगला कदम क्या है
मिडलवेयर जनरेट करने के बाद, कारोबारी नियम लागू करना लेख पढ़ें.