داخل عبوات OTA

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

تحرير بناء الجملة

يعد البرنامج النصي edify تعبيرًا واحدًا تكون فيه جميع القيم عبارة عن سلاسل. السلاسل الفارغة خاطئة في سياق منطقي وجميع السلاسل الأخرى صحيحة . يدعم 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

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

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

e1 && e2
if e1 then e2 endif

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

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

وظائف مدمجة

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

abort([ msg ])
يلغي تنفيذ البرنامج النصي على الفور، مع الرسالة الاختيارية . إذا قام المستخدم بتشغيل عرض النص، فستظهر الرسالة في سجل الاسترداد وعلى الشاشة.
assert( expr [, 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 " كاسم ملف لقراءة القسم المحدد. يجب عليك تحديد زوج واحد على الأقل (الحجم، sha-1) ؛ يمكنك تحديد أكثر من واحد إذا كان هناك احتمالات متعددة لما تتوقع قراءته.

apply_patch_check( filename , sha1 [, sha1 , ...])
يُرجع صحيحًا إذا كانت محتويات اسم الملف أو النسخة المؤقتة في قسم ذاكرة التخزين المؤقت (إن وجدت) تحتوي على مجموع اختباري 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 )، ويعيد قيمة المفتاح المحدد، أو السلسلة الفارغة في حالة عدم وجود المفتاح .
format( fs_type , partition_type , location , fs_size , mount_point )
إعادة تهيئة قسم معين. أنواع الأقسام المدعومة:
  • fs_type = "yaffs2" و Partition_type = "MTD". يجب أن يكون الموقع هو اسم قسم MTD؛ تم إنشاء نظام ملفات yaffs2 فارغ هناك. الوسائط المتبقية غير مستخدمة.
  • fs_type = "ext4" و Partition_type = "EMMC". يجب أن يكون الموقع هو ملف الجهاز الخاص بالقسم. تم إنشاء نظام ملفات ext4 فارغ هناك. إذا كانت قيمة fs_size صفرًا، فسيشغل نظام الملفات القسم بأكمله. إذا كان fs_size رقمًا موجبًا، فسيأخذ نظام الملفات وحدات البايت fs_size الأولى من القسم. إذا كان fs_size رقمًا سالبًا، فسيأخذ نظام الملفات الكل باستثناء |fs_size| الأخير بايت من القسم.
  • fs_type = "f2fs" و Partition_type = "EMMC". يجب أن يكون الموقع هو ملف الجهاز الخاص بالقسم. يجب أن يكون fs_size رقمًا غير سالب. إذا كانت قيمة fs_size صفرًا، فسيشغل نظام الملفات القسم بأكمله. إذا كان fs_size رقمًا موجبًا، فسيأخذ نظام الملفات وحدات البايت fs_size الأولى من القسم.
  • يجب أن تكون mount_point هي نقطة التثبيت المستقبلية لنظام الملفات.
getprop( key )
تُرجع قيمة مفتاح خاصية النظام (أو السلسلة الفارغة، إذا لم تكن محددة). قيم خصائص النظام التي يحددها قسم الاسترداد ليست بالضرورة نفس قيم النظام الرئيسي. تقوم هذه الدالة بإرجاع القيمة في الاسترداد.
greater_than_int( a , b )
يتم إرجاع صحيح إذا وفقط إذا كان (iff) a (يتم تفسيره على أنه عدد صحيح) أكبر من b (يتم تفسيره على أنه عدد صحيح).
ifelse( cond , e1 [, e2 ])
يتم تقييم cond ، وإذا كان صحيحًا، يتم تقييمه وإرجاع قيمة e1 ، وإلا فإنه يتم تقييمه وإرجاع e2 (إذا كان موجودًا). إن بناء "إذا ... آخر ... إذن ... endif" هو مجرد سكر نحوي لهذه الوظيفة.
is_mounted( mount_point )
يُرجع صحيحًا إذا كان هناك نظام ملفات مثبت على mount_point .
is_substring( needle , haystack )
تُرجع قيمة true إذا كانت الإبرة عبارة عن سلسلة فرعية من كومة قش .
less_than_int( a , b )
إرجاع صحيح إذا كان a (يتم تفسيره على أنه عدد صحيح) أقل من b (يتم تفسيره على أنه عدد صحيح).
mount( fs_type , partition_type , name , mount_point )
يقوم بتثبيت نظام ملفات fs_type على mount_point . يجب أن يكون Partition_type واحدًا مما يلي:
  • مليون دينار . الاسم هو اسم قسم MTD (على سبيل المثال، النظام، بيانات المستخدم؛ راجع /proc/mtd على الجهاز للحصول على قائمة كاملة).
  • إي إم إم سي.

لا يقوم الاسترداد بتحميل أي أنظمة ملفات بشكل افتراضي (باستثناء بطاقة 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 )
يقرأ اسم الملف ويعيد محتوياته كنقطة ثنائية.
run_program( path [, arg , ...])
ينفذ الثنائي في المسار ، ويمرر arg s. إرجاع حالة الخروج للبرنامج.
set_progress( frac )
يضبط موضع مقياس التقدم داخل القطعة المحددة بواسطة أحدث استدعاء show_progress() . يجب أن يكون فارك في النطاق [0.0، 1.0]. لا يتحرك مقياس التقدم إلى الوراء أبدًا؛ يتم تجاهل محاولات القيام بذلك.
sha1_check( blob [, sha1 ])
وسيطة blob هي كائن ثنائي كبير الحجم من النوع الذي يتم إرجاعه بواسطة read_file() أو نموذج الوسيطة الواحدة package_extract_file() . مع عدم وجود وسيطات sha1 ، تقوم هذه الدالة بإرجاع تجزئة SHA1 للكائن الثنائي الكبير (كسلسلة سداسية عشرية مكونة من 40 رقمًا). باستخدام وسيطة sha1 واحدة أو أكثر، تقوم هذه الدالة بإرجاع تجزئة SHA1 إذا كانت تساوي إحدى الوسائط، أو السلسلة الفارغة إذا كانت لا تساوي أيًا منها.
show_progress( frac , secs )
تقدم مقياس التقدم خلال الجزء التالي من طوله خلال الثواني (يجب أن يكون عددًا صحيحًا). قد تكون الثواني 0، وفي هذه الحالة لا يتم تقدم المقياس تلقائيًا ولكن باستخدام وظيفة set_progress() المحددة أعلاه.
sleep( secs )
ينام لمدة ثواني (يجب أن يكون عددًا صحيحًا).
stdout( expr [, expr , ...])
يقوم بتقييم كل تعبير وتفريغ قيمته إلى stdout. مفيدة لتصحيح الأخطاء.
tune2fs( device [, arg , …])
يضبط المعلمات القابلة للضبط على الجهاز .
ui_print([ text , ...])
يسلسل جميع الوسائط النصية ويطبع النتيجة إلى واجهة المستخدم (حيث ستكون مرئية إذا قام المستخدم بتشغيل عرض النص).
unmount( mount_point )
يقوم بإلغاء تحميل نظام الملفات المثبت على mount_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، تم قبول أسماء الملفات فقط، لذا لتحقيق ذلك، كان يجب أولاً فك ضغط البيانات في ملف محلي مؤقت.