يحتوي نظام 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
مما إذا كانت واجهات برمجة التطبيقات متوافقة مع الأنظمة القديمة من خلال المقارنة بملفات واجهة برمجة التطبيقات
لإنشاء قوائم واجهة برمجة التطبيقات للملفات:
- إنشاء ملفات قوائم فارغة
- شغِّل الأمر
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