सिस्टम, bootable/recovery/updater
से अपडेटर बाइनरी बनाता है और उसका इस्तेमाल करता है
एक OTA पैकेज में.
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, _, :, /, वर्णों की कोई भी स्ट्रिंग. वह एक आरक्षित शब्द नहीं है को स्ट्रिंग लिटरल माना जाता है. (बुक किए गए शब्द अगर हैं, तो endif हैं.) स्ट्रिंग लिटरल वैल्यू को डबल कोट में भी दिखाया जा सकता है; इस तरह खाली सफ़ेद जगह वाले मान और अन्य वर्ण जो ऊपर सेट में नहीं हैं. \n, \t, \", और \\ को कोट किए गए में एस्केप के तौर पर इस्तेमाल किया जाता है स्ट्रिंग, जैसे कि \x## करती है.
&& और | ऑपरेटर शॉर्ट सर्किट से कनेक्ट नहीं हो पा रहे हैं; दाईं ओर के हिस्से का आकलन नहीं किया जाता, अगर लॉजिकल नतीजा बाईं तरफ़ से तय होता है. ये समान हैं:
e1 && e2 if e1 then e2 endif
The ; ऑपरेटर एक सीक्वेंस पॉइंट है; इसका मतलब है पहले बाईं ओर के हिस्से का और फिर दाईं ओर. इसकी वैल्यू, दाईं ओर के एक्सप्रेशन की वैल्यू होती है. सेमीकोलन भी दिख सकता है एक्सप्रेशन के बाद, इफ़ेक्ट C-स्टाइल स्टेटमेंट को सिम्युलेट करता है:
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 वर्णों की हेक्स स्ट्रिंग) और BLOB. द ब्लॉब
स्रोत फ़ाइल की वर्तमान सामग्री में SHA1 दिया गया होने पर लागू किया जाने वाला पैच है.
पैच करने का काम सुरक्षित तरीके से किया जाता है, जो यह पक्का करता है कि टारगेट फ़ाइल में को पसंद का SHA1 हैश और साइज़ इंटरमीडिएट स्टेट. अगर पैचिंग के दौरान प्रोसेस में रुकावट आती है, तो टारगेट फ़ाइल इंटरमीडिएट की स्थिति में; कैश मेमोरी वाले हिस्से में एक कॉपी मौजूद है, इसलिए अपडेट को रीस्टार्ट किया जा रहा है फ़ाइल को अपडेट कर सकता है.
मेमोरी टेक्नोलॉजी डिवाइस (एमटीडी) के कॉन्टेंट के इस्तेमाल के लिए खास सिंटैक्स का इस्तेमाल किया जा सकता है पार्टिशन, फ़ाइलों के रूप में काम करते हैं, जिससे बूट जैसे रॉ पार्टिशन की पैचिंग हो जाती है. 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" और delivery_type="MTD" को एक साथ मिलाया गया हो. जगह की जानकारी, एमटीडी का नाम होनी चाहिए बंटवारा; वहां एक खाली yaffs2 फ़ाइल सिस्टम बनाया गया है. बाकी तर्क ये हैं इस्तेमाल नहीं किया है.
- fs_type="ext4" औरPart_type="EMMC". जगह की जानकारी, विभाजन. वहां एक खाली ext4 फ़ाइल सिस्टम बनाया गया है. अगर fs_size शून्य है, तो फ़ाइल सिस्टम पूरा सेगमेंट ले लेता है. अगर fs_size कोई पॉज़िटिव संख्या है, तो फ़ाइल सिस्टम, पार्टीशन की पहली fs_size बाइट लेता है. अगर fs_size नेगेटिव संख्या है, तो फ़ाइलसिस्टम इस कॉलम के आखिरी |fs_size| बाइट को छोड़कर सभी विभाजन.
- fs_type="f2fs" औरPart_type="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)
- अगर माउंट_पॉइंट पर कोई फ़ाइल सिस्टम माउंट किया गया है, तो नतीजे के तौर पर 'सही' दिखाता है.
-
is_substring(needle, haystack)
- सही जवाब देता है iff needle, haystack की सबस्ट्रिंग है.
-
less_than_int(a, b)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सही iff a (पूर्णांक के रूप में समझा जाता है) की वैल्यू, b से कम होती है (इसका मतलब है पूर्णांक).
-
mount(fs_type, partition_type, name, mount_point)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
माउंट_पॉइंट पर fs_type के फ़ाइल सिस्टम को माउंट करता है. party_type को यह होना चाहिए
इनमें से एक:
-
एमटीडी. नाम MTD विभाजन का नाम होता है (उदा., सिस्टम, उपयोगकर्ता डेटा; देखें
पूरी सूची देखने के लिए, डिवाइस पर
/proc/mtd
). - ईएमएमसी.
रिकवरी, डिफ़ॉल्ट रूप से किसी भी फ़ाइल सिस्टम को माउंट नहीं करती (एसडी कार्ड को छोड़कर, अगर उपयोगकर्ता एसडी कार्ड से पैकेज मैन्युअल तरीके से इंस्टॉल करना); आपकी स्क्रिप्ट को विभाजनों को हटा सकता है.
-
एमटीडी. नाम MTD विभाजन का नाम होता है (उदा., सिस्टम, उपयोगकर्ता डेटा; देखें
पूरी सूची देखने के लिए, डिवाइस पर
-
package_extract_dir(package_dir, dest_dir)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है package_DI के नीचे मौजूद पैकेज से सभी फ़ाइलों को एक्सट्रैक्ट करता है और dest_DI के नीचे संबंधित ट्री. सभी मौजूदा फ़ाइलें ओवरराइट हो जाती हैं.
-
package_extract_file(package_file[, dest_file])
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अपडेट पैकेज से एक package_file निकालता है और उसे इस पर लिखता है dest_file, अगर ज़रूरी हो, तो मौजूदा फ़ाइलों को ओवरराइट करना. बिना dest_file आर्ग्युमेंट, पैकेज फ़ाइल की सामग्री को बाइनरी ब्लॉब के रूप में लौटाता है.
read_file(filename)
- filename को पढ़ता है और इसके कॉन्टेंट को बाइनरी ब्लॉब के तौर पर दिखाता है.
-
run_program(path[, arg, ...])
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है path पर बाइनरी को एक्ज़ीक्यूट करता है, जिससे आर्ग पास हो जाता है. प्रोग्राम से बाहर निकलने की स्थिति दिखाता है.
set_progress(frac)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
सबसे हाल के डेटा ग्रुप के अंदर प्रोग्रेस मीटर की जगह सेट करता है
show_progress()
कॉल. frac को [0.0, 1.0] की रेंज में होना चाहिए. प्रोग्रेस मीटर कभी पीछे की ओर नहीं जाता; करने की कोशिशों को अनदेखा कर दिया जाता है. -
sha1_check(blob[, sha1])
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
blob आर्ग्युमेंट,
read_file()
याpackage_extract_file()
का एक तर्क वाला फ़ॉर्म. बिना किसी sha1 आर्ग्युमेंट के, यह फ़ंक्शन, BLOB का SHA1 हैश (40 अंकों की हेक्स स्ट्रिंग के तौर पर) दिखाता है. एक या एक से ज़्यादा sha1 आर्ग्युमेंट का इस्तेमाल करता है, तो यह फ़ंक्शन SHA1 हैश फ़ंक्शन लागू करता है. ऐसा तब होता है, जब यह आर्ग्युमेंट या खाली स्ट्रिंग का उपयोग करें. -
show_progress(frac, secs)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
प्रोग्रेस मीटर को
secs सेकंड (पूर्णांक होना चाहिए). secs 0 हो सकता है. इस मामले में, मीटर
बेहतर नहीं है, लेकिन तय किए गए
set_progress()
फ़ंक्शन का इस्तेमाल करके अपग्रेड किया गया पढ़ें. sleep(secs)
- सेकंड सेकंड के लिए स्लीप (पूर्णांक होना चाहिए).
-
stdout(expr[, expr, ...])
- हर एक्सप्रेशन का आकलन करता है और उसकी वैल्यू को stdout पर छोड़ देता है. डीबग करने में मदद करता है.
-
tune2fs(device[, arg, …])
- डिवाइस पर ट्यून किए जा सकने वाले पैरामीटर आर्ग को अडजस्ट करता है.
ui_print([text, ...])
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सभी text आर्ग्युमेंट को क्रम में लगाता है और नतीजों को यूज़र इंटरफ़ेस (यूआई) पर प्रिंट करता है (जहां यह तब दिखाई देती है, जब उपयोगकर्ता ने टेक्स्ट डिसप्ले चालू किया हो).
unmount(mount_point)
- माउंट_पॉइंट पर माउंट किए गए फ़ाइल सिस्टम को अलग करता है.
-
wipe_block_device(block_dev, len)
- दिए गए ब्लॉक डिवाइस block_dev की लेन बाइट वाइप करता है.
wipe_cache()
- इस वजह से, इंस्टॉलेशन पूरा होने के बाद कैश मेमोरी वाले हिस्से को वाइप कर दिया जाता है.
-
write_raw_image(filename_or_blob, partition)
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
MTD पार्टिशन में इमेज को filename_or_blob में लिखता है.
filename_or_blob, एक ऐसी स्ट्रिंग हो सकती है जिसका नाम किसी लोकल फ़ाइल या blob-वैल्यू वाला आर्ग्युमेंट हो सकता है
सेव किया जा सकता है. ओटीए पैकेज से पार्टिशन में फ़ाइल कॉपी करने के लिए, इसका इस्तेमाल करें:
write_raw_image(package_extract_file("zip_filename"), "partition_name");
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
ध्यान दें: Android 4.1 से पहले के वर्शन में, सिर्फ़ फ़ाइल नाम स्वीकार किए जाते थे. ऐसा करने से ऐसा करने पर, पहले डेटा को एक अस्थायी स्थानीय फ़ाइल में अनज़िप करना पड़ा.