تنفيذ واجهة برمجة تطبيقات مخطط ملف الإعداد

يحتوي نظام Android الأساسي على العديد من ملفات XML لتخزين الإعدادات. البيانات (على سبيل المثال، التهيئة الصوتية). تتوفّر العديد من ملفات XML في vendor. ولكن تتم قراءتها في قسم system. في هذه الحالة، لا يمكن لملف XML يعمل كواجهة عبر القسمين، وبالتالي يجب تحديد المخطط بشكل صريح ويجب تطويره بتنسيق متوافق مع الأنظمة القديمة على نحو مماثل.

قبل Android 10، لم يكن النظام الأساسي يوفر كيفية طلب تحديد مخطط XML واستخدامه، أو لمنع تغييرات غير متوافقة في المخطط. يوفّر Android 10 باسم واجهة برمجة تطبيقات مخطط ملف الإعداد. تتكون هذه الآلية من أداة باسم xsdc وقاعدة إصدار تُسمى xsd_config.

أداة xsdc هي برنامج تجميع لمستند مخطط XML (XSD). تحليل ملف XSD تصف مخطط ملف XML وتنشئ رمزي Java وC++. تشير رسالة الأشكال البيانية تُحلل التعليمات البرمجية التي تم إنشاؤها ملفات XML التي تتوافق مع مخطط XSD إلى مجموعة الكائنات، التي يصمم كل منها علامة XML. يتم تصميم نماذج XML على شكل حقول. من الكائنات.

تعمل قاعدة الإصدار xsd_config على دمج أداة xsdc في نظام التصميم. بالنسبة إلى ملف إدخال XSD محدد، تنشئ قاعدة الإصدار مكتبات Java وC++. إِنْتَ ربط المكتبات بالوحدات حيث تتوافق ملفات XML مع تتم قراءة ملفات XSD واستخدامها. يمكنك استخدام قاعدة التصميم لملفات XML الخاصة بك المستخدَمة. في القسمَين system وvendor.

واجهة برمجة تطبيقات مخطط ملف ضبط الإعدادات

يوضِّح هذا القسم كيفية إنشاء Config File Schema API.

ضبط قاعدة الإصدار xsd_config في Android.bp

تنشئ قاعدة الإصدار xsd_config رمز المحلل باستخدام أداة xsdc. تشير رسالة الأشكال البيانية تحدّد السمة package_name لقاعدة إصدار xsd_config اسم حزمة رمز Java الذي تم إنشاؤه.

مثال على قاعدة إصدار xsd_config في Android.bp:

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. في السمة srcs Java. حزمة كود 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 قاعدة بدلاً من ذلك، كما هو موضح في ضبط قاعدة الإصدار xsd_config في Android.bp هذا النمط واجهة سطر الأوامر 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