نختبر ميزة "التحقّق من صحة الأجهزة" داخليًا على الأجهزة. نستخدم QVM على QNX للمحاكاة الافتراضية. نشارك جميع الاستهدافات والمستندات وعمليات الضبط كأمثلة.
المتطلبات الأساسية
تفترض هذه الصفحة أنّ نظام التشغيل QNX تم إعداده مسبقًا، ولا تتضمّن خطوات إنشاء أو ضبط أو تثبيت ذاكرة ROM لنظام التشغيل QNX على الأجهزة.
تفترض هذه الصفحة أنّك تستخدم QNX على أجهزة arm64، وأنّك تنشئ وتستخدم استهدافات _arm64 في SDV.
المكوّنات المطلوبة
- ملف ثنائي كبير (blob) لشجرة الأجهزة (DTB) لتحديد الأجهزة الافتراضية
- نواة Linux لاستخدامها
- قرص RAM مدمج يتضمّن جميع خصائص تشغيل قرص RAM
- عملية تسليم سلسلة DICE لمصادقة الجهاز الافتراضي (VM) في "ميزة التصميم الآمن"
- جميع أقسام القرص في النظام
- إعدادات الجهاز الافتراضي التي تتوافق مع QVM
ملف شجرة الأجهزة الثنائي الكبير (DTB)
تنشئ الآلة الافتراضية QVM معظم ملف DTB استنادًا إلى إعداداتها، وبالتالي يمكن أن يكون ملف DTB بسيطًا:
/*
* Copyright (C) 2026 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/dts-v1/;
/ {
model = "Virtual Machine";
#address-cells = <2>;
#size-cells = <2>;
// This reserved-memory node specifies for the open-dice driver which memory region(s) to
// expose as /dev/open-dice<n> device(s)
reserved-memory {
// The number of u32 cells to represent the address of a memory region
#address-cells = <2>;
// The number of u32 cells to represent the size of a memory region
#size-cells = <2>;
ranges;
// The unit address (after the @) must match the address in the reg property
dice@D1C30000 {
// The open-dice driver receives this device tree node based on this
// property.
compatible = "google,open-dice";
no-map;
// The address and the size of the memory region that is passed to the
// open-dice driver.
// First two hex numbers (cells) represent the address of the memory region,
// the last two represent its size (4K, in this case).
reg = <0x0 0xD1C30000 0x0 0x1000>;
};
};
};
Kernel
تستخدم SDV صورة Generic Kernel Image (GKI)، ويمكنك استخدام الناتج من الإصدار مباشرةً.
Ramdisk
يجب أن تتضمّن معلومات ramdisk ملفات ramdisk المختلفة التي ينشئها نظام التشغيل Android وخصائص التشغيل. بما أنّ QNX لا يتيح استخدام برنامج تحميل الإقلاع تلقائيًا، عليك إنشاء قرص RAM بتنسيق البيانات المتوقّع.
يمكنك إجراء ذلك باستخدام النص البرمجي التالي بلغة Python، والذي يربط عدة أقراص RAM ويضيف bootconfig (وهو الملف vendor-bootconfig.img) بالتنسيق المتوقّع:
def create_qnx_ramdisk(output: io.BytesIO,
ramdisks: Sequence[io.BytesIO],
bootconfig: Optional[io.BytesIO]):
BUFFER_SIZE = 4096
for ramdisk in ramdisks:
while buf := ramdisk.read(BUFFER_SIZE):
output.write(buf)
# Kernel looks for bootconfig at the end of ramdisk.
if bootconfig:
bootconfig_checksum = 0
bootconfig_size = 0
while buf := bootconfig.read(BUFFER_SIZE):
bootconfig_checksum = (bootconfig_checksum + sum(buf)) & 0xFFFFFFFF
bootconfig_size += len(buf)
output.write(buf)
output.write(struct.pack('II', bootconfig_size, bootconfig_checksum))
output.write(b'#BOOTCONFIG\n')
سلسلة DICE
في نظام الإنتاج، ينشئ نظام المضيف وبرنامج التحميل سلسلة DICE بشكل ديناميكي أثناء عملية التشغيل، ويوفّران سلسلة DICE للضيف للتحقّق من إمكانية الوثوق بالصورة. وبما أنّ هذا الشرط يمكن أن يؤدي إلى تعقيد عمليات الاختبار والتطوير، يمكنك تحميل لقطة من سلسلة DICE بدلاً من ذلك.
لإنشاء ملفات dice_handover_instance*، استخدِم أي إصدار من SDV Cuttlefish.
على سبيل المثال:
lunch sdv_core_cf-trunk_staging-userdebug
m
cp $OUT/product/etc/dice_handover_instance* <GUEST>/test_dice_handover
قرص
تتيح QVM عدة تنسيقات للقرص الافتراضي، ويستخدم الإعداد المرجعي ملف صورة قرص يحتوي على جميع الأقسام. يمكن أن تنشئ أداة bpttool هذه الأقراص، ولكن لا يتم تطويرها بشكل نشط ضمن Android.
إعدادات QVM
يضبط إعداد QVM الإعدادات ويشير إلى الملفات المختلفة. نقدّم نماذج الإعدادات التالية:
- إعدادات الجهاز الافتراضي SDV Core
- إعدادات الجهاز الافتراضي SDV Media
- المعلومات والترفيه داخل المركبة (IVI) مع دمج ميزة "التحقّق من صحة الجهاز" (SDV)
الأسئلة الشائعة
س: يتعذّر على أداة تصحيح الأخطاء من Android الاتصال بجهازي الافتراضي. ما الإجراء الذي يمكنني اتّخاذه؟
ج: في هذا الإعداد، يستخدم adb شبكة إيثرنت للاتصال بجهازك الافتراضي. عليك ضبط إعدادات إعادة توجيه المنفذ على QNX لإعادة توجيه الطلبات إلى الأجهزة الضيف على المنفذ 5555. عليك الاتصال بنظام المضيف. يمكنك أيضًا ضبط جسر للجهاز الافتراضي والاتصال به مباشرةً كبديل.
س: يظهر في سجلّ النظام أنّ IServiceRegistrationAgent غير متوفّر. ما السبب؟
ج: يعتمد اكتشاف الخدمات على إعدادات الثقة والربط التي تعمل بشكل كامل. تأكَّد من تحميل OpenDICE بنجاح، ومن أنّ HwBinder لا يعرض أخطاء أثناء بدء التشغيل. إذا لم تنجح هذه الخطوات، عليك إصلاحها أولاً.
س: يتعذّر تنفيذ init_open_dice. ماذا حدث؟
ج: تحمّل نصوص البرامج عند بدء التشغيل معلومات الثقة أثناء بدء التشغيل، وتمحو موقع الذاكرة. تأكَّد في إعدادات QVM من أنّ إعدادات سطر الأوامر والبيانات المشترَكة في موقع الذاكرة متوافقة معًا. تأكَّد أيضًا من تطابق موقع الذاكرة في برنامج التشغيل وإعدادات QVM وDTB، ومن إمكانية الكتابة في موقع الذاكرة.