تتيح لك ميزة "التحديثات الديناميكية للنظام" (DSU) إنشاء صورة نظام Android يمكن للمستخدمين تنزيلها من الإنترنت وتجربتها بدون المخاطرة بتلف صورة النظام الحالية. يوضّح هذا المستند كيفية إتاحة DSU.
متطلبات النواة
اطّلِع على مقالة تنفيذ الأقسام الديناميكية للاطّلاع على متطلبات النواة.
علاوة على ذلك، يعتمد DSU على ميزة نواة خرائط الأجهزة (dm-verity) للتحقق من صورة نظام Android. لذلك، عليك تفعيل ملفَّي ملفَّات برمجة kernel التالية:
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
متطلبات التقسيم
بدءًا من نظام التشغيل Android 11، يتطلّب DSU من القسم /data
أن يستخدم نظام الملفات F2FS أو ext4. تقدّم طريقة F2FS أداءً أفضل
ويُنصح باستخدامها، لكن من المفترض أن يكون الفرق بسيطًا.
في ما يلي بعض الأمثلة على المدة التي يستغرقها جهاز Pixel لتحديث النظام الديناميكي:
- استخدام نظام الملفات F2FS:
- 109 ثانية، 8 غيغابايت للمستخدم، 867 ميغابايت للنظام، نوع نظام الملفات: F2FS: encryption=aes-256-xts:aes-256-cts
- 104s، مستخدم 8G، نظام 867M، نوع نظام الملفات: F2FS: التشفير=ice
- باستخدام ext4:
- 135s، مستخدم 8G، نظام 867M، نوع نظام الملفات: ext4: encryption=aes-256-xts:aes-256-cts
إذا استغرقت وقتًا أطول على المنصّة، ننصحك بالتحقق ممّا إذا كانت علامة التثبيت تتضمّن أي علامة تؤدي إلى كتابة "المزامنة" أو يمكنك تحديد علامة "غير متزامن" بشكلٍ صريح للحصول على أداء أفضل.
يجب توفُّر قسم metadata
(16 ميغابايت أو أكثر) لتخزين البيانات ذات الصلة
بالصور المثبَّتة. يجب تثبيته أثناء تثبيت المرحلة الأولى.
يجب أن يستخدم قسم userdata
نظام الملفات F2FS أو ext4. عند استخدام F2FS، عليك تضمين جميع رموز التصحيح المتوفرة في النواة المشتركة في Android.
تم تطوير أداة DSU واختبارها باستخدام kernel/common 4.9. يوصى باستخدام النواة 4.9 والإصدارات الأعلى لهذه الميزة.
سلوك HAL للمورّد
قناة Weaver HAL
يوفر HAL للنحاس عددًا ثابتًا من الفتحات لتخزين مفاتيح المستخدم. يستهلك DSU خانتين رئيسيتين إضافيتين. إذا كان لدى المصنّع الأصلي للجهاز حزمة HAL لجهاز الربط، يجب أن تتوفّر لديه مَواضع كافية لصورة نظام عامة (GSI) وصورة مضيف.
واجهة برمجة التطبيقات لطبقة تجريد الأجهزة في موفِّر الخدمات
يجب أن يقبل HAL الخاص بـ Gatekeeper
قيم USER_ID
كبيرة، لأنّ واجهة GSI تضيف 1000000 إلى معرّفات المستخدمين في HAL.
التأكّد من التشغيل
إذا كنت تريد تفعيل إمكانية تشغيل صور GSI للمطوّرين
في حالة القفل بدون إيقاف
التشغيل المؤكَّد، عليك تضمين مفاتيح GSI للمطوّرين من خلال إضافة السطر التالي
إلى الملف device/<device_name>/device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)
الحماية من الرجوع إلى الحالة السابقة
عند استخدام أداة DSU، يجب أن تكون صورة نظام Android التي تم تنزيلها أحدث من
صورة النظام الحالية على الجهاز. ويتم ذلك من خلال مقارنة مستويات تصحيحات الأمان في التشغيل المُتحقّق منه من خلال Android (AVB)
وصف خاصية AVB
لكلتا صورتَي النظام: Prop: com.android.build.system.security_patch ->
'2019-04-05'
.
في الأجهزة التي لا تستخدم AVB، يمكنك وضع مستوى رمز تصحيح الأمان لصورة النظام الحالية
في kernel cmdline أو Bootconfig باستخدام برنامج الإقلاع:
androidboot.system.security_patch=2019-04-05
.
متطلبات الأجهزة
عند تشغيل مثيل DSU، يتم تخصيص ملفين مؤقتين:
- قسم منطقي لتخزين
GSI.img
(من 1 إلى 1.5 جيغابايت) - قسم
/data
فارغ بسعة 8 غيغابايت كوضع حماية لتشغيل GSI
ننصحك بحجز ما لا يقل عن 10 غيغابايت من المساحة الخالية قبل إطلاق مثيل DSU. يدعم DSU أيضًا التخصيص من بطاقة SD. عند وجود بطاقة SD، تكون لها الأولوية القصوى للتخصيص. يُعد دعم بطاقة SD أمرًا ضروريًا للأجهزة منخفضة الطاقة التي قد لا تحتوي على وحدة تخزين داخلية كافية. عند وجود بطاقة SD، تأكد من أنها غير مستخدمة. لا تتوافق DSU مع بطاقات SD التي يتم اعتمادها.
الواجهات الأمامية المتاحة
يمكنك إطلاق DSU باستخدام adb
، أو أحد تطبيقات المصنّع الأصلي للجهاز، أو أداة تحميل DSU بنقرة واحدة (في الإصدار 11 من Android أو الإصدارات الأحدث).
تشغيل أداة DSU باستخدام 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
واجهة برمجة التطبيقات:
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 (أداة تحميل DSU)، يتم جلب وصف DSU JSON الذي تم ضبطه مسبقًا من الويب وعرض كل الصور السارية في الجدول المتغير في الشاشة. اختَر صورة لبدء تثبيت DSU، وسيظهر مستوى التقدّم في شريط الإشعارات.
الشكل 2: مستوى تقدُّم تثبيت صورة DSU
تحمِّل أداة تحميل DSU تلقائيًا واصف JSON يحتوي على صور GSI. توضّح الأقسام التالية كيفية إنشاء حزم DSU الموقَّعة من المصنّع الأصلي للجهاز وتحميلها من أداة تحميل DSU.
علامة ميزة
تتوفّر ميزة DSU ضمن علامة الميزة settings_dynamic_android
. قبل استخدام DSU، تأكَّد من تفعيل علامة الميزة المقابلة.
الشكل 3. تفعيل ميزة "تبديل أوضاع الميزات"
قد لا تكون واجهة المستخدم التي تحمل علامة الميزة متاحة على جهاز يعمل بإصدار مستخدم. في
هذه الحالة، استخدِم الأمر adb
بدلاً من ذلك:
$ adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1
استضافة موفِّر الصور للنظام على Google Compute Engine (اختياري)
أحد مواقع التخزين المحتملة لصور النظام هي حزمة Google Compute Engine (GCE). يستخدم مشرف الإصدار وحدة تحكّم مساحة التخزين في Google Cloud Platform للقيام بعمليات إضافة/حذف/تغيير صورة النظام التي تم إصدارها.
يجب أن تكون الصور متاحة للجميع، كما هو موضّح هنا:
الشكل 4. إتاحة الوصول للجميع في خدمة Google Compute Engine (GCE)
يتوفّر إجراء إتاحة العنصر للجميع في مستندات Google Cloud.
حزمة DSU متعددة الأقسام في ملف ZIP
بدءًا من نظام التشغيل Android 11، يمكن أن يحتوي DSU
على أكثر من قسم واحد. على سبيل المثال، يمكن أن يحتوي على 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 في المرحلة الأولى مفتاح pairing
العام، على سبيل المثال /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 موقَّعة من الشركة المصنّعة "أ" على جهاز من الشركة المصنّعة "ب".تشير السمة الاختيارية
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. على سبيل المثال، في Android 10، يمثّل الرمزos_version
الرمز10
، ويمثّل الرمزos_version
الرمز11
في Android 11. عند تحديد هذه السمة، يجب أن تكون مساوية لسمة النظامro.system.build.version.release
أو أكبر منها. تُستخدم هذه العملية لمنع تشغيل صورة GSI التي تعمل بالإصدار 10 من نظام التشغيل Android على جهاز مورّد يعمل بالإصدار 11 من نظام التشغيل Android، وهو غير متاح حاليًا. يُسمح بتشغيل صورة GSI لنظام التشغيل Android 11 على جهاز Android 10.vndk
هي مصفوفة اختيارية تحدّد جميع حِزم VNDK المضمّنة في حزمة DSU. عند تحديده، يتحقّق أداة تحميل DSU ممّا إذا كان الرقم المستخرَج من سمة النظامro.vndk.version
مضمّنًا.
إبطال مفاتيح DSU لأغراض الأمان
في الحالة النادرة جدًا التي يتم فيها الكشف عن ثغرة أمنية في مفتاحَي RSA المُستخدَمَين لتوقيع صور DSU، يجب تعديل ملف ramdisk في أقرب وقت ممكن لإزالة المفتاح الذي تم الكشف عن ثغرة أمنية فيه. بالإضافة إلى تعديل قسم التمهيد، يمكنك حظر المفاتيح المُخترَقة باستخدام قائمة إبطال مفاتيح 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. يمكن دمج سلسلة الموارد هذه
وتخصيصها، حتى يتمكّن المصنّعون الأصليون للأجهزة الذين يتّبعون ميزة DSU من تقديم قائمتهم السوداء للمفاتيح
والاحتفاظ بها. يوفر ذلك طريقة لمصنعي المعدّات الأصلية لحظر
مفاتيح عامة معيّنة بدون تعديل صورة ذاكرة الوصول العشوائي (RAM) للجهاز.
تنسيق قائمة الإبطال هو:
{
"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 متاحة بعد إنشاء المفتاح. يمكنك الاطّلاع على قسم إضافة مفتاح pubkey للإقران إلى ramdisk للحصول على تعليمات حول إنشاء مفتاح AVB العام من شهادة x509.
لتحويل شهادة x509 إلى تنسيق PEM:
$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem
يمكنك تخطّي هذه الخطوة إذا كانت الشهادة ملف PEM من قبل.
إضافة مفتاح pubkey المقترن إلى ramdisk
يجب وضع oem_cert.avbpubkey
ضمن /avb/*.avbpubkey
للتحقّق من حزمة DSU الموقَّعة. أولاً، عليك تحويل المفتاح العام بتنسيق PEM إلى تنسيق المفتاح
العام AVB:
$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey
بعد ذلك، أدرِج المفتاح العام في ذاكرة الوصول العشوائي (RAM) للخطوة الأولى باتّباع الخطوات التالية.
أضِف وحدة معدّة مسبقًا لنسخ
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
إنشاء سمة AVB pubkey في واصف 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: ربط البيانات الوصفية المنشورة لوحدة DSU