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

تتيح لك تحديثات النظام الديناميكية (DSU) إنشاء نسخة نظام Android يمكن للمستخدمين التنزيل من الإنترنت وتجربته بدون المخاطرة بالتلف صورة النظام الحالية. يوضّح هذا المستند كيفية إتاحة DSU.

متطلبات النواة (Kernel)

عرض تنفيذ الأقسام الديناميكية لمتطلبات النواة (النواة).

بالإضافة إلى ذلك، يعتمد DSU على ميزة نواة خرائط الأجهزة (dm-verity). للتحقق من صورة نظام Android. لذلك يجب تمكين النواة التالية الإعدادات:

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

متطلبات الأقسام

بدءًا من نظام التشغيل Android 11، يتطلب DSU توفُّر /data لاستخدام نظام الملفات F2FS أو ext4. تمنحك F2FS أداءً أفضل ، ولكن يجب أن يكون الفرق ضئيلاً.

في ما يلي بعض الأمثلة على المدة التي يستغرقها تحديث النظام الديناميكي باستخدام هاتف Pixel الجهاز:

  • استخدام F2FS:
    • 109s، مستخدم 8G، نظام 867M، نوع نظام الملفات: F2FS: export=aes-256-xts:aes-256-cts
    • 104s، مستخدم 8G، نظام 867M، نوع نظام الملفات: F2FS: التشفير=ice
  • استخدام ext4:
    • 135s، مستخدم 8G، نظام 867M، نوع نظام الملفات: ext4: export=aes-256-xts:aes-256-cts

إذا استغرقت وقتًا أطول على المنصّة، ننصحك بالتحقق ممّا إذا كانت قاعدة التثبيت تحتوي العلامة على أي علامة تجعل خيار "المزامنة" تكتب، أو يمكنك تحديد قيمة "غير متزامن" والإبلاغ عنه بشكل واضح للحصول على أداء أفضل.

يجب توفير قسم metadata (بحجم 16 ميغابايت أو أكثر) لتخزين البيانات ذات الصلة. إلى الصور المثبّتة. يجب تثبيته أثناء تثبيت المرحلة الأولى.

يجب أن يستخدم قسم userdata نظام الملفات F2FS أو ext4. عند استخدام F2FS تضمين جميع التصحيحات ذات الصلة بـ F2FS المتوفرة في النواة المشتركة في Android

تم تطوير DSU واختباره باستخدام kernel/common 4.9. يُنصح باستخدامها الإصدار 4.9 والإصدارات الأحدث من هذه الميزة.

سلوك HAL للمورّد

قناة Weaver HAL

يوفر HAL للنحاس عددًا ثابتًا من الفتحات لتخزين مفاتيح المستخدم. DSU خانتين رئيسيتين إضافيتين. إذا كان المصنّع الأصلي للجهاز لديه طبقة تجريد الأجهزة (HAL) للنحاس، يجب أن يكون خانات كافية لصورة نظام عامة (GSI) وصورة مضيف

طبقة تجريد الأجهزة (HAL) بحارسة البوابة

يحتاج Gatekeeper HAL إلى: تدعم قيم USER_ID الكبيرة، لأن GSI تعوض المعرفات الفريدة لـ HAL عن طريق +1000000.

التأكّد من التشغيل

إذا كنت تريد إتاحة تشغيل صور 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 G)
  • قسم /data فارغ بسعة 8 غيغابايت كوضع حماية لتشغيل GSI

ننصح بحجز ما لا يقل عن 10 غيغابايت من المساحة الخالية قبل إطلاق DSU مثال. ويتيح DSU أيضًا التخصيص من بطاقة SD. عند تشغيل بطاقة SD حاليًا، فإنها تتمتع بالأولوية القصوى للتخصيص. دعم بطاقة SD هو أمرًا بالغ الأهمية للأجهزة منخفضة الطاقة التي قد لا تحتوي على وحدة تخزين داخلية كافية. عند وجود بطاقة SD، تأكد من أنها غير مستخدمة. لا يتوافق DSU مع بطاقات SD التي تم اعتمادها

الواجهات الأمامية المتاحة

يمكنك تشغيل DSU باستخدام adb، أو تطبيق من تطبيقات المصنّع الأصلي للجهاز، أو أداة تحميل DSU بنقرة واحدة (في Android 11 أو إصدار أحدث).

إطلاق 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 API ولا يمكنك نشرها على 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، يسترجع أداة تم إعدادها مسبقًا. واصف JSON لـ DSU من الويب ويعرض جميع الصور القابلة للتطبيق في القائمة العائمة. اختيار صورة لبدء تثبيت DSU والتقدم تظهر في شريط الإشعارات.

مستوى تقدُّم تثبيت صورة 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

صور النظام لمضيف المورّد على GCE (اختياري)

أحد مواقع التخزين المحتملة لصور النظام هو موقع تخزين الصور على حزمة Compute Engine (GCE) يستخدم مشرف الإصدار وحدة التحكّم الخاصة بمساحة التخزين في Google Cloud Platform إضافة/حذف/تغيير صورة النظام التي تم إصدارها.

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

إتاحة الوصول للجميع في خدمة Google Compute Engine (GCE)

الشكل 4. إتاحة الوصول للجميع في خدمة Google Compute Engine (GCE)

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

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

بدءًا من نظام التشغيل Android 11، يمكن أن يحتوي DSU على أكثر من تطبيق قسم القرص. على سبيل المثال، يمكن أن يحتوي على 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، حيث يُستخدم المفتاح السري لتوقيع الحزمة يُستخدم المفتاح العام للتحقق منه. يجب أن تتضمن المرحلة الأولى من الهدم علامة التقطيع المفتاح العام، مثل /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 موقَّع من المصنّع الأصلي للجهاز على جهاز من صنع المصنّع الأصلي للجهاز-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. بالنسبة على سبيل المثال، في نظام Android 10، تبلغ قيمة os_version 10 بالنسبة إلى نظام التشغيل Android 11، تبلغ قيمة "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 (قائمة سوداء للمفاتيح) من بروتوكول HTTPS عنوان URL.

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

تنسيق قائمة الإبطال هو:

{
   "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 إلى قرص ذاكرة التخزين المؤقت. للاطلاع على تعليمات إنشاء مفتاح 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

بعد ذلك، قم بتضمين المفتاح العام في المرحلة الأولى من القرص المتداخل بالخطوات التالية.

  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
    

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

  • الطريقة 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 بنقرة واحدة

توجه أداة تحميل 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.

سلسلة البيانات الوصفية المنشورة DSU

الشكل 7. سلسلة البيانات الوصفية المنشورة DSU