يقوم النظام ببناء برنامج التحديث الثنائي من برنامج التشغيل bootable/recovery/updater
ويستخدمه في حزمة OTA.
ota_update.zip
، incremental_ota_update.zip
) يحتوي على الملف الثنائي القابل للتنفيذ META-INF/com/google/android/update-binary
. يحتوي المحدث على العديد من الوظائف المضمنة ومترجم للغة البرمجة النصية الموسعة ( تحرير ) التي تدعم أوامر للمهام النموذجية المتعلقة بالتحديث. يبحث المحدث في ملف .zip الخاص بالحزمة عن نص برمجي في الملف META-INF/com/google/android/updater-script
.
ملاحظة: استخدام البرنامج النصي edify و / أو الوظائف المدمجة ليس نشاطًا شائعًا ، ولكن يمكن أن يكون مفيدًا إذا كنت بحاجة إلى تصحيح أخطاء ملف التحديث.
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();
وظائف مدمجة
يتم تضمين معظم وظائف التحديث في الوظائف المتاحة للتنفيذ بواسطة البرامج النصية. (بالمعنى الدقيق للكلمة ، هذه وحدات ماكرو وليست وظائف بمعنى Lisp ، لأنها لا تحتاج إلى تقييم جميع حججها.) ما لم يُذكر خلاف ذلك ، تعود الدوال صحيحة عند النجاح والخطأ عند الخطأ. إذا كنت تريد أخطاء لإحباط تنفيذ البرنامج النصي ، فاستخدم الدالتين abort()
و / أو assert()
. يمكن أيضًا توسيع مجموعة الوظائف المتوفرة في المحدث لتوفير وظائف خاصة بالجهاز .
-
abort([ msg ])
- يحبط تنفيذ البرنامج النصي على الفور ، مع الرسالة الاختيارية . إذا قام المستخدم بتشغيل عرض النص ، فسيظهر 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 والحجم المطلوبين ، أو أنه لم يمس - فلن يترك في حالة وسيطة غير قابلة للاسترداد. إذا توقفت العملية أثناء التصحيح ، فقد يكون الملف الهدف في حالة وسيطة ؛ توجد نسخة في قسم ذاكرة التخزين المؤقت ، لذا يمكن أن تؤدي إعادة تشغيل التحديث إلى تحديث الملف بنجاح.
يتم دعم بناء الجملة الخاص لمعالجة محتويات أقسام Memory Technology Device (MTD) كملفات ، مما يسمح برقع الأقسام الأولية مثل التمهيد. لقراءة قسم MTD ، يجب أن تعرف مقدار البيانات التي تريد قراءتها نظرًا لأن القسم لا يحتوي على فكرة نهاية الملف. يمكنك استخدام السلسلة "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " كاسم ملف لقراءة القسم المحدد. يجب تحديد زوج واحد على الأقل (size، 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 ])
- يقيّم الشرط ، وإذا كان صحيحًا يقيّم ويعيد قيمة e1 ، وإلا فإنه يقيم ويعيد e2 (إن وجد). بناء "if ... else ... ثم ... endif" هو مجرد سكر نحوي لهذه الوظيفة.
-
is_mounted( mount_point )
- إرجاع صحيح إذا كان هناك نظام ملفات مركب في mount_point .
-
is_substring( needle , haystack )
- تُرجع إبرة iff الحقيقية وهي سلسلة فرعية من كومة قش .
-
less_than_int( a , b )
- إرجاع صحيح iff a (يتم تفسيره على أنه عدد صحيح) أقل من b (يتم تفسيره على أنه عدد صحيح).
-
mount( fs_type , partition_type , name , mount_point )
- تحميل نظام ملفات من نوع fs_type عند mount_point . يجب أن يكون نوع القسم واحدًا مما يلي:
- MTD . الاسم هو اسم قسم MTD (على سبيل المثال ، النظام ، بيانات المستخدم ؛ راجع
/proc/mtd
على الجهاز للحصول على قائمة كاملة). - EMMC.
لا يقوم الاسترداد بتثبيت أي أنظمة ملفات افتراضيًا (باستثناء بطاقة SD إذا كان المستخدم يقوم بتثبيت يدوي لحزمة من بطاقة SD) ؛ يجب أن يقوم البرنامج النصي الخاص بك بتركيب أي أقسام يحتاج إلى تعديلها.
- MTD . الاسم هو اسم قسم MTD (على سبيل المثال ، النظام ، بيانات المستخدم ؛ راجع
-
package_extract_dir( package_dir , dest_dir )
- يستخرج كل الملفات من الحزمة الموجودة أسفل package_dir ويكتبها في الشجرة المقابلة أسفل dest_dir . يتم الكتابة فوق أي ملفات موجودة.
-
package_extract_file( package_file [, dest_file ])
- استخراج ملف package_file واحد من حزمة التحديث وكتابته في ملف dest_file ، والكتابة فوق الملفات الموجودة إذا لزم الأمر. بدون الوسيطة dest_file ، يتم إرجاع محتويات ملف الحزمة على هيئة blob ثنائي.
-
read_file( filename )
- يقرأ اسم الملف ويعيد محتوياته كنقطة ثنائية.
-
run_program( path [, arg , ...])
- ينفذ الملف الثنائي في المسار ، ويمرر arg s. يُرجع حالة خروج البرنامج.
-
set_progress( frac )
- يضبط موضع مقياس التقدم داخل القطعة المحددة بواسطة أحدث
show_progress()
. يجب أن يكون frac في النطاق [0.0 ، 1.0]. مقياس التقدم لا يتحرك للخلف أبدًا ؛ يتم تجاهل محاولات جعلها تفعل ذلك. -
sha1_check( blob [, sha1 ])
- وسيطة blob عبارة عن blob من النوع الذي يتم إرجاعه بواسطة
read_file()
أو صيغة وسيطة واحدة منpackage_extract_file()
. بدون وسيطات sha1 ، تُرجع هذه الدالة تجزئة SHA1 في blob (كسلسلة سداسية عشرية مكونة من 40 رقمًا). باستخدام وسيطة واحدة أو أكثر من وسيطات sha1 ، تُرجع هذه الدالة تجزئة SHA1 إذا كانت تساوي إحدى الوسيطات ، أو السلسلة الفارغة إذا كانت لا تساوي أيًا منها. -
show_progress( frac , secs )
- تقدم مقياس التقدم على frac التالي من طوله خلال الثواني (يجب أن يكون عددًا صحيحًا). قد تكون ثوانٍ تساوي 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 )
- يمسح وحدات البايت الخاصة بجهاز الكتلة المحدد 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 ، تم قبول أسماء الملفات فقط ، لذلك لإنجاز ذلك ، يجب أولاً فك ضغط البيانات في ملف محلي مؤقت.