ओटीए पैकेज के अंदर

सिस्टम bootable/recovery/updater से अपडेटर बाइनरी बनाता है और इसे ओटीए पैकेज में उपयोग करता है।

पैकेज स्वयं एक .zip फ़ाइल ( ota_update.zip , incremental_ota_update.zip ) है जिसमें निष्पादन योग्य बाइनरी META-INF/com/google/android/update-binary शामिल है।

अपडेटर में कई अंतर्निहित फ़ंक्शन और एक एक्स्टेंसिबल स्क्रिप्टिंग भाषा ( एडिफाई ) के लिए एक दुभाषिया शामिल है जो विशिष्ट अपडेट-संबंधित कार्यों के लिए कमांड का समर्थन करता है। अपडेटर META-INF/com/google/android/updater-script फ़ाइल में स्क्रिप्ट के लिए पैकेज .zip फ़ाइल को देखता है।

नोट: एडिफाई स्क्रिप्ट और/या बिल्टइन फ़ंक्शंस का उपयोग करना एक सामान्य गतिविधि नहीं है, लेकिन यदि आपको अपडेट फ़ाइल को डीबग करने की आवश्यकता है तो यह सहायक हो सकता है।

वाक्य रचना संपादित करें

एक संपादन स्क्रिप्ट एक एकल अभिव्यक्ति है जिसमें सभी मान स्ट्रिंग हैं। बूलियन संदर्भ में खाली स्ट्रिंग्स झूठी हैं और अन्य सभी स्ट्रिंग्स सत्य हैं। 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, _, :, /, वर्णों की कोई भी स्ट्रिंग। वह एक आरक्षित शब्द नहीं है जिसे एक स्ट्रिंग अक्षरशः माना जाता है। (आरक्षित शब्द यदि अन्यथा हैं तो अंत हैं। ) स्ट्रिंग अक्षर दोहरे-उद्धरण में भी प्रकट हो सकते हैं; उपरोक्त सेट में मौजूद रिक्त स्थान और अन्य वर्णों के साथ मान बनाने का तरीका इस प्रकार है। \n, \t, \", और \\ उद्धृत स्ट्रिंग्स के भीतर एस्केप के रूप में कार्य करते हैं, जैसा कि \x ## करता है।

&& और || ऑपरेटर शॉर्ट-सर्किट कर रहे हैं; यदि तार्किक परिणाम बाईं ओर से निर्धारित होता है तो दाईं ओर का मूल्यांकन नहीं किया जाता है। निम्नलिखित समतुल्य हैं:

e1 && e2
if e1 then e2 endif

; ऑपरेटर एक अनुक्रम बिंदु है; इसका मतलब है कि पहले बाएँ पक्ष का मूल्यांकन करें और फिर दाएँ पक्ष का। इसका मान दाईं ओर की अभिव्यक्ति का मान है। एक अभिव्यक्ति के बाद अर्धविराम भी दिखाई दे सकता है, इसलिए प्रभाव सी-शैली कथनों का अनुकरण करता है:

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

अंतर्निहित कार्य

अधिकांश अद्यतन कार्यक्षमता स्क्रिप्ट द्वारा निष्पादन के लिए उपलब्ध कार्यों में निहित है। (सख्ती से कहें तो ये लिस्प अर्थ में फ़ंक्शंस के बजाय मैक्रोज़ हैं, क्योंकि उन्हें अपने सभी तर्कों का मूल्यांकन करने की आवश्यकता नहीं है।) जब तक अन्यथा उल्लेख न किया जाए, फ़ंक्शंस सफलता पर सत्य और त्रुटि पर ग़लत लौटते हैं। यदि आप चाहते हैं कि त्रुटियाँ स्क्रिप्ट के निष्पादन को रोकें, तो abort() और/या assert() फ़ंक्शंस का उपयोग करें। अपडेटर में उपलब्ध कार्यों के सेट को डिवाइस-विशिष्ट कार्यक्षमता प्रदान करने के लिए भी बढ़ाया जा सकता है।

abort([ msg ])
वैकल्पिक संदेश के साथ स्क्रिप्ट के निष्पादन को तुरंत रोक देता है। यदि उपयोगकर्ता ने टेक्स्ट डिस्प्ले चालू किया है, तो पुनर्प्राप्ति लॉग और ऑन-स्क्रीन पर संदेश दिखाई देता है।
assert( 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 हैश और आकार है, या यह अछूता है - इसे अप्राप्य मध्यवर्ती स्थिति में नहीं छोड़ा जाएगा। यदि पैचिंग के दौरान प्रक्रिया बाधित होती है, तो लक्ष्य फ़ाइल मध्यवर्ती स्थिति में हो सकती है; कैश विभाजन में एक प्रति मौजूद है इसलिए अद्यतन को पुनरारंभ करने से फ़ाइल सफलतापूर्वक अद्यतन हो सकती है।

मेमोरी टेक्नोलॉजी डिवाइस (एमटीडी) विभाजन की सामग्री को फ़ाइलों के रूप में व्यवहार करने के लिए विशेष सिंटैक्स का समर्थन किया जाता है, जिससे बूट जैसे कच्चे विभाजन की पैचिंग की अनुमति मिलती है। एमटीडी विभाजन को पढ़ने के लिए, आपको पता होना चाहिए कि आप कितना डेटा पढ़ना चाहते हैं क्योंकि विभाजन में फ़ाइल के अंत की धारणा नहीं है। आप दिए गए विभाजन को पढ़ने के लिए फ़ाइल नाम के रूप में स्ट्रिंग "MTD: विभाजन : आकार_1 : sha1_1 : आकार_2 : sha1_2 " का उपयोग कर सकते हैं। आपको कम से कम एक (आकार, शा-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' और पार्टीशन_प्रकार='MTD'। स्थान एमटीडी विभाजन का नाम होना चाहिए; वहां एक खाली yaffs2 फ़ाइल सिस्टम बनाया गया है। शेष तर्क अप्रयुक्त हैं.
  • fs_type='ext4' और पार्टीशन_प्रकार='EMMC'। विभाजन के लिए स्थान डिवाइस फ़ाइल होनी चाहिए. वहां एक खाली ext4 फ़ाइल सिस्टम बनाया गया है। यदि fs_size शून्य है, तो फ़ाइल सिस्टम संपूर्ण विभाजन को ले लेता है। यदि fs_size एक धनात्मक संख्या है, तो फ़ाइल सिस्टम विभाजन के पहले fs_size बाइट्स लेता है। यदि fs_size एक ऋणात्मक संख्या है, तो फ़ाइल सिस्टम अंतिम |fs_size| को छोड़कर सभी को ले लेता है विभाजन के बाइट्स.
  • fs_type='f2fs' और पार्टीशन_प्रकार='EMMC'. विभाजन के लिए स्थान डिवाइस फ़ाइल होनी चाहिए. fs_size एक गैर-ऋणात्मक संख्या होनी चाहिए। यदि fs_size शून्य है, तो फ़ाइल सिस्टम संपूर्ण विभाजन को ले लेता है। यदि fs_size एक धनात्मक संख्या है, तो फ़ाइल सिस्टम विभाजन के पहले fs_size बाइट्स लेता है।
  • माउंट_पॉइंट फ़ाइल सिस्टम के लिए भविष्य का माउंट पॉइंट होना चाहिए।
getprop( key )
सिस्टम प्रॉपर्टी कुंजी (या खाली स्ट्रिंग, यदि यह परिभाषित नहीं है) का मान लौटाता है। पुनर्प्राप्ति विभाजन द्वारा परिभाषित सिस्टम संपत्ति मान आवश्यक रूप से मुख्य सिस्टम के समान नहीं हैं। यह फ़ंक्शन पुनर्प्राप्ति में मान लौटाता है।
greater_than_int( a , b )
यदि और केवल तभी सत्य लौटाता है यदि (iff) a (पूर्णांक के रूप में व्याख्या किया गया) b (पूर्णांक के रूप में व्याख्या किया गया) से बड़ा है।
ifelse( cond , e1 [, e2 ])
cond का मूल्यांकन करता है, और यदि यह सत्य है तो मूल्यांकन करता है और e1 का मान लौटाता है, अन्यथा यह e2 का मूल्यांकन करता है और लौटाता है (यदि मौजूद है)। "यदि ... अन्यथा ... तो ... एंडिफ़" निर्माण इस फ़ंक्शन के लिए केवल वाक्यात्मक चीनी है।
is_mounted( mount_point )
यदि mount_point पर कोई फ़ाइल सिस्टम माउंट किया गया है तो यह सत्य लौटाता है।
is_substring( needle , haystack )
यदि सुई भूसे के ढेर का एक उपस्ट्रिंग है तो सही रिटर्न देता है।
less_than_int( a , b )
यदि a (पूर्णांक के रूप में व्याख्या किया गया) b (पूर्णांक के रूप में व्याख्या किया गया) से कम है तो सत्य लौटाता है।
mount( fs_type , partition_type , name , mount_point )
mount_point पर fs_type का फ़ाइल सिस्टम माउंट करता है। विभाजन_प्रकार इनमें से एक होना चाहिए:
  • एमटीडी । नाम एक एमटीडी विभाजन का नाम है (उदाहरण के लिए, सिस्टम, यूजरडेटा; पूरी सूची के लिए डिवाइस पर /proc/mtd देखें)।
  • ईएमएमसी।

पुनर्प्राप्ति डिफ़ॉल्ट रूप से किसी भी फ़ाइल सिस्टम को माउंट नहीं करती है (एसडी कार्ड को छोड़कर यदि उपयोगकर्ता एसडी कार्ड से पैकेज की मैन्युअल स्थापना कर रहा है); आपकी स्क्रिप्ट को संशोधित करने के लिए आवश्यक किसी भी विभाजन को माउंट करना होगा।

package_extract_dir( package_dir , dest_dir )
package_dir के नीचे वाले पैकेज से सभी फ़ाइलें निकालता है और उन्हें dest_dir के नीचे संबंधित पेड़ पर लिखता है। कोई भी मौजूदा फ़ाइल ओवरराइट हो गई है.
package_extract_file( package_file [, dest_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 ])
ब्लॉब तर्क 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 )
दिए गए ब्लॉक डिवाइस ब्लॉक_देव के लेन बाइट्स को मिटा देता है।
wipe_cache()
सफल इंस्टॉलेशन के अंत में कैश विभाजन को मिटा दिया जाता है।
write_raw_image( filename_or_blob , partition )
छवि को filename_or_blob में MTD विभाजन में लिखता है। फ़ाइलनाम_या_ब्लॉब एक ​​स्थानीय फ़ाइल का नामकरण करने वाली एक स्ट्रिंग या लिखने के लिए डेटा युक्त ब्लॉब-मूल्यवान तर्क हो सकता है। किसी फ़ाइल को OTA पैकेज से किसी पार्टीशन में कॉपी करने के लिए, उपयोग करें: write_raw_image(package_extract_file("zip_filename"), "partition_name");

नोट: एंड्रॉइड 4.1 से पहले, केवल फ़ाइल नाम स्वीकार किए जाते थे, इसलिए इसे पूरा करने के लिए डेटा को पहले एक अस्थायी स्थानीय फ़ाइल में अनज़िप करना पड़ता था।