حزم داخلية عبر الهواء

ينشئ النظام البرنامج الثنائي لأداة التحديث من bootable/recovery/updater ويستخدمه. في حزمة OTA.

الحزمة نفسها هي ملف zip. (ota_update.zip، incremental_ota_update.zip) الذي يحتوي على البرنامج الثنائي القابل للتنفيذ META-INF/com/google/android/update-binary

يحتوي برنامج التحديث على العديد من الدوال المضمنة ومترجم النصوص البرمجية القابلة للتوسُّع. (edify) التي تتوافق مع أوامر المهام العادية المتعلّقة بالتحديث. مظهر أداة التحديث في ملف zip .المضغوط لنص برمجي في الملف META-INF/com/google/android/updater-script

ملاحظة: إنّ استخدام edify script و/أو الدوال المضمَّنة ليس إجراءً شائعًا. ولكن قد تكون مفيدة إذا كنت بحاجة إلى تصحيح أخطاء ملف التحديث.

تعديل البنية

النص البرمجي edify هو تعبير واحد تكون فيه جميع القيم سلاسل. السلاسل الفارغة هي false في سياق منطقي وكل السلاسل الأخرى هي true. تدعم Edify العوامل التالية (مع المعاني المعتادة):

(expr )
 expr + expr  # string concatenation, not integer addition
 expr == expr
 expr != expr
 expr && expr
 expr || expr
 ! expr
 if expr then expr endif
 if expr then expr else expr endif
 function_name(expr, expr,...)
 expr; expr

أي سلسلة من الأحرف a-z أو A-Z أو 0-9 أو _ أو : أو / أو . فإن هذه ليست كلمة محجوزة تعتبر سلسلة حرفية. (الكلمات المحجوزة هي if else ثم endif.) السلسلة قد تظهر القيم الحرفية أيضًا بين علامات الاقتباس المزدوجة؛ هذه هي كيفية إنشاء قيم بمسافة بيضاء الأحرف الأخرى غير الموجودة في المجموعة المذكورة أعلاه. \n و\t و\" و\\ تعمل كعمليات إلغاء داخل علامات الاقتباس السلاسل، كما هو الحال في \x##.

&& و || المشغلات قصر في الدارة؛ الجانب الأيمن إذا لم يتم تقييم يتم تحديد النتيجة المنطقية بواسطة الجانب الأيسر. العناصر التالية مماثلة:

e1 && e2
if e1 then e2 endif

. نقطة تسلسل؛ فهذا يعني تقييم الجانب الأيسر أولاً ثم الجانب الأيمن. وقيمته هي قيمة التعبير الجانب الأيمن. يمكن أن تظهر أيضًا فاصلة منقوطة بعد تعبير، فإن التأثير يحاكي عبارات النمط C:

prepare();
do_other_thing("argument");
finish_up();

الدوال المضمنة

وتوجد معظم وظائف التحديث في الدوال المتاحة لتنفيذها بواسطة النصوص البرمجية. (هذه هي وحدات ماكرو وليست دوال بلغة الإشارة، لأنه لا يحتاج إلى تقييم جميع حججه). ما لم يذكر خلاف ذلك، تعرض الدوال true عند نجاح الإجراء وfalse عند الخطأ. إذا كنت تريد أن تؤدي الأخطاء إلى إلغاء تنفيذ البرنامج النصي، يمكنك استخدام الدالتين abort() و/أو assert(). مجموعة ويمكن أيضًا توسيع الوظائف المتوفرة في أداة التحديث لتوفير الوظائف الخاصة بجهاز معيّن.

abort([msg])
يتم إلغاء تنفيذ النص البرمجي على الفور، مع استخدام الرسالة الاختيارية. إذا كان لدى المستخدم عند تفعيل ميزة عرض النص، تظهر الرسالة في سجلّ الاسترداد وعلى الشاشة.
assert(expr[, expr, ...])
تقيّم كل تجربة بدورها. وإذا لم يكن أي منها صحيحًا، يتم إلغاء التنفيذ على الفور باستخدام الرسالة "تعذّر التأكيد" والنص المصدر للتعبير عن الإخفاق.
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
يتيح لك هذا الخيار تطبيق تصحيح ثنائي على src_file من أجل إنشاء tgt_file. إذا كانت الهدف المطلوب هو نفسه المصدر، فمرر "-" لـ tgt_file . tgt_sha1 و tgt_size هي تجزئة SHA1 النهائية المتوقعة وحجم الملف المستهدف. المتبقي يجب أن تأتي الوسيطات في أزواج: تجزئة SHA1 (سلسلة سداسية عشرية مكونة من 40 حرفًا) ونقطة ثنائية كبيرة. الكائن الثنائي الكبير (blob) هو رمز التصحيح الذي سيتم تطبيقه عندما يتضمّن المحتوى الحالي للملف المصدر خوارزمية SHA1 المحدّدة.

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

يتم استخدام بنية خاصة لمعالجة محتوى جهاز تقنية الذاكرة (MTD) الأقسام كملفات، مما يسمح بتصحيح الأقسام الأولية مثل التشغيل. لقراءة MTD يجب أن تعرف مقدار البيانات الذي تريد قراءته بسبب عدم احتواء القسم فكرة نهاية الملف. يمكنك استخدام السلسلة "MTD:partition:size_1:sha1_1:size_2: sha1_2") كـ اسم الملف لقراءة القسم المحدد. يجب تحديد عنصر واحد على الأقل زوج (size, sha-1) يمكنك تحديد أكثر من واحد إذا كانت هناك عدة الاحتمالات لما تتوقّع أن تقرأه

apply_patch_check(filename, sha1[, sha1, ...])
عرض true إذا كان محتوى filename أو النسخة المؤقتة في قسم ذاكرة التخزين المؤقت (في حال توفّره) لديها مجموع اختباري SHA1 يساوي إحدى قيم sha1 المحددة. يتم تحديد قيم sha1 كـ 40 رقمًا سداسيًا عشريًا. تختلف هذه الدالة عن sha1_check(read_file(filename), sha1 [, ...]) من حيث إنه يعرف فتحقق من نسخة قسم ذاكرة التخزين المؤقت، حتى تنجح apply_patch_check() حتى إذا تعرَّض الملف للتلف بسبب حدوث apply_patch() update تمت مقاطعته.
apply_patch_space(bytes)
لعرض القيمة "صواب" إذا توفرت مساحة فارغة بايت على الأقل لتطبيق النظام الثنائي بقع.
concat(expr[, expr, ...])
تقيّم كل تعبير وينشئ تسلسلاً له. عامل + هو سكر تركيبي لهذا في الحالة الخاصة لوسيطتين (ولكن يمكن أن يأخذ شكل الدالة أي عدد من التعبيرات). يجب أن تكون التعبيرات سلاسل. لا يمكن إجراء تسلسل للنقاط الكبيرة.
file_getprop(filename, key)
يقرأ اسم الملف المحدد، ويفسره كملف خصائص (على سبيل المثال، /system/build.prop)، وتعرض قيمة المفتاح المحدد، أو سلسلة فارغة في حال عدم توفّر key.
format(fs_type, partition_type, location, fs_size, mount_point)
لإعادة تنسيق قسم معيّن. أنواع الأقسام المتوافقة:
  • fs_type="yaffs2" و segmentation_type="MTD". يجب أن يكون الموقع الجغرافي هو اسم MTD قسم في إنشاء نظام ملفات yaffs2 فارغ. الوسيطات المتبقية هي غير مستخدم.
  • fs_type="ext4" وsection_type="EMMC". يجب أن يكون الموقع الجغرافي هو ملف الجهاز قسم القرص. وفي هذه الصفحة، يتم إنشاء نظام ملفات ext4 فارغ. إذا كانت قيمة fs_size تساوي صفرًا، نظام الملفات القسم بالكامل. إذا كان fs_size رقمًا موجبًا، يأخذ نظام الملفات أول بايت fs_size من التقسيم. إذا كانت fs_size رقم سالب، يأخذ نظام الملفات الكل باستثناء آخر |fs_size| بايت من قسم القرص.
  • fs_type="f2fs" وsection_type="EMMC". يجب أن يكون الموقع الجغرافي هو ملف الجهاز قسم القرص. يجب أن تكون قيمة fs_size رقمًا غير سالب. إذا كانت قيمة fs_size تساوي صفرًا، نظام الملفات القسم بالكامل. إذا كان fs_size رقمًا موجبًا، يأخذ نظام الملفات أول بايت fs_size من التقسيم.
  • يجب أن تكون نقطة التثبيت هي نقطة التثبيت المستقبلية لنظام الملفات.
getprop(key)
تعرض قيمة مفتاح خاصية النظام (أو السلسلة الفارغة، إذا لم تكن محددة). لا تتطابق قيم خصائص النظام المحددة بواسطة قسم الاسترداد بالضرورة مع القيم تلك الخاصة بالنظام الرئيسي. تعرض هذه الدالة القيمة أثناء الاسترداد.
greater_than_int(a, b)
عرض true إذا كان (iff) a (يُفسَّر على أنّه عدد صحيح) أكبر من (iff) b (يُفسَّر على أنّه عدد صحيح).
ifelse(cond, e1[, e2])
تقيّم cond، وإذا كانت true، يتم تقييم قيمة e1 وعرضها. وبخلاف ذلك، يتم تقييم وعرض e2 (إن وُجد). يتطلب الأمر "إذا ... غير ذلك ... إذًا ... endif" الصيغة هي مجرد سكر تركيبي لهذه الدالة.
is_mounted(mount_point)
تعرض القيمة إذا كان هناك نظام ملفات تم تحميله على upload_point.
is_substring(needle, haystack)
تعرض needle القيمة iff وهي سلسلة فرعية من haystack.
less_than_int(a, b)
عرض القيمة true iff a (يتم تفسيرها على أنه عدد صحيح) أقل من b (يتم تفسيرها على النحو التالي: عدد صحيح).
mount(fs_type, partition_type, name, mount_point)
تحمّل نظام ملفات من fs_type في upload_point. يجب أن يكون partition_type أحد الخيارات التالية:
  • MTD. الاسم هو اسم قسم MTD (مثل النظام وبيانات المستخدم، ويمكنك الاطلاع على /proc/mtd على الجهاز للاطّلاع على القائمة الكاملة).
  • إدارة الخدمات الجوّالة للمؤسسات (EMMC)

لا تعمل عملية الاسترداد على تحميل أي أنظمة ملفات بشكل افتراضي (باستثناء بطاقة SD إذا كان المستخدم إجراء تثبيت يدوي لحزمة من بطاقة SD) يجب أن يثبت النص البرمجي أي الأقسام التي يحتاج إلى تعديلها.

package_extract_dir(package_dir, dest_dir)
يستخرج جميع الملفات من الحزمة أسفل package_dir ويكتبها في الشجرة المتجاوبة أسفل dest_dir. يتم استبدال أي ملفات حالية.
package_extract_file(package_file[, dest_file])
تستخرج package_file واحدة من حزمة التحديث وتكتبها إلى dest_file، استبدال الملفات الحالية إذا لزم الأمر. بدون dest_file، تعرض محتوى ملف الحزمة كثنائي ثنائي كبير.
read_file(filename)
يقرأ filename ويعرض محتواه كملف ثنائي كبير ثنائي.
run_program(path[, arg, ...])
لتنفيذ البرنامج الثنائي في المسار، وتمرير الوسيطات. تعرض حالة الخروج من البرنامج.
set_progress(frac)
لضبط موضع مقياس التقدم داخل المقطع المحدد من خلال أحدث مكالمة show_progress(). يجب أن يقع frac في النطاق [0.0، 1.0]. مستوى التقدّم لا يتحرك المقياس أبدًا إلى الخلف، فسيتم تجاهل محاولات القيام بذلك.
sha1_check(blob[, sha1])
الوسيطة blob هي كائن ثنائي كبير من النوع الذي يعرضه read_file() أو صيغة وسيطة واحدة من package_extract_file() . بدون وسيطات sha1، تعرض هذه الدالة تجزئة SHA1 من الكائن الثنائي الكبير (كسلسلة سداسية عشرية مكوَّنة من 40 رقمًا). يحتوي على خصم واحد أو أكثر sha1، تعرض هذه الدالة تجزئة SHA1 إذا كانت تساوي إحدى أو السلسلة الفارغة إذا لم تكن مساوية لأي منها.
show_progress(frac, secs)
تقدم مقياس التقدم خلال الفاصل التالي لطوله على مدار secs ثانية (يجب أن تكون عددًا صحيحًا). قد تكون ثانية 0، وفي هذه الحالة يكون المقياس ليست متقدمة تلقائيًا ولكن باستخدام الدالة set_progress() المحددة أعلاه.
sleep(secs)
عدد الثواني: ثانية (يجب أن يكون عددًا صحيحًا)
stdout(expr[, expr, ...])
تقيّم كل تعبير وتنقل قيمته إلى stdout. وهو مفيد لتصحيح الأخطاء.
tune2fs(device[, arg, …])
يضبط الوسيطات القابلة للتعديل على الجهاز.
ui_print([text, ...])
إنشاء تسلسل لجميع وسيطات النص وطباعة النتيجة في واجهة المستخدم (حيث ستكون مرئيًا إذا شغّل المستخدم عرض النص).
unmount(mount_point)
إلغاء تحميل نظام الملفات الذي تم تحميله في mon_point
wipe_block_device(block_dev, len)
يمسح len بايت لجهاز الحظر block_dev المحدَّد.
wipe_cache()
يؤدي إلى حجب بيانات قسم ذاكرة التخزين المؤقت في نهاية عملية التثبيت الناجحة.
write_raw_image(filename_or_blob, partition)
تكتب الصورة filename_or_blob في قسم MTD. يمكن أن يكون filename_or_blob سلسلة لتسمية ملف محلي أو وسيطة ذات قيمة blob تحتوي على البيانات المراد كتابتها. لنسخ ملف من حزمة OTA إلى قسم، استخدم: write_raw_image(package_extract_file("zip_filename"), "partition_name");

ملاحظة: قبل الإصدار Android 4.1، كان يتم قبول أسماء الملفات فقط، لذا يجب إنجاز يجب أولاً فك ضغط البيانات في ملف محلي مؤقت.