تحديثات النظام الديناميكية

تتيح لك "تحديثات النظام الديناميكية" (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. الغرض من هذا التطبيق هو:

  1. استرداد قائمة صور وعنوان URL المقابل باستخدام مخطط محدّد من المورّد
  2. مطابقة الصور في القائمة مع الجهاز وعرض الصور المتوافقة ليختارها المستخدم
  3. يمكنك استدعاء 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 بنقرة واحدة، وهي واجهة أمامية في إعدادات المطوّرين.

بدء تشغيل أداة تحميل DSU

الشكل 1. بدء تشغيل أداة تحميل DSU

عندما ينقر المطوّر على الزر DSU Loader، يتم جلب وصف JSON مُعدّ مسبقًا لـ DSU من الويب وعرض جميع الصور السارية في القائمة العائمة. اختَر صورة لبدء عملية تثبيت 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 لإضافة/حذف/تغيير صورة نظام الإصدار.

يجب أن تكون الصور متاحة للجميع، كما هو موضّح هنا:

إتاحة الوصول للجميع في GCE

الشكل 4. إتاحة الوصول للجميع في GCE

يتوفّر إجراء إتاحة عنصر للجميع في مستندات Google Cloud.

ملف DSU متعدد الأقسام في ملف ZIP

بدءًا من الإصدار 11 من نظام التشغيل Android، يمكن أن تتضمّن ميزة "إعداد ثنائي التمهيد" أكثر من قسم واحد. على سبيل المثال، يمكن أن يحتوي على product.img بالإضافة إلى system.img. عند تشغيل الجهاز، ترصد المرحلة الأولى init أقسام DSU المثبَّتة وتستبدل القسم الموجود على الجهاز مؤقتًا عند تفعيل 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

بعد ذلك، أدرِج المفتاح العام في قرص ذاكرة الوصول العشوائي للمرحلة الأولى باتّباع الخطوات التالية.

  1. أضِف وحدة مسبقة الإنشاء لنسخ 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)
    
  2. اجعل هدف 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. تسلسل البيانات الوصفية المنشورة لوحدة تخزين البيانات