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

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

متطلبات النواة

راجِع مقالة تنفيذ الأقسام الديناميكية للاطّلاع على متطلبات kernel.

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

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

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

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

  • استخدام نظام الملفات F2FS:
    • ‫109 ثانية، 8 غيغابايت للمستخدم، 867 ميغابايت للنظام، نوع نظام الملفات: F2FS: encryption=aes-256-xts:aes-256-cts
    • ‫104 ثانية، مستخدم بسعة 8 غيغابايت، نظام بسعة 867 ميغابايت، نوع نظام الملفات: F2FS: encryption=ice
  • باستخدام ext4:
    • ‫135 ثانية، 8 غيغابايت للمستخدم، 867 ميغابايت للنظام، نوع نظام الملفات: ext4: encryption=aes-256-xts:aes-256-cts

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

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

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

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

سلوك طبقة HAL الخاصة بالمورّد

Weaver HAL

يوفّر weaver 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، ضَع مستوى تصحيح الأمان لملف رمز التمهيد الحالي في 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 غير مُستخدَمة عندما تكون متوفّرة. لا تتوافق ميزة "التخزين المؤقت على السحابة الإلكترونية" مع بطاقات 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 هي 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. الغرض من هذا التطبيق هو:

  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 (أداة تحميل DSU)، يتم جلب وصف DSU JSON الذي تم ضبطه مسبقًا من الويب وعرض كل الصور السارية في الجدول المتغير في الشاشة. اختَر صورة لبدء تثبيت 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

استضافة موفِّر الصور للنظام على Google Compute Engine (اختياري)

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

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

إتاحة الوصول للجميع في Google Cloud Engine

الشكل 4: إتاحة الوصول للجميع في Google Cloud Engine

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

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

بدءًا من الإصدار 11 من نظام التشغيل Android، يمكن أن يتضمّن نظام 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، حيث يتم استخدام المفتاح السري لتوقيع الحزمة ويتم استخدام المفتاح العام للتحقّق منها. يجب أن يتضمّن ملف ramdisk في المرحلة الأولى مفتاح pairing العام، على سبيل المثال، /avb/*.avbpubkey. إذا كان الجهاز قد اتّبع AVB من قبل، سيكون إجراء التوقيع الحالي كافيًا. توضِّح الأقسام التالية عملية التوقيع وتسلّط الضوء على موضع مفتاح AVB العام الذي يُستخدَم للتحقّق من الصور في حزمة DSU.

وصف DSU بتنسيق JSON

يصف وصف 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، وفي 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، يجب تعديل ملف 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

يصف هذا القسم كيفية تنفيذ العديد من إجراءات ضبط وحدة التحكّم في حدود الجلسة.

إنشاء مفتاحَي تشفير جديدَين

استخدِم الأمر 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 بعد إنشاء المفتاح. اطّلِع على قسم إضافة المفتاح العام للإقران إلى ذاكرة الوصول العشوائي المؤقت للحصول على تعليمات لإنشاء المفتاح العام لبروتوكول AVB من شهادة x509.

لتحويل شهادة x509 إلى تنسيق PEM:

$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem

يمكنك تخطّي هذه الخطوة إذا كانت الشهادة ملف PEM.

إضافة مفتاح التشفير العام للإقران إلى ذاكرة الوصول العشوائي

يجب وضع oem_cert.avbpubkey ضمن /avb/*.avbpubkey للتحقّق من حزمة DSU الموقَّعة. أولاً، عليك تحويل المفتاح العام بتنسيق PEM إلى تنسيق المفتاح العام لبروتوكول AVB:

$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey

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

  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 العام في الوصف بتنسيق 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.

ربط البيانات الوصفية المنشورة لوحدة DSU

الشكل 7: ربط البيانات الوصفية المنشورة لوحدة DSU