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
veremoved.txt
, API'lerin oluşturulan API dosyalarıyla karşılaştırma yapma olanağı sunar.last_current.txt
velast_removed.txt
, API'lerin geriye dönük uyumluluğa da sahip olduğundan emin olun.
API listesi dosyalarını oluşturmak için:
- Boş liste dosyaları oluşturun.
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