تتيح لك "تحديثات النظام الديناميكية" (DSU) إنشاء صورة لنظام Android يمكن للمستخدمين تنزيلها من الإنترنت وتجربتها بدون المخاطرة بإتلاف صورة النظام الحالية. يوضّح هذا المستند كيفية توفير إمكانية استخدام DSU.
متطلبات النواة
راجِع مقالة تنفيذ الأقسام الديناميكية للاطّلاع على متطلبات النواة.
بالإضافة إلى ذلك، تعتمد ميزة "تحديث النظام" على ميزة dm-verity في النواة للتحقّق من صحة صورة نظام Android. لذا، يجب تفعيل إعدادات النواة التالية:
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
متطلبات التقسيم
بدءًا من الإصدار 11 من نظام التشغيل Android، تتطلّب أداة DSU استخدام نظام الملفات F2FS أو ext4 في القسم /data
. يوفّر نظام الملفات F2FS أداءً أفضل وننصح باستخدامه، ولكن يجب ألا يكون الفرق كبيرًا.
في ما يلي بعض الأمثلة على المدة التي يستغرقها تحديث النظام الديناميكي على جهاز Pixel:
- استخدام نظام الملفات F2FS:
- 109 ثوانٍ، مستخدم 8 غيغابايت، نظام 867 ميغابايت، نوع نظام الملفات: F2FS: encryption=aes-256-xts:aes-256-cts
- 104 ثوانٍ، مستخدم 8G، نظام 867M، نوع نظام الملفات: F2FS: encryption=ice
- استخدام ext4:
- 135 ثانية، 8 غيغابايت للمستخدم، 867 ميغابايت للنظام، نوع نظام الملفات: ext4: encryption=aes-256-xts:aes-256-cts
إذا استغرقت العملية وقتًا أطول بكثير على منصتك، يمكنك التحقّق مما إذا كانت علامة التحميل تتضمّن أي علامة تؤدي إلى كتابة "مزامنة"، أو يمكنك تحديد علامة "غير متزامن" بشكل صريح للحصول على أداء أفضل.
يجب توفُّر القسم metadata
(16 ميغابايت أو أكثر) لتخزين البيانات ذات الصلة بالصور المثبَّتة. يجب تثبيته أثناء عملية التثبيت في المرحلة الأولى.
يجب أن يستخدم القسم userdata
نظام الملفات F2FS أو ext4. عند استخدام نظام الملفات F2FS، يجب تضمين جميع تصحيحات F2FS المتاحة في نواة Android العامة.
تم تطوير DSU واختبارها باستخدام الإصدار 4.9 من النواة/البرامج المشتركة. ننصح باستخدام الإصدار 4.9 من النواة أو إصدار أحدث للاستفادة من هذه الميزة.
سلوك Vendor HAL
Weaver HAL
يوفر Weaver HAL عددًا ثابتًا من الخانات لتخزين مفاتيح المستخدمين. تستهلك وحدة التخزين المباشر (DSU) فتحتَي مفتاح إضافيتَين. إذا كان لدى الشركة المصنّعة للمعدات الأصلية (OEM) طبقة تجريد الأجهزة (HAL) الخاصة بـ "النسيج"، يجب أن تتضمّن عددًا كافيًا من الخانات لصورة نظام عامة (GSI) وصورة مضيفة.
Gatekeeper HAL
يجب أن يتوافق Gatekeeper HAL مع قيم USER_ID
الكبيرة، لأنّ GSI يعوّض أرقام التعريف الفريدة (UID) إلى HAL بمقدار 1000000+.
التحقّق من عملية التشغيل
إذا كنت تريد إتاحة إمكانية تشغيل صور نظام GSI للمطوّرين
في حالة LOCKED بدون إيقاف
التشغيل الآمن الذي تم التحقّق منه، عليك تضمين مفاتيح صور نظام GSI للمطوّرين من خلال إضافة السطر التالي
إلى الملف device/<device_name>/device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)
الحماية من العودة إلى الحالة السابقة
عند استخدام ميزة "تحديث النظام"، يجب أن تكون نسخة نظام Android التي تم تنزيلها أحدث من نسخة النظام الحالية على الجهاز. ويتم ذلك من خلال مقارنة مستويات رمز تصحيح الأمان في عملية التحقّق من صحة التشغيل في Android (AVB) وصف خاصية AVB لكلتا صورتَي النظام: Prop: com.android.build.system.security_patch ->
'2019-04-05'
.
بالنسبة إلى الأجهزة التي لا تستخدم AVB، ضَع مستوى رمز تصحيح الأمان لصورة النظام الحالية في سطر أوامر النواة أو bootconfig مع برنامج الإقلاع:
androidboot.system.security_patch=2019-04-05
.
متطلبات الأجهزة
عند تشغيل مثيل DSU، يتم تخصيص ملفَين مؤقتَين:
- قسم منطقي لتخزين
GSI.img
(من 1 إلى 1.5 غيغابايت) - قسم
/data
فارغ بسعة 8 غيغابايت ليكون بيئة الاختبار المعزولة التي يتم فيها تشغيل GSI
ننصحك بحجز مساحة خالية تبلغ 10 غيغابايت على الأقل قبل تشغيل آلة افتراضية من نوع DSU. تتيح ميزة "نظام التشغيل المزدوج" أيضًا إمكانية التخصيص من بطاقة SD. عند توفّر بطاقة SD، تكون لها الأولوية القصوى في التخصيص. تُعد إمكانية استخدام بطاقة SD أمرًا بالغ الأهمية للأجهزة ذات الطاقة المنخفضة التي قد لا تتوفّر فيها مساحة تخزين داخلية كافية. عند توفّر بطاقة SD، تأكَّد من عدم استخدامها كوحدة تخزين داخلية. لا تتوافق ميزة "نظام التشغيل المزدوج" مع بطاقات SD المعتمدة.
الواجهات الأمامية المتاحة
يمكنك تشغيل DSU باستخدام adb
أو تطبيق من الشركة المصنّعة للجهاز الأصلي أو أداة تحميل DSU بنقرة واحدة (في نظام التشغيل Android 11 أو الإصدارات الأحدث).
تشغيل ميزة "مساحة عمل ثانية" باستخدام adb
لتشغيل DSU باستخدام adb، أدخِل الأوامر التالية:
$ simg2img out/target/product/.../system.img system.raw
$ gzip -c system.raw > system.raw.gz
$ adb push system.raw.gz /storage/emulated/0/Download
$ adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system.raw.gz \
--el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1) \
--el KEY_USERDATA_SIZE 8589934592
تشغيل DSU باستخدام تطبيق
نقطة الدخول الرئيسية إلى DSU هي android.os.image.DynamicSystemClient.java
API:
public class DynamicSystemClient {
...
...
/**
* Start installing DynamicSystem from URL with default userdata size.
*
* @param systemUrl A network URL or a file URL to system image.
* @param systemSize size of system image.
*/
public void start(String systemUrl, long systemSize) {
start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
}
يجب تجميع هذا التطبيق أو تثبيته مسبقًا على الجهاز. بما أنّ
DynamicSystemClient
هي واجهة برمجة تطبيقات خاصة بالنظام، لا يمكنك إنشاء التطبيق باستخدام واجهة برمجة التطبيقات العادية لحزمة SDK، ولا يمكنك نشره على Google Play. الغرض من هذا التطبيق هو:
- استرداد قائمة صور وعنوان URL المقابل باستخدام مخطط محدّد من المورّد
- مطابقة الصور في القائمة مع الجهاز وعرض الصور المتوافقة ليختارها المستخدم
يمكنك استدعاء
DynamicSystemClient.start
على النحو التالي:DynamicSystemClient aot = new DynamicSystemClient(...) aot.start( ...URL of the selected image..., ...uncompressed size of the selected image...);
يشير عنوان URL إلى ملف صورة نظام مضغوط بتنسيق gzip وغير متفرّق، ويمكنك إنشاء هذا الملف باستخدام الأوامر التالية:
$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz
يجب أن يتّبع اسم الملف التنسيق التالي:
<android version>.<lunch name>.<user defined title>.raw.gz
أمثلة:
o.aosp_taimen-userdebug.2018dev.raw.gz
p.aosp_taimen-userdebug.2018dev.raw.gz
أداة تحميل DSU بنقرة واحدة
يقدّم نظام التشغيل Android 11 أداة تحميل DSU بنقرة واحدة، وهي واجهة أمامية في إعدادات المطوّرين.
الشكل 1. بدء تشغيل أداة تحميل DSU
عندما ينقر المطوّر على الزر DSU Loader، يتم جلب وصف JSON مُعدّ مسبقًا لـ DSU من الويب وعرض جميع الصور السارية في القائمة العائمة. اختَر صورة لبدء عملية تثبيت DSU، وسيظهر مستوى التقدّم في شريط الإشعارات.
الشكل 2. مستوى تقدّم عملية تثبيت صورة DSU
بشكلٍ تلقائي، يحمّل برنامج DSU أداة تحميل وصف JSON تحتوي على صور GSI. توضّح الأقسام التالية كيفية إنشاء حِزم DSU موقّعة من الشركة المصنّعة للجهاز الأصلي وتحميلها من أداة تحميل DSU.
مفتاح إيقاف أو تفعيل الميزات
تتوفّر ميزة "تحديث النظام بدون انقطاع" ضمن علامة الميزة settings_dynamic_android
. قبل استخدام DSU، تأكَّد من تفعيل علامة الميزة ذات الصلة.
الشكل 3. تفعيل مفتاح إيقاف أو تفعيل الميزة
قد لا تكون واجهة مستخدم علامات الميزات متاحة على جهاز يعمل بإصدار مخصّص للمستخدمين. في هذه الحالة، استخدِم الأمر adb
بدلاً من ذلك:
$ adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1
استضافة صور نظام المورّد على "محرك حساب Google" (اختياري)
إحدى الأماكن المحتملة لتخزين صور النظام هي حزمة Google Compute Engine (GCE). يستخدم مشرف الإصدار وحدة تحكّم التخزين في Google Cloud Platform لإضافة/حذف/تغيير صورة نظام الإصدار.
يجب أن تكون الصور متاحة للجميع، كما هو موضّح هنا:
الشكل 4. إتاحة الوصول للجميع في GCE
يتوفّر إجراء إتاحة عنصر للجميع في مستندات Google Cloud.
ملف DSU متعدد الأقسام في ملف ZIP
بدءًا من الإصدار 11 من نظام التشغيل Android، يمكن أن تتضمّن ميزة "إعداد ثنائي التمهيد" أكثر من قسم واحد. على سبيل المثال، يمكن أن يحتوي على product.img
بالإضافة إلى system.img
. عند تشغيل الجهاز، ترصد المرحلة الأولى init
أقسام DSU المثبَّتة وتستبدل القسم الموجود على الجهاز مؤقتًا عند تفعيل DSU المثبَّت. قد تحتوي حزمة DSU على قسم لا يتضمّن قسمًا مطابقًا على الجهاز.
الشكل 5. عملية DSU مع أقسام متعددة
حزمة DSU موقّعة من الشركة المصنّعة الأصلية
للتأكّد من أنّ جميع الصور التي يتم تشغيلها على الجهاز معتمَدة من الشركة المصنّعة للجهاز، يجب توقيع جميع الصور ضِمن حزمة DSU. على سبيل المثال، لنفترض أنّ هناك حزمة DSU تحتوي على صورتَي قسم كما هو موضّح أدناه:
dsu.zip {
- system.img
- product.img
}
يجب توقيع كل من system.img
وproduct.img
باستخدام مفتاح الشركة المصنّعة للجهاز الأصلي قبل وضعهما في ملف ZIP. تتمثّل الممارسة الشائعة في استخدام خوارزمية غير متماثلة، مثل RSA، حيث يتم استخدام المفتاح السري لتوقيع الحزمة ويتم استخدام المفتاح العام للتحقّق منها. يجب أن يتضمّن ملف ramdisk في المرحلة الأولى المفتاح العام الخاص بعملية الاقتران، مثل /avb/*.avbpubkey
. إذا كان الجهاز يستخدم ميزة AVB، سيكون إجراء التوقيع الحالي كافيًا. توضّح الأقسام التالية عملية التوقيع وتسلّط الضوء على موضع مفتاح AVB العام المستخدَم للتحقّق من الصور في حزمة DSU.
واصف JSON الخاص بخدمة DSU
يصف واصف JSON لحزمة DSU حِزم DSU. وهي تتوافق مع عنصرَين أساسيَّين.
أولاً، يتضمّن العنصر الأساسي include
واصفات JSON إضافية أو يعيد توجيه أداة تحميل DSU إلى موقع جديد. مثلاً:
{
"include": ["https://.../gsi-release/gsi-src.json"]
}
ثانيًا، يتم استخدام العنصر الأساسي image
لوصف حِزم DSU التي تم إصدارها. داخل عنصر الصورة الأساسي، تتوفّر عدة سمات:
السمتان
name
وdetails
هما سلسلتا أحرف تظهران في مربّع الحوار ليختار منهما المستخدم.تُستخدَم السمات
cpu_api
وvndk
وos_version
لإجراء عمليات التحقّق من التوافق، كما هو موضّح في القسم التالي.تصف السمة الاختيارية
pubkey
المفتاح العام الذي يقترن بالمفتاح السري المستخدَم لتوقيع حزمة DSU. عند تحديد هذا الخيار، يمكن لخدمة DSU التحقّق مما إذا كان الجهاز يتضمّن المفتاح المستخدَم للتحقّق من حزمة DSU. يؤدي ذلك إلى تجنُّب تثبيت حزمة DSU غير معروفة، مثل تثبيت حزمة DSU وقّعتها الشركة المصنّعة الأصلية (OEM) A على جهاز من تصنيع الشركة المصنّعة الأصلية (OEM) B.تشير السمة الاختيارية
tos
إلى ملف نصي يصف بنود الخدمة لحزمة DSU المعنية. عندما يختار المطوّر حزمة DSU مع تحديد سمة بنود الخدمة، يظهر مربّع الحوار الموضّح في الشكل 6، ويطلب من المطوّر قبول بنود الخدمة قبل تثبيت حزمة DSU.الشكل 6. مربّع حوار بنود الخدمة
للعلم، إليك واصف DSU بتنسيق JSON الخاص بنظام GSI:
{
"images":[
{
"name":"GSI+GMS x86",
"os_version":"10",
"cpu_abi": "x86",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
"uri":"https://.../gsi/gsi_gms_x86-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI+GMS ARM64",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
"uri":"https://.../gsi/gsi_gms_arm64-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI ARM64",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"uri":"https://.../gsi/aosp_arm64-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI x86_64",
"os_version":"10",
"cpu_abi": "x86_64",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"uri":"https://.../gsi/aosp_x86_64-exp-QP1A.190711.020.C4-5928301.zip"
}
]
}
إدارة التوافق
يتم استخدام عدة سمات لتحديد التوافق بين حزمة DSU والجهاز المحلي:
cpu_api
هي سلسلة تصف بنية الجهاز. هذه السمة إلزامية ويتم مقارنتها بسمة النظامro.product.cpu.abi
. ويجب أن تتطابق قيمهما تمامًا.
os_version
هو عدد صحيح اختياري يحدّد إصدار Android. على سبيل المثال، في الإصدار 10 من نظام التشغيل Android، تكون قيمةos_version
هي10
، وفي الإصدار 11 من نظام التشغيل Android، تكون قيمةos_version
هي11
. عند تحديد هذه السمة، يجب أن تكون قيمتها مساوية لقيمة سمة النظامro.system.build.version.release
أو أكبر منها. يتم استخدام هذا الإجراء لمنع تشغيل صورة GSI لنظام Android 10 على جهاز مزوّد بنظام Android 11، وهو أمر غير متاح حاليًا. يُسمح بتشغيل صورة GSI لنظام التشغيل Android 11 على جهاز Android 10.
vndk
هي مصفوفة اختيارية تحدّد جميع حِزم VNDK المضمّنة في حزمة DSU. عند تحديدها، يتحقّق برنامج تحميل DSU مما إذا كان الرقم المستخرَج من سمة النظامro.vndk.version
مضمّنًا.
إبطال مفاتيح DSU لأسباب أمنية
في الحالات النادرة جدًا التي يتم فيها اختراق زوج مفاتيح RSA المستخدَم لتوقيع صور DSU، يجب تعديل قرص ذاكرة الوصول العشوائي في أقرب وقت ممكن لإزالة المفتاح المخترَق. بالإضافة إلى تعديل قسم التشغيل، يمكنك حظر المفاتيح المخترَقة باستخدام قائمة إبطال مفاتيح DSU (قائمة المفاتيح المحظورة) من عنوان URL عبر HTTPS.
تحتوي قائمة إبطال مفاتيح DSU على قائمة بالمفاتيح العامة التي تم إبطالها في AVB. أثناء تثبيت DSU، يتم التحقّق من صحة المفاتيح العامة داخل صور DSU باستخدام قائمة الإبطال. إذا تبيّن أنّ الصور تحتوي على مفتاح عام تم إبطاله، تتوقف عملية تثبيت DSU.
يجب أن يكون عنوان URL لقائمة إبطال المفاتيح هو عنوان URL يستخدِم HTTPS لضمان قوة الأمان، ويتم تحديده في سلسلة موارد:
frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url
قيمة السلسلة هي
https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json
، وهي
قائمة إبطال لمفاتيح GSI التي أصدرتها Google. يمكن عرض سلسلة الموارد هذه وتخصيصها، ما يتيح لمصنّعي المعدات الأصلية الذين يستخدمون ميزة "تحديث النظام الذكي" توفير قائمة سوداء خاصة بهم بالمفاتيح والحفاظ عليها. ويوفّر ذلك طريقة لمصنّع المعدات الأصلية لحظر بعض المفاتيح العامة بدون تعديل صورة ramdisk للجهاز.
يكون تنسيق قائمة الإبطال على النحو التالي:
{
"entries":[
{
"public_key":"bf14e439d1acf231095c4109f94f00fc473148e6",
"status":"REVOKED",
"reason":"Key revocation test key"
},
{
"public_key":"d199b2f29f3dc224cca778a7544ea89470cbef46",
"status":"REVOKED",
"reason":"Key revocation test key"
}
]
}
-
public_key
هو ملخّص SHA-1 للمفتاح الذي تم إبطاله، بالتنسيق الموضّح في قسم إنشاء المفتاح العام لـ AVB. - يشير
status
إلى حالة إبطال المفتاح. القيمة الوحيدة المتاحة حاليًا هيREVOKED
. -
reason
هي سلسلة اختيارية تصف سبب الإبطال.
إجراءات DSU
يوضّح هذا القسم كيفية تنفيذ العديد من إجراءات إعداد DSU.
إنشاء زوج مفاتيح جديد
استخدِم الأمر openssl
لإنشاء مفتاحَي تشفير RSA خاص/عام بتنسيق .pem
(على سبيل المثال، بحجم 2048 بت):
$ openssl genrsa -out oem_cert_pri.pem 2048
$ openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem
قد لا يكون المفتاح الخاص متاحًا ويتم الاحتفاظ به فقط في وحدة أمان الأجهزة (HSM). في هذه الحالة، قد تتوفّر شهادة مفتاح عام x509 بعد إنشاء المفتاح. راجِع قسم إضافة المفتاح العام الخاص بعملية الاقتران إلى ramdisk للحصول على تعليمات حول إنشاء المفتاح العام الخاص بـ AVB من شهادة x509.
لتحويل شهادة x509 إلى تنسيق PEM، اتّبِع الخطوات التالية:
$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem
تخطَّ هذه الخطوة إذا كانت الشهادة ملف PEM.
إضافة مفتاح التزاوج العام إلى ramdisk
يجب وضع oem_cert.avbpubkey
ضمن /avb/*.avbpubkey
للتحقّق من حزمة DSU الموقّعة. أولاً، عليك تحويل المفتاح العام بتنسيق PEM إلى تنسيق المفتاح العام لبرنامج AVB:
$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey
بعد ذلك، أدرِج المفتاح العام في قرص ذاكرة الوصول العشوائي للمرحلة الأولى باتّباع الخطوات التالية.
أضِف وحدة مسبقة الإنشاء لنسخ
avbpubkey
. على سبيل المثال، أضِفdevice/<company>/<board>/oem_cert.avbpubkey
وdevice/<company>/<board>/avb/Android.mk
مع محتوى مثل هذا:include $(CLEAR_VARS) LOCAL_MODULE := oem_cert.avbpubkey LOCAL_MODULE_CLASS := ETC LOCAL_SRC_FILES := $(LOCAL_MODULE) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb else LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb endif include $(BUILD_PREBUILT)
اجعل هدف droidcore يعتمد على
oem_cert.avbpubkey
المضاف:droidcore: oem_cert.avbpubkey
إنشاء السمة pubkey الخاصة بـ AVB في واصف JSON
يكون oem_cert.avbpubkey
بتنسيق ثنائي للمفتاح العام في AVB. استخدِم SHA-1 لجعلها قابلة للقراءة قبل وضعها في واصف JSON:
$ sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
3e62f2be9d9d813ef5........866ac72a51fd20
سيكون هذا هو محتوى السمة pubkey
الخاصة بوصف JSON.
"images":[
{
...
"pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
...
},
توقيع حزمة DSU
استخدِم إحدى الطرق التالية لتوقيع حزمة DSU:
الطريقة 1: إعادة استخدام العنصر الذي تم إنشاؤه من خلال عملية توقيع AVB الأصلية لإنشاء حزمة DSU. هناك طريقة بديلة تتمثل في استخراج الصور الموقَّعة مسبقًا من حزمة الإصدار واستخدام الصور المستخرَجة لإنشاء ملف ZIP مباشرةً.
الطريقة 2: استخدِم الأوامر التالية لتوقيع أقسام DSU إذا كان المفتاح الخاص متاحًا. يتم توقيع كل
img
داخل حزمة DSU (ملف ZIP) بشكل منفصل:$ key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/') $ for partition in system product; do avbtool add_hashtree_footer \ --image ${OUT}/${partition}.img \ --partition_name ${partition} \ --algorithm SHA256_RSA${key_len} \ --key oem_cert_pri.pem done
لمزيد من المعلومات حول إضافة add_hashtree_footer
باستخدام avbtool
، يُرجى الاطّلاع على
استخدام avbtool.
تأكيد حزمة DSU محليًا
يُنصح بالتحقّق من صحة جميع الصور المحلية باستخدام المفتاح العام الخاص بعملية الإقران من خلال تنفيذ الأوامر التالية:
for partition in system product; do
avbtool verify_image --image ${OUT}/${partition}.img --key oem_cert_pub.pem
done
يظهر الناتج المتوقّع على النحو التالي:
Verifying image dsu/system.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img
: Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes
Verifying image dsu/product.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img
: Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes
إنشاء حزمة DSU
يوضّح المثال التالي كيفية إنشاء حزمة DSU تحتوي على system.img
وproduct.img
:
dsu.zip {
- system.img
- product.img
}
بعد توقيع كلتا الصورتين، استخدِم الأمر التالي لإنشاء ملف ZIP:
$ mkdir -p dsu
$ cp ${OUT}/system.img dsu
$ cp ${OUT}/product.img dsu
$ cd dsu && zip ../dsu.zip *.img && cd -
تخصيص ميزة "التحقّق من حالة الجهاز" بنقرة واحدة
يشير برنامج تحميل DSU تلقائيًا إلى بيانات وصفية لصور GSI، وهي
https://...google.com/.../gsi-src.json
.
يمكن لمصنّعي المعدات الأصلية استبدال القائمة من خلال تحديد السمة persist.sys.fflag.override.settings_dynamic_system.list
التي تشير إلى واصف JSON الخاص بهم. على سبيل المثال، يمكن لمصنّع المعدات الأصلية توفير بيانات وصفية بتنسيق JSON تتضمّن صورة نظام التشغيل العام (GSI) بالإضافة إلى صور خاصة بمصنّع المعدات الأصلية، مثل ما يلي:
{
"include": ["https://dl.google.com/.../gsi-src.JSON"]
"images":[
{
"name":"OEM image",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"...",
"vndk":[
27,
28,
29
],
"spl":"...",
"pubkey":"",
"uri":"https://.../....zip"
},
}
يمكن لمصنّع المعدات الأصلية ربط البيانات الوصفية المنشورة لوحدة DSU كما هو موضّح في الشكل 7.
الشكل 7. تسلسل البيانات الوصفية المنشورة لوحدة تخزين البيانات