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 ফাইলটি খোঁজে।

মনে রাখবেন: এডিফাই স্ক্রিপ্ট এবং/অথবা বিল্ট-ইন ফাংশন ব্যবহার করা সাধারণ অ্যাক্টিভিটি নয়, তবে আপডেট ফাইল ডিবাগ করার প্রয়োজন হলে এটি সহায়ক হতে পারে।

সিনট্যাক্স সম্পর্কে তথ্য দাও

একটি এডिफाई স্ক্রিপ্ট হল একটি এক্সপ্রেশন যেখানে সব ভ্যালু হল স্ট্রিং। বুলিয়ান প্রসঙ্গে খালি স্ট্রিং 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();

বিল্ট-ইন ফাংশন

স্ক্রিপ্ট দ্বারা কার্যকর করার জন্য উপলভ্য ফাংশনগুলিতে বেশিরভাগ আপডেট কার্যকারিতা থাকে। (Lisp-এর অর্থে এগুলি ফাংশন নয়, বরং ম্যাক্রো, কারণ এদের সব আর্গুমেন্ট মূল্যায়ন করার প্রয়োজন হয় না।) অন্য কিছু উল্লেখ করা না থাকলে, ফাংশন সফল হলে true এবং কোনও সমস্যা হলে false রিটার্ন করে। আপনি যদি চান যে কোনও ত্রুটি স্ক্রিপ্ট এক্সিকিউশন বাতিল করে দিক, তাহলে abort() এবং/অথবা assert() ফাংশন ব্যবহার করুন। আপডেটার উপলভ্য ফাংশনের সেটকেও ডিভাইস-নির্দিষ্ট কার্যকারিতা প্রদান করার জন্য এক্সটেন্ড করা যেতে পারে।

abort([msg])
ঐচ্ছিক msg সহ স্ক্রিপ্টের এক্সিকিউশন অবিলম্বে বাতিল করে। ব্যবহারকারী টেক্সট ডিসপ্লে চালু করলে, রিকভারি লগ ও স্ক্রিনে msg দেখা যাবে।
assert(expr[, expr, ...])
এক এক করে প্রতিটি expr মূল্যায়ন করে। কোনও একটি ফলস হলে, সঙ্গে সঙ্গে "assert failed" মেসেজ ও ব্যর্থ এক্সপ্রেশনের সোর্স টেক্সট সহ এক্সিকিউশন বাতিল করে দেয়।
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 হ্যাশ (৪০-অক্ষরের হেক্স স্ট্রিং) ও একটি ব্লব। সোর্স ফাইলের বর্তমান কন্টেন্টে প্রদত্ত SHA1 থাকলে ব্লব হল প্রয়োগ করার জন্য প্যাচ।

প্যাচিং এমন একটি নিরাপদ উপায়ে করা হয় যা নিশ্চিত করে যে টার্গেট ফাইলে হয় কাঙ্ক্ষিত SHA1 হ্যাশ এবং সাইজ আছে, অথবা এটি অপরিবর্তিত আছে—এটি এমন কোনও অবস্থায় থাকবে না যেখান থেকে সেটি আর রিকভার করা যাবে না। প্যাচিং চলাকালীন প্রসেস বাধা পেলে, টার্গেট ফাইলটি ইন্টারমিডিয়েট স্টেটে থাকতে পারে; ক্যাশে পার্টিশনে একটি কপি থাকে, তাই আপডেট রিস্টার্ট করলে ফাইলটি সফলভাবে আপডেট করা যেতে পারে।

মেমরি টেকনোলজি ডিভাইসের (MTD) পার্টিশনের কন্টেন্টকে ফাইল হিসেবে ট্রিট করার জন্য বিশেষ সিনট্যাক্স কাজ করে, এর ফলে বুটের মতো কাঁচা পার্টিশন প্যাচ করা যায়। MTD পার্টিশন পড়তে, আপনাকে অবশ্যই জানতে হবে যে আপনি কত ডেটা পড়তে চান, কারণ পার্টিশনে ফাইল-এন্ডের ধারণা নেই। আপনি প্রদত্ত পার্টিশন রিড করার জন্য "MTD:partition:size_1:sha1_1:size_2: sha1_2" স্ট্রিংটি ফাইলনাম হিসেবে ব্যবহার করতে পারেন। আপনাকে অন্তত একটি (সাইজ, SHA-1) পেয়ার উল্লেখ করতে হবে; আপনি যা পড়তে চান তার একাধিক সম্ভাবনা থাকলে, আপনি একাধিক পেয়ার উল্লেখ করতে পারবেন।

apply_patch_check(filename, sha1[, sha1, ...])
filename-এর কন্টেন্ট অথবা ক্যাশে পার্টিশনে থাকা অস্থায়ী কপি (যদি থাকে) প্রদত্ত sha1 ভ্যালুর কোনও একটির সমান SHA1 চেকসাম হলে, true রিটার্ন করে। sha1 ভ্যালু ৪০ হেক্স ডিজিট হিসেবে উল্লেখ করা হয়। এই ফাংশনটি sha1_check(read_file(filename), sha1 [, ...]) থেকে আলাদা কারণ এটি ক্যাশে পার্টিশন কপি চেক করতে জানে, তাই apply_patch() update ইন্টারাপ্ট হওয়ার ফলে ফাইলটি খারাপ হয়ে গেলেও apply_patch_check() সফল হবে।
apply_patch_space(bytes)
বাইনারি প্যাচ প্রয়োগ করার জন্য কমপক্ষে বাইট স্ক্র্যাচ স্পেস উপলভ্য থাকলে সত্য রিটার্ন করে ।
concat(expr[, expr, ...])
প্রতিটি এক্সপ্রেশন মূল্যায়ন করে এবং সেগুলিকে একত্রিত করে। দুটি আর্গুমেন্টের বিশেষ ক্ষেত্রে + অপারেটর হল এই ফাংশনের সিনট্যাক্টিক সুগার (কিন্তু ফাংশন ফর্মটি যেকোনও সংখ্যক এক্সপ্রেশন নিতে পারে)। এক্সপ্রেশন স্ট্রিং হতে হবে; এটি ব্লবকে কনক্যাটেনেট করতে পারে না।
file_getprop(filename, key)
প্রদত্ত filename পড়ে, এটিকে প্রপার্টি ফাইল হিসেবে ব্যাখ্যা করে (যেমন, /system/build.prop) এবং প্রদত্ত key-এর ভ্যালু রিটার্ন করে অথবা key না থাকলে খালি স্ট্রিং রিটার্ন করে।
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)
সিস্টেম প্রপার্টি key-এর ভ্যালু (অথবা এটি সংজ্ঞায়িত করা না থাকলে খালি স্ট্রিং) রিটার্ন করে। রিকভারি পার্টিশন দ্বারা সংজ্ঞায়িত সিস্টেম প্রপার্টির মানগুলি মূল সিস্টেমের মানগুলির সাথে একই হতে হবে না। এই ফাংশনটি রিকভারিতে থাকা ভ্যালু রিটার্ন করে।
greater_than_int(a, b)
a (পূর্ণসংখ্যা হিসেবে ব্যাখ্যা করা হয়েছে) b-এর (পূর্ণসংখ্যা হিসেবে ব্যাখ্যা করা হয়েছে) থেকে বড় হলে তবেই সত্য রিটার্ন করে।
ifelse(cond, e1[, e2])
cond মূল্যায়ন করে এবং এটি সত্য হলে e1-এর ভ্যালু মূল্যায়ন করে ফেরত দেয়, অন্যথায় e2 মূল্যায়ন করে ফেরত দেয় (যদি থাকে)। "if ... else ... then ... endif" কনস্ট্রাক্ট হল এই ফাংশনের জন্য সিনট্যাক্টিক সুগার।
is_mounted(mount_point)
mount_point-এ কোনও ফাইলসিস্টেম মাউন্ট করা থাকলে তবেই 'সত্য' রিটার্ন করে।
is_substring(needle, haystack)
needle, haystack-এর সাবস্ট্রিং হলে তবেই সত্য রিটার্ন করে।
less_than_int(a, b)
a (পূর্ণসংখ্যা হিসেবে ব্যাখ্যা করা হয়েছে) b (পূর্ণসংখ্যা হিসেবে ব্যাখ্যা করা হয়েছে) -এর চেয়ে ছোট হলে তবেই true রিটার্ন করে।
mount(fs_type, partition_type, name, mount_point)
mount_point-এ fs_type-এর ফাইলসিস্টেম মাউন্ট করে। partition_type অবশ্যই এগুলির মধ্যে একটি হতে হবে:
  • MTD. নাম হল MTD পার্টিশনের নাম (যেমন, সিস্টেম, ব্যবহারকারীর ডেটা; সম্পূর্ণ তালিকার জন্য ডিভাইসে /proc/mtd দেখুন)।
  • EMMC.

ডিফল্ট হিসেবে রিকভারি কোনও ফাইলসিস্টেম মাউন্ট করে না (ব্যবহারকারী এসডি কার্ড থেকে কোনও প্যাকেজ ম্যানুয়ালি ইনস্টল করলে এসডি কার্ড ছাড়া); আপনার স্ক্রিপ্টকে অবশ্যই সেইসব পার্টিশন মাউন্ট করতে হবে যেগুলি সেটিকে পরিবর্তন করতে হবে।

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, ...])
arg পাস করে path-এ বাইনারি এক্সিকিউট করে। প্রোগ্রাম থেকে বেরিয়ে আসার স্ট্যাটাস রিটার্ন করে।
set_progress(frac)
সবচেয়ে সাম্প্রতিক show_progress() কলের মাধ্যমে ডিফাইন করা চাঙ্কের মধ্যে প্রোগ্রেস মিটারের পজিশন সেট করে। frac-এর মান [0.0, 1.0] রেঞ্জের মধ্যে থাকতে হবে। প্রগ্রেস মিটার কখনও পিছনের দিকে যায় না; এটি করার চেষ্টা করা হলে তা উপেক্ষা করা হয়।
sha1_check(blob[, sha1])
blob আর্গুমেন্ট হল read_file()-এর মাধ্যমে ফেরত আসা ব্লবের ধরন অথবা package_extract_file() -এর এক-আর্গুমেন্ট ফর্ম। কোনও sha1 আর্গুমেন্ট না থাকলে, এই ফাংশনটি ব্লবের SHA1 হ্যাশ (৪০-সংখ্যার হেক্স স্ট্রিং হিসেবে) রিটার্ন করে। এক বা একাধিক sha1 আর্গুমেন্ট সহ, এই ফাংশনটি SHA1 হ্যাশ রিটার্ন করে যদি এটি আর্গুমেন্টগুলির মধ্যে একটির সমান হয়, অথবা যদি এটি সেগুলির কোনওটির সমান না হয় তাহলে খালি স্ট্রিং রিটার্ন করে।
show_progress(frac, secs)
secs সেকেন্ড (অবশ্যই পূর্ণসংখ্যা হতে হবে) ধরে প্রগ্রেস মিটারের দৈর্ঘ্য পরবর্তী frac পর্যন্ত বাড়ায়। secs-এর মান 0 হতে পারে, সেক্ষেত্রে মিটার অটোমেটিক বাড়ে না, তবে উপরে উল্লেখ করা set_progress() ফাংশন ব্যবহার করে বাড়ানো যায়।
sleep(secs)
সেকেন্ড সেকেন্ড ঘুমিয়ে থাকে (পূর্ণসংখ্যা হতে হবে)।
stdout(expr[, expr, ...])
প্রতিটি এক্সপ্রেশন মূল্যায়ন করে এবং এর ভ্যালু stdout-এ ডাম্প করে। ডিবাগ করার জন্য সহায়ক।
tune2fs(device[, arg, …])
ডিভাইসে
টিউন করা যায় এমন প্যারামিটার args অ্যাডজাস্ট করে।
ui_print([text, ...])
সব text আর্গুমেন্টকে একত্রিত করে এবং UI-তে ফলাফল প্রিন্ট করে (যেখানে এটি দেখা যাবে যদি ব্যবহারকারী টেক্সট ডিসপ্লে চালু করে থাকেন)।
unmount(mount_point)
mount_point-এ মাউন্ট করা ফাইলসিস্টেম আনমাউন্ট করে।
wipe_block_device(block_dev, len)
প্রদত্ত ব্লক ডিভাইস block_dev-এর len বাইট মুছে দেয়।
wipe_cache()
সফলভাবে ইনস্টল করা হয়ে গেলে ক্যাশে পার্টিশন মুছে দেয়।
write_raw_image(filename_or_blob, partition)
MTD পার্টিশনে filename_or_blob-এ ইমেজ লেখে। filename_or_blob হল একটি স্ট্রিং যা কোনও লোকাল ফাইলের নাম অথবা একটি blob-এর মানযুক্ত আর্গুমেন্ট ধারণ করে যা লিখতে হবে। OTA প্যাকেজ থেকে কোনও পার্টিশনে ফাইল কপি করতে, এগুলি ব্যবহার করুন: write_raw_image(package_extract_file("zip_filename"), "partition_name");

মনে রাখবেন: Android 4.1-এর আগে, শুধুমাত্র ফাইলের নাম গ্রহণ করা হত, তাই এটি সম্পূর্ণ করতে প্রথমে ডেটা একটি অস্থায়ী স্থানীয় ফাইলে আনজিপ করতে হত।