उपकरण चयन
मेरे द्वारा यहां प्रस्तुत विधि CyanogenMod के एंड्रॉइड सोर्स कोड पर निर्भर करती है।
जबकि Google का AOSP केवल फ़ाइल बनाने के लिए उपकरण प्रदान करता है boot.img
, CyanogenMod भी unpackbootimg
उपकरण को जोड़ता है जिससे आप इसे अनपैक कर सकते हैं। यह उपकरण किसी भी तरह से CyanogenMod के लिए विशेष रूप से डिज़ाइन नहीं किया गया है, इसलिए सबसे अधिक संभावना है कि यह अन्य रोम के लिए भी काम करेगा।
हालाँकि, boot.img
फ़ाइल को अनपैक करने के लिए अपेक्षाकृत बड़ी संख्या में विकल्प हैं जो सभी अधिक-या-कम काम करते हैं।
मूल रूप से, इस तरह के अनपैक टूल boot.img
फ़ाइल की सामग्री को निकाल देंगे और मापदंडों के एक सेट को प्रदर्शित करेंगे जो आपको mkbootimg
एक फाइल बनाने के लिए Google के टूल से गुजरना होगा जिसका कॉन्फ़िगरेशन (मुख्य रूप से कर्नेल पैरामीटर और मेमोरी एड्रेस) मूल से मेल खाएगा।
यहाँ कुछ उदाहरण दिए गए हैं, मैंने व्यक्तिगत रूप से उनका परीक्षण नहीं किया है इसलिए कोई भी सिफारिश नहीं कर सकता है और मैं उन्हें केवल संदर्भ उद्देश्यों के लिए प्रस्तुत करता हूं:
ये सभी उपकरण (और अन्य आप किसी भी खोज इंजन के साथ मिल सकते हैं) को उसी तरह से काम करना चाहिए, लेकिन कुछ अपने स्वयं के डिवाइस के साथ सामना करने वाले कुछ विशेष किनारे-मामले को संभालने में दूसरों की तुलना में बेहतर काम कर सकते हैं। उनमें से ज्यादातर, हालांकि, कम से कम खुले स्रोत के क्षेत्र में, नियमित रूप से बनाए रखा नहीं लगता है, इसलिए काम करने, बनाए रखने और प्रलेखित उपकरणों के लिए मेरी राय में सबसे अच्छा शर्त है कि वह सायनोजेनमॉड्स के साथ जाएं।
कुछ निर्माता रोम का उत्पादन करते हैं जो एओएसपी मानक (असामान्य पते, हेडर, फ़ाइल प्रारूप, आदि) से अधिक या कम हैं। यदि नीचे दी गई मानक प्रक्रिया काम नहीं करती है, हो सकता है कि इनमें से कोई एक वैकल्पिक सॉफ्टवेयर चाल चल सकता है। अन्यथा, आपको अपने डिवाइस के लिए विशिष्ट मुद्दों की जांच करनी होगी: कुछ को एक विशिष्ट प्रक्रिया या यहां तक कि विशिष्ट उपकरणों की आवश्यकता लगती है ( उदाहरण के लिए, मीडियाटेक उपकरणों से संबंधित इस प्रश्न को देखें)।
उपकरण स्थापना
boot.img
पैकिंग और अनपैकिंग के लिए CyanogenMod टूलसेट का संकलन काफी सीधा है।
- यदि आपने पहले ही पूर्ण Android स्रोत कोड ट्री स्थापित कर लिया है (आप इसके बारे में अधिक जानकारी प्राप्त करने के लिए मेरे अन्य उत्तर की जांच कर सकते हैं ),
system/core/mkbootimg/
निर्देशिका में जाएं (एक अनुस्मारक के रूप में, Google का AOSP स्रोत कोड केवल boot.img
फ़ाइल बनाने के लिए उपकरण प्रदान करता है , वे नहीं करते हैं कोई भी अनपैकिंग उपकरण प्रदान करें),
यदि आपको किसी अन्य उद्देश्य के लिए इसकी आवश्यकता नहीं है, तो एक आसान और तेज समाधान केवल CyanogenMod के android_system_core रिपॉजिटरी को क्लोन करना है:
git clone https://github.com/CyanogenMod/android_system_core.git
cd android_system_core/mkbootimg/
एक बार सही निर्देशिका में, संकलित करें और स्थापित करें:
gcc -o ./mkbootimg -I ../include ../libmincrypt/*.c ./mkbootimg.c
gcc -o ./unpackbootimg -I ../include ../libmincrypt/*.c ./unpackbootimg.c
sudo cp ./mkbootimg ./unpackbootimg /usr/bin/
ध्यान दें कि Google C mkbootimg
को पायथन संस्करण के साथ बदल रहा है , इसलिए भविष्य के संस्करणों में इस कमांड के लिए अब किसी संकलन की आवश्यकता नहीं हो सकती है।
आपको अपने फ़ोन से संवाद करने देने के लिए अपने कंप्यूटर पर एंड्रॉइड टूल इंस्टॉल करने की आवश्यकता होगी। आपको adb
(Android डिबग ब्रिज, Android के डिबग सबसिस्टम के साथ संवाद करने की अनुमति देने वाला शेल उपयोगिता), adbd
(संबंधित डेमॉन) और fastboot
(शेल उपयोगिता आपके फोन के बूटलोडर सिस्टम के साथ संवाद करने की अनुमति देता है) की आवश्यकता होगी।
आपका पसंदीदा लिनक्स वितरण उन्हें एक या अलग पैकेज में प्रदान कर सकता है, लेकिन आमतौर पर उन्हें हमेशा "एंड्रॉइड-टूल्स" कहा जाता है:
- डेबियन / उबंटू:
sudo apt-get install android-tools-{adb,adbd,fastboot}
- फेडोरा / CentOS:
sudo yum install android-tools
- openSUSE:
sudo zypper install android-tools
boot.img
फ़ाइल प्राप्त करें
ROM .zip फ़ाइल से या सीधे डिवाइस से boot.img निकालें:
- स्टॉक रॉम .zip फ़ाइल से: सुपरएसयू जैसे कुछ एप्लिकेशन सीधे डिवाइस पर boot.img को संशोधित कर सकते हैं, इसे स्टॉक के साथ बदलकर ऐसे एप्लिकेशन को तोड़ देंगे।
- डिवाइस से सीधे: कुछ लोग रिपोर्ट करते हैं कि यह समस्या भ्रष्ट हो जाती है
boot.img
। IMO, ये समस्याएँ संभवत: खराब USB केबल या USB हब के उपयोग से जुड़ी होती हैं और फोन को सीधे कंप्यूटर से जोड़ने वाली अच्छी गुणवत्ता वाली केबल का उपयोग करके इससे बचा जा सकता है। आपको एडीबी को रूट मोड में चलाने की क्षमता की भी आवश्यकता है (उपयोग किए गए रॉम के आधार पर, यह तुच्छ हो सकता है या नहीं)।
पहली विधि बहुत स्पष्ट है: किसी भी ज़िप सॉफ़्टवेयर के साथ .zip फ़ाइल को निकालें boot.img
, संग्रह के मूल में फ़ाइल वहीं होनी चाहिए।
दूसरी विधि के लिए, आपको सबसे पहले स्टोरेज डिवाइस के लिए (उदास डिवाइस-विशिष्ट) पथ निर्धारित करना होगा, जहां boot.img
सामग्री पुनः प्राप्त की जा सकती है। मैं इसके लिए दो तरीके जानता हूं:
ls /dev/block/platform/*/by-name/
(जहां *
कवर अभी तक एक और उपकरण-विशिष्ट फ़ोल्डर का नाम, संभावना है कि इसके नीचे ही निर्देशिका है platform/
), खोज करने के लिए सही नाम भी मंच निर्भर है लेकिन हमेशा की तरह समझ में आता है (कुछ उदाहरण: boot
, LNX
"लिनक्स") के लिए (परिवर्णी शब्द)। इस निर्देशिका की फाइलें वास्तव में प्रतीकात्मक लिंक हैं और कुछ लोग मैन्युअल रूप से लक्ष्य पर जाने के लिए परेशान होते हैं, लेकिन मैं उच्च स्तर के नाम पर आधारित पथ के साथ चिपके रहने की सलाह देता हूं, जो कि अधिक समय तक कम त्रुटि वाला रहता है। तो तुम जैसे मार्ग से समाप्त हो जाओगे /dev/block/platform/sdhci-tegra.3/by-name/LNX
।
- कुछ (पुराने?) उपकरणों पर, के आउटपुट की जांच करके सही डिवाइस पाया जा सकता है
cat /proc/mtd
। यदि आप लेबल mtd2
से संबंधित डिवाइस देखते हैं "boot"
, तो आप पथ का उपयोग करेंगे /dev/mtd2
।
अभी:
- फ़ोन के डेवलपर मेनू से:
- अपने फ़ोन पर डिबगिंग सक्षम करें,
- ADB तक रूट एक्सेस की अनुमति दें (यह कदम CynogenMod पर चलने वाले फोन पर लागू होता है, अन्य उपकरणों को कुछ संभावित अधिक जटिल प्रक्रिया की आवश्यकता हो सकती है)
- इसे अपने कंप्यूटर से कनेक्ट करें (और वहां से VM अतिथि के लिए यदि आप वर्चुअल मशीन के भीतर से Android उपकरण चला रहे हैं)।
यदि यह पहले से ही नहीं किया गया है, तो मैं कंप्यूटर की तरफ से एडीबी सर्वर को मैन्युअल रूप से शुरू करने की सलाह देता हूं, यह आपको निम्नलिखित एडीबी कमांड के व्यवहार को प्रभावित किए बिना डिवाइस की तरफ से आरएसए कुंजी को सीधे सत्यापित करने की अनुमति देगा:
adb start-server
फिर एडीबी को रूट मोड में स्विच करें:
adb root
अंत में, आपको boot.img
ऐसे कमांड का उपयोग करके डिवाइस से फ़ाइल को सीधे निकालने में सक्षम होना चाहिए (स्रोत और गंतव्य पथ और नाम उदाहरण के रूप में दिए गए हैं, उन्हें अपनी आवश्यकताओं और वरीयताओं के लिए अनुकूलित करें):
adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img
कमांड पूरे विभाजन की नकल करेगा, दोनों इस्तेमाल किया और मुक्त स्थान, इसलिए आश्चर्यचकित न हों कि परिणामस्वरूप boot.img
फ़ाइल boot.img
स्टॉक रॉम .zip फ़ाइल के साथ आने वाली मूल फ़ाइल से बड़ी होगी , सामग्री स्वयं समान रहती है।
एक बार स्थानांतरण समाप्त हो जाने के बाद, फोन को डिस्कनेक्ट करें और डेवलपर मेनू से डिबगिंग और रूट एक्सेस दोनों को अक्षम करना न भूलें।
मूल boot.img
फ़ाइल को अनपैक करें
boot.img
पहले संकलित कमांड का उपयोग करके फ़ाइल को स्वयं अनपैक करें :
unpackbootimg -i ./boot.img
यह आपको boot.img
स्टॉक के संबंध में सही संरचना के साथ एक नया पुनर्निर्माण करने के लिए आवश्यक कई सूचनाओं का उत्पादन करेगा boot.img
। हालाँकि, अपने नोटपैड पर जल्दी मत करो क्योंकि CyanogenMod की upackbootimg
कई फाइलों में बहुत ही जानकारी को हम बाद में उपयोग करेंगे।
यह कमांड इनपुट फ़ाइल के नाम में जोड़े गए विशेष प्रत्ययों के साथ कई फाइलें उत्पन्न करता है:
*-second
: यह दूसरे चरण का बूटलोडर है, वैकल्पिक और शायद ही कभी अंत-उपयोगकर्ता फोन पर उपयोग किया जाता है। यदि यह फ़ाइल खाली है (सबसे सामान्य मामला), तो फोन का बूट लोडर सीधे लिनक्स कर्नेल को कॉल करेगा।
*-zImage
: यह लिनक्स कर्नेल है।
*-ramdisk.gz
या *-ramdisk.lz4
: डिवाइस की रूट डायरेक्टरी को पॉप्युलेट करने के लिए उपयोग की जाने वाली रैम डिस्क। एक्सटेंशन उपयोग किए गए संपीड़न एल्गोरिदम के आधार पर भिन्न होता है।
*-dt
: डिवाइस ट्री, पॉपुलेटिंग /dev
।
- बाकी
unpackbootimg
आउटपुट में प्रदर्शित मूल्यों में से प्रत्येक को संग्रहीत करने वाली छोटी फाइलें हैं । ये मान लिनक्स-कर्नेल और उन पतों को पास करने के लिए कमांड-लाइन पैरामीटर को परिभाषित करते हैं जहां बूट लोडर को बूट समय पर प्रत्येक ऑब्जेक्ट को लोड करना होगा।
सबसे अधिक बार, एक boot.img
फ़ोन की रूट निर्देशिका की सामग्री को संपादित करने में सक्षम होने के लिए अनपैक करता है। जैसा कि ऊपर देखा गया है, यह सामग्री *-ramdisk.gz
या *-ramdisk.lz4
फ़ाइल में संग्रहीत है और इसे नीचे दिए गए आदेशों का उपयोग करके निकाला जा सकता है:
mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd
LZ4 संपीड़ित रैम डिस्क के लिए, अंतिम चरण को बदलें lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd
।
आगे बढ़ने से पहले अब आप उस संशोधन को करने के लिए स्वतंत्र हैं जो आप चाहते हैं। हालाँकि, यह पूरी तरह से अनपैक - रिपैक - बूट प्रक्रिया का पालन करने के लायक हो सकता है, एक बार बिना कुछ बदले यह सुनिश्चित करने के लिए कि आपके उपकरण अपेक्षित रूप से काम कर रहे हैं। अन्यथा, किसी समस्या के मामले में, आप निश्चित नहीं होंगे यदि इसका कारण आपका संशोधन या कुछ असंगति है (गैर मानक प्रक्रियाओं या उपकरणों की आवश्यकता वाले कुछ निर्माताओं के बारे में शुरुआत में मेरी टिप्पणी देखें)।
नई new-boot.img
फ़ाइल प्राप्त करने के लिए पुनर्निर्माण करें
CyanogenMod ROM निर्माण प्रक्रिया एक आंतरिक उपकरण पर निर्भर करती है, फ़ाइल mkbootfs
का निर्माण करने के लिए boot.img
(यह बिल्ड / टूल्स / releasetools / common.py में होता है )। हालाँकि, इस उपकरण के निर्माण के कदम मुझे बेकार लगते हैं, जबकि सिस्टम द्वारा प्रदान cpio
किया गया प्रयोग ठीक काम करने लगता है। दोनों के बीच मुख्य अंतर, mkbootfs
सूइस कोड में (बहुत) त्वरित जांच के बाद मेरी समझ के अनुसार , ऐसा लगता है कि उत्तरार्द्ध डॉटेड फ़ाइलों को शामिल नहीं करके कुछ संन्यासी उपायों को लागू करता है और /root
परिणामी संग्रह में निर्देशिका को cpio
-based प्रक्रिया से नीचे रखा गया है बस पूरी तरह से चयनित निर्देशिका ट्री को नेत्रहीन संग्रह में डाल देगा।
निष्कर्ष: अनावश्यक रूप से बहुत कम फायदे के साथ संकलन करने के लिए, तो चलो सिस्टम प्रदान किए गए टूल पर छड़ी करें!
ramdisk
ऊपर बनाई गई डायरेक्टरी से नई रैम डिस्क बनाकर टाइप करें:
find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | gzip > ../new-boot.img-ramdisk.gz
या, यदि आपको LZ4 संग्रह बनाने की आवश्यकता है:
find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | lz4 > ../new-boot.img-ramdisk.lz4
यहां लक्ष्य मूल रैम के करीब संभव के रूप में गुणों के साथ एक नई रैम डिस्क फ़ाइल बनाना है (उदाहरण के लिए, मालिक को स्थापित करना मंचों और ब्लॉगों में साझा प्रक्रियाओं में अक्सर गायब लगता है, हालांकि यह मेरे डिवाइस पर आवश्यक था)।
अब new-boot.img
फ़ाइल को जनरेट करने के लिए मूल निर्देशिका में जाएँ ।
cd ..
जैसा कि ऊपर देखा गया है, CyanogenMod की unpackbootimg
कमांड द्वारा अपेक्षित प्रत्येक पैरामीटर से मेल खाता एक फ़ाइल उत्पन्न करता है mkbootimg
। इसलिए, आपको बस इतना करना है mkbootimg -h
कि सभी मापदंडों की एक सूची प्राप्त करना है , फिर उनमें से प्रत्येक को मिलान फ़ाइल का उपयोग करके उचित मूल्य पर सेट करें। ध्यान दें कि कुछ पैरामीटर फ़ाइल पथ की अपेक्षा करते हैं, जबकि अन्य फ़ाइल की सामग्री को मूल्य के रूप में प्राप्त करने की अपेक्षा करते हैं। नीचे दिए गए आदेश का एक उदाहरण देखें:
mkbootimg --kernel ./boot.img-zImage \
--ramdisk ./new-boot.img-ramdisk.gz \
--second ./boot.img-second \
--cmdline "$(cat ./boot.img-cmdline)" \
--base "$(cat ./boot.img-base)" \
--pagesize "$(cat ./boot.img-pagesize)" \
--dt ./boot.img-dt \
--ramdisk_offset "$(cat ./boot.img-ramdisk_offset)"
--second_offset "$(cat ./boot.img-second_offset)" \
--tags_offset "$(cat ./boot.img-tags_offset)" \
--output ./new-boot.img
केवल दो पैरामीटर यहां सेट नहीं हैं:
--board
: मेरी समझ के अनुसार, यह परिणामी छवि में एक मॉडल नाम सम्मिलित करने की अनुमति देने वाला एक सूचनात्मक क्षेत्र है।
--id
: यह किसी भी मूल्य की उम्मीद नहीं करता है, यह छवि बनाने के बाद एक अद्वितीय पहचानकर्ता को प्रिंट करता है (टाइमस्टैम्प और एक चेकसम को मिलाकर)।
new-boot.img
फ़ाइल को डिवाइस पर फ्लैश करें
- डिवाइस को फास्टबूट मोड में चालू करें (उर्फ बूटलोडर मोड, आमतौर पर पावर और वॉल्यूम अप बटन दबाकर)।
- USB केबल कनेक्ट करें।
जांचें कि डिवाइस सही तरीके से पता लगाया गया है:
sudo fastboot devices
नई ROM का उपयोग करके बूट करने की कोशिश करें (इसे अभी तक फ्लैश किए बिना, इसलिए समस्या के मामले में आपको बस इसे फिर से प्राप्त करने के लिए फोन को पुनरारंभ करना होगा, ./new-boot.img
फ़ाइल नाम को अपने साथ बदलें ):
sudo fastboot boot ./new-boot.img
यदि फोन नई बूट छवि के साथ सफलतापूर्वक काम करता है, तो फास्टबूट मोड में वापस जाएं और इसे स्थायी रूप से फ्लैश करें:
sudo fastboot flash boot ./new-boot.img
sudo fastboot reboot
निष्कर्ष
यह प्रक्रिया पहली बार में कठिन लग सकती है, लेकिन एक बार जब आप इसे प्राप्त करते हैं, तो आप देखेंगे कि यह वास्तव में नहीं है।
"चुनौतीपूर्ण" पहलू इस तथ्य से आता है कि एक "एंड्रॉइड सिस्टम" नहीं है: बहुत सारे निर्माता और रॉम प्रदाता परिवर्तन करते हैं जो सूक्ष्म पथ अंतर से पूरी तरह से गैर-मानक वातावरण तक हो सकते हैं।
आपको जो करना है वह आपके विशेष उपकरण के आसन को निर्धारित करता है, और फिर कुछ कमांड क्या हैं जो आपके मामले में उपयुक्त हैं। एक बार जब आप उन्हें प्राप्त करते हैं, तो आप उनसे चिपक सकते हैं और यहां तक कि आसानी से उन्हें स्क्रिप्ट कर सकते हैं यदि आपको अक्सर उनकी आवश्यकता होती है।
मैं स्वेच्छा से कभी-कभी अपेक्षाकृत निम्न-स्तरीय विवरणों में चला गया क्योंकि इससे आपको अपने मुद्दों का अधिक आसानी से निवारण हो जाएगा। क्या आप अपनी नई boot.img
फ़ाइल बनाने और फ्लैश करने के लिए कुछ "आसान" अपारदर्शी उपयोगिता का उपयोग करेंगे और देखेंगे कि आपका डिवाइस इसके साथ शुरू नहीं हो सकता है, आपके लिए यह निर्धारित करना कठिन होगा कि कौन सा कदम गलत हुआ। यहां, प्रत्येक चरण में, आप उन डेटा की तुलना करने में सक्षम होंगे, जो आप मूल boot.img
फ़ाइल से आने वाले डेटा या फ़ोन पर देखे गए डेटा के साथ जोड़-तोड़ कर रहे हैं , या उदाहरण के लिए boot.img
फ़ाइल को मूल या नव उत्पन्न के साथ पुनर्निर्माण करने का प्रयास करें रैम डिस्क फ़ाइल यह जाँचने के लिए कि क्या इससे कोई फ़र्क पड़ता है (यदि समस्या boot.img
या रैम डिस्क फ़ाइल पीढ़ी प्रक्रिया से आती है तो यह आपको इंगित करने की अनुमति देता है )।