Referensi lain

Referensi berikut memberikan detail tentang lokasi, alat, pengujian, dan pemberian lisensi kode.

Lokasi kode yang dapat dikueri

Kode untuk objek antarmuka vendor yang dapat dikueri akan masuk ke system/libvintf.

File manifes tulisan tangan dan matriks kompatibilitas bisa jadi sulit. Gunakan alat berikut untuk membuat manifes boilerplate/matriks kompatibilitas sebagai titik awal.

LSHAL

LSHAL adalah alat sisi perangkat yang mencantumkan semua HAL terdaftar ke hwservicemanager dan semua implementasi passthrough yang tersedia (misalnya, android.hardware.foo@1.0-impl.so) di perangkat. Alat ini juga dapat membuat file manifes perangkat berdasarkan daftar:

adb shell su 0 /system/bin/lshal --init-vintf

Perhatikan hal berikut:

  1. Jika paket terdaftar ke hwservicemanager dan ditemukan sebagai HAL passthrough, <transport> akan disetel ke hwbinder.
  2. Tidak ada versi SELinux yang ditulis ke dalam manifes. Sebaiknya elemen dimasukkan melalui assemble_vintf seperti yang dijelaskan di bawah.
  3. File manifes HAL yang dihasilkan mungkin tidak akurat. Perhatian manusia diperlukan untuk memperbaiki inkonsistensi antara manifes perangkat dan apa yang sebenarnya disediakan vendor.img.

ASSEMBLE_VINTF

assemble_vintf adalah alat sisi host yang:

  1. Memverifikasi bahwa matriks kompatibilitas atau file manifes valid.
  2. Memasukkan variabel ke manifes/matriks kompatibilitas yang tersedia pada waktu build dan membuat file baru yang harus diinstal ke perangkat.
  3. Memeriksa kompatibilitas antara file yang dihasilkan dan file gandanya.
  4. Jika file manifes diberikan, secara opsional buat matriks kompatibilitas boilerplate yang kompatibel dengan file manifes.

Contoh: Membuat matriks kompatibilitas perangkat dari file manifes framework

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

Perhatikan bahwa semua HAL ditetapkan ke optional="true".

Contoh: Membuat matriks kompatibilitas framework skeleton dari file manifes perangkat

assemble_vintf -m --hals-only \
    -i device/foo/bar/manifest.xml \
    -o path/to/place/output/compatibility_matrix.xml

Perhatikan bahwa semua HAL ditetapkan ke optional="true".

Contoh: Membuat file XML manifes perangkat dari variabel

Pada waktu build, jika variabel berikut ditentukan di device/manufacturer/device_name/BoardConfig.mk:

# Vendor manifest is named DEVICE_MANIFEST_FILE for legacy reasons.
DEVICE_MANIFEST_FILE := \
    device/manufacturer/device_name/vendor_manifest.xml
ODM_MANIFEST_FILES := \
    device/manufacturer/device_name/odm_manifest.xml
ODM_MANIFEST_SKUS := sku1 sku2
ODM_MANIFEST_SKU1_FILES := \
    device/manufacturer/device_name/odm_manifest_sku1.xml
ODM_MANIFEST_SKU2_FILES := \
    device/manufacturer/device_name/odm_manifest_sku2.xml

Kemudian, perintah berikut akan dieksekusi (dalam sistem build, diubah untuk menghapus detail implementasi) untuk membuat file XML manifes perangkat:

# vendor manifest; only when DEVICE_MANIFEST_FILE is set
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml

# ODM manifests
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest.xml

# ODM manifests for each sku
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU1_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku1.xml
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU2_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku2.xml

Saat runtime, objek VINTF menggabungkan manifes vendor dan manifes ODM sebagai manifes perangkat. Lihat Manifes perangkat untuk mengetahui detailnya.

Contoh: Membuat file XML matriks kompatibilitas perangkat dari variabel

Pada waktu build, jika variabel berikut ditentukan di device/manufacturer/device_name/BoardConfig.mk:

# vendor compatibility matrix is named DEVICE_MATRIX_FILE for legacy reasons.
DEVICE_MATRIX_FILE := \
    device/manufacturer/device_name/vendor_compatibility_matrix.xml \
    device/manufacturer/device_name/vendor_compatibility_matrix_additional.xml

Kemudian, perintah berikut akan dijalankan (dalam sistem build, diubah untuk menghapus detail penerapan) untuk membuat file XML matriks kompatibilitas perangkat:

# vendor compatibility matrix; only when DEVICE_MATRIX_FILE is set
assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MATRIX_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml

Saat runtime, objek VINTF menggunakan matriks kompatibilitas vendor sebagai matriks kompatibilitas perangkat. Lihat Matriks kompatibilitas perangkat untuk mengetahui detailnya.

Contoh: Membuat file XML manifes framework dari variabel

Variabel berikut dapat ditentukan di device/manufacturer/device_name/BoardConfig.mk:

# Device-specific system manifest is named DEVICE_FRAMEWORK_MANIFEST_FILE for legacy reasons
DEVICE_FRAMEWORK_MANIFEST_FILE := \
    device/manufacturer/device_name/device_system_manifest.xml

# Product manifest
PRODUCT_MANIFEST_FILES := \
    device/manufacturer/device_name/product_manifest.xml

Perintah berikut dijalankan (dalam sistem build, dimodifikasi untuk menghapus detail penerapan) untuk membuat file XML manifes framework:

# system manifest
assemble_vintf \
    -i system/libhidl/vintfdata/manifest.xml \
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_MANIFEST_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/manifest.xml

# product manifest
assemble_vintf \
    $(addprefix,-i ,$(PRODUCT_MANIFEST_FILES)) \
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/manifest.xml

Saat runtime, objek VINTF menggabungkan manifes sistem, fragmen manifes sistem, manifes produk, dan fragmen manifes produk sebagai manifes framework. Lihat Manifes framework untuk mengetahui detailnya.

Contoh: Membuat file XML matriks kompatibilitas framework dari variabel

Variabel berikut dapat ditentukan di device/manufacturer/device_name/BoardConfig.mk untuk menentukan FCM produk dan FCM sistem khusus perangkat:

DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/product_compatibility_matrix.xml
# Device-specific system compatibility matrix is named
# DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE for legacy reasons.
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/device_system_compatibility_matrix.xml

FCM system_ext harus diinstal dengan modul Soong. FCM produk juga dapat diinstal dengan modul Soong; jangan tentukan DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE jika metode ini digunakan. Selain itu, beberapa versi FCM produk dan versi FCM system_ext dapat diinstal dengan modul Soong. Tentukan hal berikut:

  • Tentukan modul di device/manufacturer/device_name/Android.bp. Misalnya (ganti system_ext dengan produk untuk FCM produk):
    vintf_compatibility_matrix {
        name: "system_ext_compatibility_matrix.xml",
        stem: "compatibility_matrix.xml",
        system_ext_specific: true,
        // product_specific: true, // for product FCM
        srcs: [
            "system_ext_compatibility_matrix.xml",
        ],
    }
  • Instal modul ke device/manufacturer/device_name/device.mk. Contoh:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Perintah berikut dijalankan (dalam sistem build, diubah untuk menghapus detail penerapan) untuk membuat file XML matriks kompatibilitas framework:

# common system compatibility matrix for each FCM version
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
POLICYVERS=$(POLICYVERS) \
BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION)
assemble_vintf \
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.device.xml

# framework compatibility matrixes at each FCM version
assemble_vintf
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \
    --kernel=...

# product framework compatibility matrix; only when
# DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE is set or when the Soong module for
# product FCM is defined
assemble_vintf
    -i $(DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE)
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/compatibility_matrix.xml

# system_ext framework compatibility matrix; only when the Soong module for
# system_ext FCM is defined
assemble_vintf
    -i <srcs for the soong module>
    -o $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/compatibility_matrix.xml

Saat runtime, objek VINTF menggabungkan subkumpulan matriks kompatibilitas sistem dan matriks kompatibilitas produk sebagai matriks kompatibilitas framework. Lihat Matriks kompatibilitas Framework untuk mengetahui detailnya.

Contoh: Buat manifes vendor dari fragmen

Beberapa fragmen manifes vendor dapat dipaketkan pada waktu build. Contoh:

<!-- device/manufacturer/device_name/manifest_common.xml -->
<manifest version="1.0" type="device">
    <!-- common HALs here -->
</manifest>
<!-- device/manufacturer/device_name/ir.xml -->
<manifest version="1.0" type="device">
    <hal>
        <name>android.hardware.ir</name>
        <version>1.0</version>
        <!-- other fields -->
    </hal>
</manifest>
# device/manufacturer/device_name/BoardConfig.mk
DEVICE_MANIFEST_FILE := device/manufacturer/device_name/manifest_common.xml
ifdef BOARD_ENABLE_IR
    DEVICE_MANIFEST_FILE += device/manufacturer/device_name/ir.xml
endif

Kemudian, assemble_vintf menambahkan HAL IR ke manifes vendor jika BOARD_ENABLE_IR ditentukan, dan menghapusnya jika BOARD_ENABLE_IR tidak ditentukan. Perintah berikut (diubah untuk menghapus detail implementasi) dijalankan untuk membuat manifes vendor:

# if BOARD_ENABLE_IR is defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml:device/manufacturer/device_name/ir.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

# if BOARD_ENABLE_IR is not defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

Untuk detailnya, lihat:

assemble_vintf --help

Pengujian

Project platform/system/libvintf menggunakan GTest untuk serialisasi, deserialisasi, dan pemeriksaan kompatibilitas.

Pemberian (hak) lisensi

  • tinyxml2 (external/tinyxml2) untuk melakukan serialisasi/deserialisasi objek ke/dari XML. Lisensi seperti BSD.
  • libselinux (external/selinux/libselinux) untuk mendapatkan versi policydb. Lisensi domain publik.
  • libz (eksternal/zlib) untuk mendekompresi /proc/config.gz. Lisensi seperti BSD.
  • Project libvintf menggunakan lisensi Apache 2.0 (dengan file MODULE_LICENSE_APACHE2 dan NOTICE yang sesuai).