मिडलवेयर जनरेट करना

वीएसआईडीएल (व्हीकल सर्विसेज़ इंटरफ़ेस डेफ़िनिशन लैंग्वेज) मिडलवेयर, रस्ट लाइब्रेरी का एक सेट तय करता है. यह सेट, सॉफ़्टवेयर से तय होने वाले वाहन (एसडीवी) के कम्यूनिकेशन स्टैक पर एक ऐब्स्ट्रैक्शन लेयर बनाता है. इससे एसडीवी इकोसिस्टम का इस्तेमाल करना आसान हो जाता है. मिडलवेयर, सेवाओं के एक-दूसरे से कम्यूनिकेट करने और इंटरैक्ट करने का एक स्टैंडर्ड तरीका उपलब्ध कराता है. वीएसआईडीएलसी से जनरेट किया गया कोड और आपका कस्टम कोड, दोनों इन लाइब्रेरी का इस्तेमाल करते हैं.

वीएसआईडीएल कंपाइलर (वीएसआईडीएलसी), डेफ़िनिशन की पुष्टि करता है. साथ ही, बिल्ड प्रोसेस के दौरान रस्ट मिडलवेयर कोड जनरेट करने के लिए, genrule टारगेट वाली बिल्ड फ़ाइलें (Android.bp) जनरेट करता है. इसके अलावा, कैटलॉग में वीएसआईडीएल और प्रोटोबफ़ फ़ाइलों से डिप्लॉयमेंट कॉन्फ़िगरेशन बनाता है. पहली इमेज में, वीएसआईडीएलसी के लिए इनपुट और वीएसआईडीएलसी से जनरेट किया गया आउटपुट दिखाया गया है:

VSIDLC के इनपुट और आउटपुट

पहली इमेज. वीएसआईडीएलसी के इनपुट और आउटपुट.

यहां डायग्राम के बारे में बताया गया है:

  1. इनपुट के तौर पर, आपको ये फ़ाइलें देनी होंगी. इन्हें कैटलॉग के तौर पर जानी जाने वाली डायरेक्ट्री में व्यवस्थित किया जाता है:

    • प्रोटो फ़ाइलों (जिनका एक्सटेंशन .proto होता है) में डेटा स्ट्रक्चर होते हैं. इन्हें वीएसआईडीएल से तय की गई सर्विस यूनिट के बीच शेयर किया जाता है.
    • वीएसआईडीएल फ़ाइलों (जिनका एक्सटेंशन .vsidl होता है) में सर्विस बंडल, सर्विस यूनिट, और यूनिट टाइप के मालिकाना हक की जानकारी होती है.
    • हर कैटलॉग डायरेक्ट्री में मौजूद Android.bp फ़ाइलें, कैटलॉग में मौजूद सभी प्रोटो फ़ाइलों के लिए rust_protobuf बिल्ड टारगेट तय करती हैं. वीएसआईडीएलसी, रस्ट में जनरेट किए गए प्रोटोबफ़ मैसेज टाइप को रेफ़र करने के लिए, इन टारगेट में तय किए गए crate_name का इस्तेमाल करता है.
  2. इन फ़ाइलों को आउटपुट करने के लिए, वीएसआईडीएलसी चलाएं:

    • Android.bp फ़ाइलें, हर सर्विस बंडल के फ़ोल्डर में जनरेट की जाती हैं. अगर आपने --genrule सेट किया है, तो ये टारगेट, बिल्ड प्रोसेस के दौरान अप-टू-डेट रस्ट फ़ाइलें जनरेट करते हैं. साथ ही, इनमें ज़रूरी rust_protobuf लाइब्रेरी डिपेंडेंसी शामिल होती हैं.

    • service_bundle.rs फ़ाइलें, हर सर्विस बंडल के लिए जनरेट की जाती हैं. इनमें मिडलवेयर कॉम्पोनेंट के साथ इंटरैक्ट करने के लिए, मुख्य struct और फ़ंक्शन शामिल होते हैं.

    • lib.rs फ़ाइलें, बंडल के मालिकाना हक वाली हर आरपीसी सेवा के लिए जनरेट की जाती हैं. इन्हें आरपीसी सेवा के नाम वाले सबफ़ोल्डर में रखा जाता है. इन फ़ाइलों में ये शामिल हैं:

    • Interface ट्रेट, सर्वर-साइड लॉजिक को लागू करता है.

    • Client struct, आरपीसी सेवा को कॉल करता है.

    • अगर वीएसआईडीएल फ़ाइल में diagnostics_declaration मौजूद है, तो diagnostics.rs फ़ाइलें जनरेट की जाती हैं. इनमें यूडीएस पर आधारित डाइग्नोस्टिक्स के लिए ज़रूरी बाइंडिंग होती हैं.

    • --apex फ़्लैग का इस्तेमाल करने पर, डिप्लॉयमेंट और सुरक्षा कॉन्फ़िगरेशन जनरेट किए जाते हैं. इन्हें apex/ और configs/ डायरेक्ट्री में रखा जाता है. इनमें ऑर्केस्ट्रेशन .textproto फ़ाइलें और सेवा-से-सेवा कम्यूनिकेशन के लिए ज़रूरी सुरक्षा नीतियां (अनुमतियां) शामिल होती हैं.

    • --services फ़्लैग का इस्तेमाल करने पर, सेवा बॉयलरप्लेट जनरेट किया जाता है. इसे services/ डायरेक्ट्री में रखा जाता है. इसमें रस्ट ऐप्लिकेशन स्केलेटन होता है. इसमें main.rs फ़ाइल भी शामिल होती है, ताकि आप अपनी प्रोसेस को तुरंत शुरू कर सकें.

वीएसआईडीएलसी चलाना

वीएसआईडीएलसी चलाने के लिए:

  1. अगर आपने अपना एनवायरमेंट सेट अप नहीं किया है, तो source build/envsetup.sh चलाएं.

  2. वीएसआईडीएलसी बनाने के लिए, यह निर्देश चलाएं:

    m vsidlc
    
  3. पक्का करें कि आपकी वीएसआईडीएल कैटलॉग डायरेक्ट्री में ज़रूरी बिल्ड, प्रोटोबफ़, और वीएसआईडीएल फ़ाइलें हों.

  4. 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.bp genrule जनरेट करता है. m चलाने पर, genrule ज़रूरी रस्ट कोड तुरंत जनरेट करते हैं, ताकि जनरेट किए गए आर्टफ़ैक्ट को वर्शन कंट्रोल में न रखा जाए.

    generated_rs डायरेक्ट्री बनाई जाती है. इसमें Android.bp और जनरेट की गई मिडलवेयर फ़ाइलें होती हैं. इस डायरेक्ट्री को, तय किए गए सर्विस बंडल के पूरी तरह क्वालिफ़ाइड नामों के हिसाब से सबडायरेक्ट्री में व्यवस्थित किया जाता है.

डिपेंडेंसी हैंडल करना

डिफ़ॉल्ट रूप से, वीएसआईडीएलसी सिर्फ़ मुख्य कैटलॉग के लिए कोड जनरेट करता है, न कि डिपेंडेंसी कैटलॉग के लिए. अगर आपके कैटलॉग में, दूसरे कैटलॉग में तय किए गए टाइप या सर्विस यूनिट का इस्तेमाल किया जाता है, तो -d फ़्लैग का इस्तेमाल करके, हर डिपेंडेंसी कैटलॉग का पाथ तय करें:

vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...

आपको पूरे डिपेंडेंसी ग्राफ़ के लिए पाथ देने होंगे. इनमें ट्रांज़िटिव डिपेंडेंसी (डिपेंडेंसी की डिपेंडेंसी) भी शामिल हैं. उदाहरण के लिए, मान लें कि आपके पास कैटलॉग डिपेंडेंसी ट्री है:

VSIDLC डिपेंडेंसी ट्री का उदाहरण

दूसरी इमेज. वीएसआईडीएलसी डिपेंडेंसी ट्री का उदाहरण.

ट्री में मौजूद हर कैटलॉग के लिए मिडलवेयर जनरेट करने के लिए, आपको ये कमांड चलाने होंगे:

टारगेट कैटलॉग डिपेंडेंसी कमांड
एसडीवी कोर कैटलॉग लागू नहीं 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
    

अगला कदम क्या है

मिडलवेयर जनरेट करने के बाद, कारोबारी नियम लागू करना लेख पढ़ें.