داخل بسته های OTA

سیستم باینری آپدیت‌کننده را از bootable/recovery/updater می‌سازد و از آن در یک بسته OTA استفاده می‌کند.

بسته به خودی خود یک فایل zip. ( ota_update.zip ، incremental_ota_update.zip ) است که حاوی فایل اجرایی باینری META-INF/com/google/android/update-binary .

Updater شامل چندین توابع داخلی و یک مفسر برای یک زبان برنامه نویسی توسعه پذیر ( edify ) است که از دستورات برای کارهای معمولی مرتبط با به روز رسانی پشتیبانی می کند. Updater در فایل فشرده .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 other then endif هستند. این نحوه ایجاد مقادیر با فضای خالی و کاراکترهای دیگر است که در مجموعه فوق نیستند. \n، \t، \"، و \\ به عنوان فرار در رشته های نقل قول عمل می کنند، مانند \x ## .

&& و || اپراتورها در حال اتصال کوتاه هستند. اگر نتیجه منطقی توسط سمت چپ تعیین شود، سمت راست ارزیابی نمی شود. موارد زیر معادل هستند:

e1 && e2
if e1 then e2 endif

؛ عملگر یک نقطه توالی است. یعنی ابتدا سمت چپ و سپس سمت راست را ارزیابی کنید. مقدار آن مقدار عبارت سمت راست است. یک نقطه ویرگول همچنین می تواند بعد از عبارت ظاهر شود، بنابراین افکت عبارت های سبک C را شبیه سازی می کند:

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

توابع داخلی

بیشتر قابلیت های به روز رسانی در توابع موجود برای اجرا توسط اسکریپت ها وجود دارد. (به بیان دقیق، اینها به جای توابع به معنای Lisp، ماکرو هستند، زیرا نیازی به ارزیابی همه آرگومان هایشان ندارند.) مگر اینکه به طور دیگری ذکر شده باشد، توابع در صورت موفقیت true و در صورت خطا false برمی گردند. اگر می خواهید خطاهایی برای لغو اجرای اسکریپت وجود داشته باشد، از توابع abort() و/یا assert() استفاده کنید. مجموعه عملکردهای موجود در به‌روزرسانی را می‌توان برای ارائه عملکردهای خاص دستگاه نیز گسترش داد.

abort([ msg ])
اجرای اسکریپت را فوراً با پیام اختیاری لغو می کند. اگر کاربر نمایش متن را روشن کرده باشد، پیام در گزارش بازیابی و روی صفحه ظاهر می شود.
assert( expr [, expr , ...])
هر expr را به نوبه خود ارزیابی می کند. اگر هر یک نادرست است، بلافاصله اجرا را با پیام "اظهار ناموفق" و متن منبع عبارت شکست خورده لغو می‌کند.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
برای تولید tgt_file ، یک پچ باینری روی فایل src_file اعمال می کند. اگر هدف مورد نظر همان منبع است، "-" را برای tgt_file ارسال کنید. tgt_sha1 و tgt_size هش نهایی SHA1 و اندازه فایل مورد نظر هستند. آرگومان های باقی مانده باید به صورت جفت باشند: یک هش SHA1 (یک رشته هگز 40 کاراکتری) و یک حباب. حباب وصله‌ای است که زمانی اعمال می‌شود که محتوای فعلی فایل منبع دارای SHA1 باشد.

وصله به روشی ایمن انجام می شود که تضمین می کند فایل هدف یا دارای هش و اندازه SHA1 مورد نظر است یا دست نخورده است - در یک حالت میانی غیرقابل بازیابی باقی نمی ماند. اگر فرآیند در حین وصله قطع شود، فایل هدف ممکن است در یک حالت میانی باشد. یک کپی در پارتیشن کش وجود دارد، بنابراین با راه اندازی مجدد به روز رسانی می توان فایل را با موفقیت به روز کرد.

دستور خاصی برای پردازش محتویات پارتیشن‌های Memory Technology Device (MTD) به‌عنوان فایل پشتیبانی می‌شود و امکان اصلاح پارتیشن‌های خام مانند بوت را فراهم می‌کند. برای خواندن یک پارتیشن MTD، باید بدانید که چه مقدار داده می خواهید بخوانید زیرا پارتیشن مفهوم پایان فایل ندارد. می توانید از رشته "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " به عنوان نام فایل برای خواندن پارتیشن داده شده استفاده کنید. شما باید حداقل یک جفت (اندازه، sha-1) را مشخص کنید. در صورت وجود چندین احتمال برای آنچه که انتظار دارید بخوانید، می توانید بیش از یک مورد را مشخص کنید.

apply_patch_check( filename , sha1 [, sha1 , ...])
اگر محتویات نام فایل یا کپی موقت در پارتیشن کش (در صورت وجود) دارای یک جمع کنترلی SHA1 برابر با یکی از مقادیر sha1 داده شده باشد، مقدار true را برمی گرداند. مقادیر sha1 به صورت 40 رقم هگز مشخص می شود. این تابع با sha1_check(read_file( filename ), sha1 [, ...]) متفاوت است، زیرا می‌داند کپی پارتیشن کش را بررسی کند، بنابراین apply_patch_check() موفق خواهد شد حتی اگر فایل توسط یک apply_patch() update قطع شده خراب شده باشد.
apply_patch_space( bytes )
اگر حداقل بایت فضای خراش برای اعمال وصله‌های باینری در دسترس باشد، true برمی‌گرداند.
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 نصب شده باشد، مقدار true را برمی‌گرداند.
is_substring( needle , haystack )
اگر سوزن زیر رشته ای از انبار کاه باشد، true را برمی گرداند.
less_than_int( a , b )
اگر a (به عنوان یک عدد صحیح تفسیر می شود) کمتر از b باشد (به عنوان یک عدد صحیح تفسیر می شود) true را برمی گرداند.
mount( fs_type , partition_type , name , mount_point )
یک فایل سیستم از fs_type را در mount_point نصب می کند. partition_type باید یکی از موارد زیر باشد:
  • MTD . Name نام یک پارتیشن 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 )
نام فایل را می خواند و محتویات آن را به صورت یک حباب باینری برمی گرداند.
run_program( path [, arg , ...])
باینری را در مسیر ، با عبور از arg s اجرا می کند. وضعیت خروج از برنامه را برمی گرداند.
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 , …])
پارامترهای قابل تنظیم args را در دستگاه تنظیم می کند.
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");

توجه: قبل از اندروید 4.1، فقط نام فایل‌ها پذیرفته می‌شد، بنابراین برای انجام این کار ابتدا باید داده‌ها را در یک فایل محلی موقت از حالت فشرده خارج کنید.