Config File Schema API'yi Uygulama

Android platformu, yapılandırma verilerini depolamak için birçok XML dosyası içerir. veri (örneğin, ses yapılandırması). XML dosyalarının çoğu vendor içindedir ancak system bölümünde okunur. Bu örnekte şema, iki bölüm için arayüz görevi görür ve bu nedenle, şema açıkça belirtilmeli ve geriye dönük uyumlu olacak şekilde geliştirilmelidir şekilde ele alacağız.

Platform, Android 10'dan önce Android 10'dan önce XML şemasının belirtilmesini ve kullanılmasını gerektiren veya şemada uyumsuz değişiklikler var. Android 10, Config File Schema API adı verilen bu mekanizmayı kullanabilirsiniz. Bu mekanizma, proje boyunca xsdc ve xsd_config adlı bir derleme kuralı içeriyor.

xsdc aracı, bir XML Şema Dokümanı (XSD) derleyicisidir. Bir XSD dosyasını ayrıştırır bir XML dosyasının şemasını açıklayıp Java ve C++ kodu üretir. İlgili içeriği oluşturmak için kullanılan oluşturulan kod, XSD şemasına uygun XML dosyalarını Her biri bir XML etiketi modeller. XML özellikleri alanlar olarak modellenir anlamına gelir.

xsd_config derleme kuralı, xsdc aracını derleme sistemine entegre eder. Belirli bir XSD giriş dosyası için derleme kuralı, Java ve C++ kitaplıklarını oluşturur. Siz kitaplıkları, şu kurallara uyan XML dosyalarının bulunduğu modüllere bağlayabilir: XSD'ler okunur ve kullanılır. Derleme kuralını, kullandığınız XML dosyalarında olduğu gibi system ve vendor bölümlerinde.

Build Config File Schema API'si

Bu bölümde, Config File Schema API'nin nasıl oluşturulacağı açıklanmaktadır.

Android.bp'de xsd_config derleme kuralını yapılandırma

xsd_config derleme kuralı, ayrıştırıcı kodunu xsdc aracıyla oluşturur. İlgili içeriği oluşturmak için kullanılan xsd_config derleme kuralının package_name özelliği, oluşturulan Java kodunu yazın.

Android.bp konumunda xsd_config derleme kuralı örneği:

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

Örnek dizin yapısı:

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

Derleme sistemi, oluşturulan Java kodunu kullanarak bir API listesi oluşturur ve karşı tarafa göstermelisiniz. Bu API kontrolü, DroidCore'a eklendi ve m -j saatinde yürütüldü.

API listesi dosyaları oluşturun

API kontrolleri için API'nin kaynak kodundaki dosyaları listelemesi gerekir.

API listelerindeki dosyalar şunlardır:

  • current.txt ve removed.txt, API'lerin oluşturulan API dosyalarıyla karşılaştırma yapma olanağı sunar.
  • last_current.txt ve last_removed.txt, API'lerin geriye dönük uyumluluğa da sahip olduğundan emin olun.

API listesi dosyalarını oluşturmak için:

  1. Boş liste dosyaları oluşturun.
  2. make update-api komutunu çalıştırın.

Oluşturulan ayrıştırıcı kodunu kullan

Oluşturulan Java kodunu kullanmak için xsd_config modülüne önek olarak : kodunu ekleyin adını girin.srcs Oluşturulan Java kodunun paketi package_name özelliğiyle aynıdır.

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

Oluşturulan C++ kodunu kullanmak için xsd_config modül adını generated_sources ve generated_headers mülkleri. Ayrıca libxml2 öğesini şuraya ekleyin: Oluşturulan ayrıştırıcıda libxml2 gerekli olduğundan static_libs veya shared_libs girin. Etiketin ad alanı oluşturulan C++ kodu, package_name mülküyle aynıdır. Örneğin, xsd_config modülünün adı hal.manifest ise ad alanı hal::manifest.

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

Ayrıştırıcıyı kullanma

Java ayrıştırıcı kodunu kullanmak için, XmlParser#read veya Kök sınıfını döndürmek için read{class-name} yöntemi öğesine dokunun. Ayrıştırma şu anda gerçekleşir.

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++ ayrıştırıcı kodunu kullanmak için önce başlık dosyasını ekleyin. Kişinin adı başlık dosyası, nokta (.) alt çizgiye (_) dönüştürülmüş paket adıdır. Ardından, sonucu döndürmek için read veya read{class-name} yöntemini kullanın kök öğenin sınıfıdır. Ayrıştırma şu anda gerçekleşir. Döndürülen değer: 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();
        …
    }
    …
}

Ayrıştırıcıyı kullanmak için sağlanan tüm API'ler api/current.txt içindedir. Örneğin, tüm öğe ve özellik adları büyük/küçük harfe dönüştürülür (ör. örnek, ElementName) ve karşılık gelen değişken, yöntem ve sınıf adı. Ayrıştırılmış kök öğenin sınıfı read{class-name} işlevi. Tek bir kök varsa öğesi, işlev adı read olur. Ayrıştırılmış bir alt öğenin veya özelliği, get{variable-name} kullanılarak elde edilebilir. işlevini kullanın.

Ayrıştırıcı kodu oluştur

Çoğu durumda, xsdc öğesini doğrudan çalıştırmanız gerekmez. xsd_config derlemesini kullanın kuralı yerine Android.bp'de xsd_config derleme kuralını yapılandırma. Bu bölümünde, yalnızca eksiksiz olması için xsdc komut satırı arayüzü açıklanmaktadır. Bu hata ayıklama için faydalı olabilir.

xsdc aracına XSD dosyasının yolunu ve bir paketi vermeniz gerekir. İlgili içeriği oluşturmak için kullanılan paket, Java kodundaki bir paket adı ve C++ kodundaki bir ad alanıdır. Seçenekler kullanılarak oluşturulan kodun Java mı yoksa C mi olduğunu -j veya -c olarak belirleriz. tıklayın. -o seçeneği, çıkış dizininin yoludur.

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

Örnek komut:

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