कॉन्फ़िगरेशन फ़ाइल स्कीमा एपीआई लागू करें

Android प्लैटफ़ॉर्म में कॉन्फ़िगरेशन सेव करने के लिए, कई एक्सएमएल फ़ाइलें मौजूद हैं डेटा (उदाहरण के लिए, ऑडियो कॉन्फ़िगरेशन). कई एक्सएमएल फ़ाइलें vendor में हैं विभाजन, लेकिन उन्हें system विभाजन में पढ़ा जाता है. इस मामले में, स्कीमा एक्सएमएल फ़ाइल दो हिस्सों में इंटरफ़ेस के तौर पर काम करती है. स्कीमा की जानकारी साफ़ तौर पर दी जानी चाहिए और उसे पुराने सिस्टम के साथ काम करने वाले फ़ॉर्मैट में बदलना चाहिए तरीका.

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

xsdc टूल, एक्सएमएल स्कीमा दस्तावेज़ (XSD) कंपाइलर है. यह XSD फ़ाइल को पार्स करता है किसी एक्सएमएल फ़ाइल के स्कीमा की जानकारी देने के साथ-साथ, Java और C++ कोड जनरेट करता है. कॉन्टेंट बनाने जनरेट किया गया कोड, उन एक्सएमएल फ़ाइलों को ऑब्जेक्ट हैं, जिनमें से हर एक एक्सएमएल टैग को मॉडल करता है. एक्सएमएल एट्रिब्यूट को फ़ील्ड के तौर पर मॉडल किया जाता है में से किसी एक चीज़ की ज़रूरत होती है.

xsd_config बिल्ड नियम, xsdc टूल को बिल्ड सिस्टम में इंटिग्रेट करता है. किसी XSD इनपुट फ़ाइल के लिए, बिल्ड नियम Java और C++ लाइब्रेरी जनरेट करता है. आपने लोगों तक पहुंचाया मुफ़्त में लाइब्रेरी को उन मॉड्यूल से लिंक कर सकता है जहां Xएसडी को पढ़ा और इस्तेमाल किया जाता है. आप इस्तेमाल की गई अपनी एक्सएमएल फ़ाइलों के लिए, बिल्ड नियम का इस्तेमाल कर सकते हैं सेगमेंट, system और vendor सेगमेंट में बांट दिए गए हैं.

बिल्ड कॉन्फ़िगरेशन फ़ाइल स्कीमा एपीआई

इस सेक्शन में, कॉन्फ़िगरेशन फ़ाइल स्कीमा एपीआई बनाने का तरीका बताया गया है.

Android.bp में xsd_config बिल्ड नियम कॉन्फ़िगर करें

xsd_config बिल्ड नियम, xsdc टूल के साथ पार्सर कोड जनरेट करता है. कॉन्टेंट बनाने xsd_config बिल्ड नियम की package_name प्रॉपर्टी, इसका पैकेज नाम तय करती है जनरेट किया गया Java कोड जनरेट करना होगा.

Android.bp में xsd_config बिल्ड नियम का उदाहरण:

xsd_config {
    name: "hal_manifest",
    srcs: ["hal_manifest.xsd"],
    package_name: "hal.manifest",
}

डायरेक्ट्री स्ट्रक्चर का उदाहरण:

├── Android.bp
├── api
│   ├── current.txt
│   ├── last_current.txt
│   ├── last_removed.txt
│   └── removed.txt
└── hal_manifest.xsd

बिल्ड सिस्टम, जनरेट किए गए Java कोड और जांच का इस्तेमाल करके, एपीआई की सूची जनरेट करता है को ट्रैक करना ज़रूरी है. इस एपीआई जांच को DroidCore में जोड़ा गया है और m -j पर लागू किया गया है.

एपीआई की सूचियों में मौजूद फ़ाइलें बनाएं

एपीआई की जांच के लिए, सोर्स कोड में एपीआई लिस्ट की फ़ाइलें ज़रूरी हैं.

एपीआई की सूची में शामिल फ़ाइलें:

  • current.txt और removed.txt जांचते हैं कि एपीआई में बदलाव इस वजह से हुआ है या नहीं बिल्ड के समय जनरेट की गई एपीआई फ़ाइलों से तुलना की जा सकती है.
  • last_current.txt और last_removed.txt जांचते हैं कि एपीआई एपीआई फ़ाइलों से तुलना करके, पुराने सिस्टम के साथ काम करता है.

एपीआई की सूची में मौजूद फ़ाइलें बनाने के लिए:

  1. खाली सूचियों वाली फ़ाइलें बनाएं.
  2. make update-api निर्देश चलाएं.

जनरेट किया गया पार्सर कोड इस्तेमाल करें

जनरेट किए गए Java कोड का इस्तेमाल करने के लिए, xsd_config मॉड्यूल में प्रीफ़िक्स के तौर पर : जोड़ें Java srcs प्रॉपर्टी में नाम डालें. जनरेट किए गए Java कोड का पैकेज यह है package_name प्रॉपर्टी की तरह.

java_library {
    name: "vintf_test_java",
    srcs: [
        "srcs/**/*.java"
        ":hal_manifest"
    ],
}

जनरेट किए गए C++ कोड का इस्तेमाल करने के लिए, xsd_config मॉड्यूल का नाम generated_sources और generated_headers प्रॉपर्टी. और libxml2 को इसमें जोड़ें static_libs या shared_libs, क्योंकि जनरेट किए गए पार्सर में libxml2 ज़रूरी है कोड. इसका नेमस्पेस जनरेट किया गया C++ कोड और package_name प्रॉपर्टी, दोनों एक जैसे हैं. उदाहरण के लिए, अगर xsd_config मॉड्यूल का नाम hal.manifest है, नेमस्पेस यह है hal::manifest.

cc_library{
    name: "vintf_test_cpp",
    srcs: ["main.cpp"],
    generated_sources: ["hal_manifest"],
    generated_headers: ["hal_manifest"],
    shared_libs: ["libxml2"],
}

पार्सर का इस्तेमाल करना

Java पार्सर कोड इस्तेमाल करने के लिए, XmlParser#read या रूट की क्लास देने के लिए read{class-name} तरीका एलिमेंट. इस समय पार्स किया जाता है.

import hal.manifest.*;

…

class HalInfo {
    public String name;
    public String format;
    public String optional;
    …
}

void readHalManifestFromXml(File file) {
    …
    try (InputStream str = new BufferedInputStream(new FileInputStream(file))) {
        Manifest manifest = XmlParser.read(str);
        for (Hal hal : manifest.getHal()) {
            HalInfo halinfo;
            HalInfo.name = hal.getName();
            HalInfo.format = hal.getFormat();
            HalInfo.optional = hal.getOptional();
            …
        }
    }
    …
}

C++ पार्सर कोड का इस्तेमाल करने के लिए, पहले हेडर फ़ाइल शामिल करें. इवेंट मैनेजर का नाम हेडर फ़ाइल, पैकेज का नाम है जिसमें पीरियड (.) को अंडरस्कोर (_) में बदला गया है. इसके बाद, वापस जाने के लिए read या read{class-name} तरीके का इस्तेमाल करें रूट एलिमेंट की क्लास. इस समय पार्स किया जाता है. रिटर्न वैल्यू यह है std::optional<>.

include "hal_manifest.h"

…
using namespace hal::manifest

struct HalInfo {
    public std::string name;
    public std::string format;
    public std::string optional;
    …
};

void readHalManifestFromXml(std::string file_name) {
    …
    Manifest manifest = *read(file_name.c_str());
    for (Hal hal : manifest.getHal()) {
        struct HalInfo halinfo;
        HalInfo.name = hal.getName();
        HalInfo.format = hal.getFormat();
        HalInfo.optional = hal.getOptional();
        …
    }
    …
}

इस पार्सर को इस्तेमाल करने के लिए दिए गए सभी एपीआई api/current.txt में मौजूद हैं. इसके लिए एकरूपता, सभी एलिमेंट और एट्रिब्यूट के नाम ऊंट के केस में बदल दिए जाते हैं (इसके लिए उदाहरण के लिए, ElementName) और इससे जुड़े वैरिएबल, तरीके, और क्लास का नाम. पार्स किए गए रूट एलिमेंट की क्लास का पता लगाने के लिए, read{class-name} फ़ंक्शन का इस्तेमाल करना होगा. अगर सिर्फ़ एक रूट है एलिमेंट है, तो फ़ंक्शन का नाम read है. पार्स किए गए सब-एलिमेंट की वैल्यू या get{variable-name} का इस्तेमाल करके एट्रिब्यूट को हासिल किया जा सकता है फ़ंक्शन का इस्तेमाल करना होगा.

पार्सर कोड जनरेट करें

ज़्यादातर मामलों में, आपको xsdc को सीधे चलाने की ज़रूरत नहीं होती. xsd_config बिल्ड का इस्तेमाल करें जैसा कि इसमें बताया गया है, नियम लागू करें Android.bp में xsd_config बिल्ड नियम को कॉन्फ़िगर करना. यह सेक्शन में, xsdc कमांड लाइन इंटरफ़ेस के बारे में बताया गया है, ताकि इसे पूरा किया जा सके. यह डीबग करने के लिए काम आ सकता है.

आपको xsdc टूल को XSD फ़ाइल का पाथ और एक पैकेज देना होगा. कॉन्टेंट बनाने पैकेज, Java कोड में पैकेज का नाम है और C++ कोड में नेमस्पेस है. विकल्प यह पता लगाने के लिए कि जनरेट किया गया कोड Java है या C, -j है या -c, क्रम से. -o विकल्प, आउटपुट डायरेक्ट्री का पाथ होता है.

usage: xsdc path/to/xsd_file.xsd [-c] [-j] [-o <arg>] [-p]
 -c,--cpp           Generate C++ code.
 -j,--java          Generate Java code.
 -o,--outDir <arg>  Out Directory
 -p,--package       Package name of the generated java file. file name of
                    generated C++ file and header

निर्देश का उदाहरण:

$ xsdc audio_policy_configuration.xsd -p audio.policy -j