การเลือกเครื่องมือ
วิธีที่ฉันนำเสนอที่นี่อาศัยรหัสที่มา Android ของ CyanogenMod
ในขณะที่ AOSP ของ Google เพียง แต่ให้เครื่องมือในการสร้างboot.img
ไฟล์ CyanogenMod ยังเพิ่มunpackbootimg
เครื่องมือที่ช่วยให้คุณสามารถแกะมัน เครื่องมือนี้ดูเหมือนจะไม่ได้รับการออกแบบมาเป็นพิเศษสำหรับ CyanogenMod ในทางใดทางหนึ่งดังนั้นโอกาสส่วนใหญ่ก็คือมันจะทำงานกับ ROM อื่น ๆ ได้เช่นกัน
อย่างไรก็ตามมีทางเลือกค่อนข้างมากในการคลายboot.img
ไฟล์ซึ่งทั้งหมดทำงานได้มากหรือน้อยกว่าเดิม
โดยพื้นฐานแล้วเครื่องมือ unpack ดังกล่าวจะแยกเนื้อหาของboot.img
ไฟล์และแสดงชุดของพารามิเตอร์ที่คุณจะต้องผ่านไปยังmkbootimg
เครื่องมือของ Google เพื่อสร้างไฟล์ที่มีการกำหนดค่า (ส่วนใหญ่พารามิเตอร์เคอร์เนลและที่อยู่หน่วยความจำ) จะตรงกับต้นฉบับ
นี่คือตัวอย่างเล็ก ๆ น้อย ๆ ฉันไม่ได้ทดสอบพวกเขาเป็นการส่วนตัวดังนั้นจึงไม่สามารถแนะนำอะไรได้และฉันนำเสนอเพื่อการอ้างอิงเท่านั้น:
เครื่องมือเหล่านี้ทั้งหมด (และอื่น ๆ ที่คุณอาจพบในเครื่องมือค้นหาใด ๆ ) ควรทำงานในลักษณะเดียวกัน แต่เครื่องมือบางอย่างอาจทำงานได้ดีกว่าเครื่องมืออื่น ๆ ในการจัดการกับขอบที่คุณอาจต้องเผชิญกับอุปกรณ์ของคุณ อย่างไรก็ตามพวกเขาส่วนใหญ่อย่างน้อยในเวทีโอเพนซอร์สดูเหมือนจะไม่ได้รับการบำรุงรักษาอย่างสม่ำเสมอดังนั้นสิ่งที่ดีที่สุดในความคิดของฉันที่จะมีการทำงานการบำรุงรักษาและเครื่องมือที่เป็นเอกสารคือการไปกับ CyanogenMod
ผู้ผลิตบางรายผลิต ROM ที่อยู่ไกลจากมาตรฐาน AOSP มากหรือน้อย (ที่อยู่ผิดปกติส่วนหัวรูปแบบไฟล์ ฯลฯ ) หากกระบวนการมาตรฐานด้านล่างใช้งานไม่ได้อาจเป็นหนึ่งในซอฟต์แวร์ทางเลือกเหล่านี้อาจทำการหลอกลวงได้ มิฉะนั้นคุณจะต้องตรวจสอบปัญหาที่เฉพาะเจาะจงกับอุปกรณ์ของคุณ: บางอย่างดูเหมือนจะต้องมีขั้นตอนที่เฉพาะเจาะจงหรือแม้แต่เครื่องมือเฉพาะ (มอบคำถามนี้เกี่ยวกับอุปกรณ์ MediaTek เป็นต้น)
การติดตั้งเครื่องมือ
การรวบรวมชุดเครื่องมือ CyanogenMod สำหรับboot.img
การบรรจุและการเปิดออกค่อนข้างตรงไปตรงมา
- หากคุณได้ติดตั้งต้นไม้ที่สมบูรณ์รหัส Android แหล่งที่มา (คุณสามารถตรวจสอบคำตอบอื่น ๆ ของฉันที่จะได้รับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้) ไปใน
system/core/mkbootimg/
ไดเรกทอรี (เป็นตัวเตือนซอร์สโค้ด AOSP ของ Google เพียง แต่ให้เครื่องมือในการสร้างboot.img
ไฟล์ที่พวกเขาทำไม่ได้ให้เครื่องมือแกะกล่องใด ๆ )
หากคุณไม่ต้องการและไม่ต้องการสิ่งนี้เพื่อวัตถุประสงค์อื่นการแก้ปัญหาที่ง่ายกว่าและเร็วกว่าคือการโคลนพื้นที่เก็บข้อมูลandroid_system_coreของ CyanogenMod เท่านั้น:
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
ด้วยเวอร์ชัน Pythonดังนั้นในรุ่นอนาคตไม่จำเป็นต้องมีการรวบรวมอีกต่อไปสำหรับคำสั่งนี้
คุณจะต้องติดตั้งเครื่องมือ Android บนคอมพิวเตอร์ของคุณเพื่อให้สามารถสื่อสารกับโทรศัพท์ของคุณได้ คุณจะต้องadb
(Android Debug Bridge, เชลล์ยูทิลิตี้ที่อนุญาตให้สื่อสารกับระบบย่อยการดีบักของ Android), adbd
(ภูตที่เกี่ยวข้อง) และfastboot
(ยูทิลิตี้เชลล์ที่อนุญาตให้สื่อสารกับระบบ bootloader ในโทรศัพท์ของคุณ)
การกระจาย Linux ที่คุณโปรดปรานอาจมีให้ในแพ็คเกจเดียวหรือแยกกัน แต่โดยปกติแล้วพวกเขามักจะถูกเรียกว่า "android-tools":
- Debian / Ubuntu:
sudo apt-get install android-tools-{adb,adbd,fastboot}
- Fedora / CentOS:
sudo yum install android-tools
- openSUSE:
sudo zypper install android-tools
ดึงboot.img
ไฟล์
แตกไฟล์ boot.img จากไฟล์ ROM .zip หรือโดยตรงจากอุปกรณ์:
- จากไฟล์ stock .zip ของ ROM: แอปพลิเคชั่นบางตัวเช่น SuperSU อาจแก้ไข boot.img บนอุปกรณ์โดยตรงการแทนที่ด้วยสต็อกจะทำให้แอปพลิเคชันดังกล่าวหยุดทำงาน
- โดยตรงจากอุปกรณ์:
boot.img
คนบางคนที่อ่านรายงานปัญหาที่นำไปสู่ความเสียหาย IMO ปัญหาเหล่านี้มักจะเชื่อมโยงกับการใช้สายเคเบิล USB ที่ไม่ดีหรือฮับ USB และสามารถหลีกเลี่ยงได้โดยการใช้สายเคเบิลคุณภาพดีที่เชื่อมต่อโทรศัพท์กับคอมพิวเตอร์โดยตรง คุณต้องมีความสามารถในการเรียกใช้ ADB ในโหมดรูท (ขึ้นอยู่กับ ROM ที่ใช้ซึ่งอาจไม่สำคัญหรือไม่)
วิธีแรกชัดเจนมาก: แตกไฟล์. zip ด้วยซอฟต์แวร์ 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 ด้วยตนเองทางด้านคอมพิวเตอร์ซึ่งจะช่วยให้คุณสามารถตรวจสอบคีย์ RSA ทางด้านอุปกรณ์ได้โดยตรงโดยไม่ส่งผลกระทบต่อพฤติกรรมของคำสั่ง ADB ต่อไปนี้:
adb start-server
จากนั้นสลับ ADB ในโหมดรูท:
adb root
สุดท้ายคุณควรจะสามารถแยกboot.img
ไฟล์ออกจากอุปกรณ์โดยตรงโดยใช้คำสั่งดังกล่าว (ที่มาและเส้นทางปลายทางและชื่อจะได้รับเป็นตัวอย่างปรับให้เข้ากับความต้องการและการตั้งค่าของคุณ):
adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img
คำสั่งจะคัดลอกทั้งพาร์ติชันทั้งที่ใช้และพื้นที่ว่างดังนั้นอย่าแปลกใจที่boot.img
ไฟล์ผลลัพธ์จะมีขนาดใหญ่กว่าboot.img
ไฟล์ต้นฉบับที่มาพร้อมกับไฟล์ ROM. zip ของ stock ROM ซึ่งเนื้อหานั้นยังคงเหมือนเดิม
เมื่อการถ่ายโอนเสร็จสิ้นให้ยกเลิกการเชื่อมต่อโทรศัพท์และอย่าลืมปิดใช้งานการดีบักและการเข้าถึงรูทจากเมนูนักพัฒนาซอฟต์แวร์
แกะboot.img
ไฟล์ต้นฉบับ
คลายboot.img
ไฟล์เองโดยใช้คำสั่งที่คอมไพล์ไว้ก่อนหน้านี้:
unpackbootimg -i ./boot.img
นี้จะส่งออกที่สำคัญข้อมูลหลายประการที่จะช่วยให้คุณสามารถสร้างใหม่กับโครงสร้างที่ถูกต้องเกี่ยวกับการสต็อกboot.img
boot.img
อย่างไรก็ตามอย่ารีบเร่งใน notepad ของคุณเนื่องจาก CyanogenMod upackbootimg
ยังบันทึกข้อมูลเดียวกันในไฟล์หลายไฟล์ที่เราจะใช้ในภายหลัง
คำสั่งนี้สร้างไฟล์หลายไฟล์ที่มีคำต่อท้ายเฉพาะที่เพิ่มให้กับชื่อของไฟล์อินพุต:
*-second
: นี่เป็น bootloader ขั้นที่สองเป็นทางเลือกและไม่ค่อยได้ใช้กับโทรศัพท์ผู้ใช้ปลายทาง หากไฟล์นี้ว่างเปล่า (กรณีที่พบบ่อยที่สุด) จากนั้น bootloader ของโทรศัพท์จะเรียกเคอร์เนล Linux โดยตรง
*-zImage
: นี่คือเคอร์เนล Linux
*-ramdisk.gz
หรือ*-ramdisk.lz4
: ดิสก์ RAM ที่ใช้เพื่อเติมไดเรกทอรีรากของอุปกรณ์ ส่วนขยายจะแตกต่างกันไปตามอัลกอริทึมการบีบอัดที่ใช้
*-dt
: แผนผังอุปกรณ์เติม/dev
ข้อมูล
- ส่วนที่เหลือเป็นไฟล์เล็ก ๆ แต่ละอันจัดเก็บหนึ่งในค่าที่แสดงใน
unpackbootimg
เอาต์พุต ค่าเหล่านี้กำหนดพารามิเตอร์บรรทัดคำสั่งเพื่อส่งผ่านไปยังเคอร์เนล Linux และที่อยู่ที่ bootloader จะต้องโหลดแต่ละวัตถุในเวลาบูต
บ่อยครั้งที่หนึ่งแกะออกboot.img
เพื่อให้สามารถแก้ไขเนื้อหาของไดเรกทอรีรากของโทรศัพท์ เท่าที่เห็นข้างต้นเนื้อหานี้ถูกเก็บไว้ใน*-ramdisk.gz
หรือ*-ramdisk.lz4
ไฟล์และสามารถแยกได้โดยใช้คำสั่งด้านล่าง:
mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd
สำหรับ LZ4 บีบอัด RAM lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd
ดิสก์แทนขั้นตอนสุดท้ายด้วย
ตอนนี้คุณมีอิสระที่จะทำการแก้ไขที่คุณต้องการก่อนที่จะดำเนินการต่อ อย่างไรก็ตามมันอาจคุ้มค่าที่จะทำตามขั้นตอนการแกะหีบห่อหีบห่อเต็มรูปแบบครั้งเดียวโดยไม่ต้องเปลี่ยนอะไรเลยเพื่อให้แน่ใจว่าเครื่องมือของคุณทำงานได้ตามที่คาดไว้ มิฉะนั้นในกรณีที่มีปัญหาคุณจะไม่มั่นใจถ้าสาเหตุนั้นเกิดจากการดัดแปลงหรือความไม่ลงรอยกันของคุณ (ดูคำพูดของฉันที่จุดเริ่มต้นเกี่ยวกับผู้ผลิตบางรายที่ต้องการกระบวนการหรือเครื่องมือที่ไม่ได้มาตรฐาน)
สร้างใหม่เพื่อรับnew-boot.img
ไฟล์ใหม่
กระบวนการสร้าง CyanogenMod ROM อาศัยเครื่องมือภายในmkbootfs
เพื่อสร้างboot.img
ไฟล์ (สิ่งนี้เกิดขึ้นในbuild / tools / releasetools / common.py ) อย่างไรก็ตามขั้นตอนในการสร้างเครื่องมือนี้ดูเหมือนจะซับซ้อนสำหรับฉันในขณะที่การใช้ระบบที่จัดเตรียมcpio
ดูเหมือนจะใช้ได้ดี ความแตกต่างที่สำคัญระหว่างทั้งสองตามความเข้าใจของฉันหลังจากการตรวจสอบอย่างรวดเร็ว (มาก) ในmkbootfs
รหัส souce ดูเหมือนว่าหลังใช้มาตรการสติบางอย่างโดยไม่รวมไฟล์ประและ/root
ไดเรกทอรีในการเก็บถาวรที่เกิดขึ้นในขณะที่cpio
- ตามขั้นตอนด้านล่าง จะทำให้ทั้งไดเรกทอรีต้นไม้ที่เลือกไว้ในที่เก็บถาวร
สรุป: มีความซับซ้อนเกินความจำเป็นในการคอมไพล์ด้วยข้อดีที่น้อยมากดังนั้นลองติดตั้งระบบที่มีเครื่องมือมาด้วย!
เริ่มต้นด้วยการสร้างดิสก์ RAM ใหม่จาก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
เป้าหมายที่นี่คือการสร้างไฟล์ดิสก์ RAM ใหม่ที่มีคุณสมบัติใกล้เคียงกับไฟล์ต้นฉบับมากที่สุด (ตัวอย่างเช่นการตั้งค่าให้เจ้าของดูเหมือนมักจะหายไปในขั้นตอนที่ใช้ร่วมกันในฟอรัมและบล็อก แต่สิ่งนี้จำเป็นสำหรับอุปกรณ์ของฉัน)
ไปที่ไดเรคทอรี่หลักเพื่อสร้างnew-boot.img
ไฟล์เอง
cd ..
ดังที่เห็นด้านบนunpackbootimg
คำสั่งของ CyanogenMod จะสร้างไฟล์ที่ตรงกับแต่ละพารามิเตอร์ที่mkbootimg
ต้องการ ดังนั้นสิ่งที่คุณต้องทำคือออก a 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
ไฟล์ไปยังอุปกรณ์
- เริ่มอุปกรณ์ในโหมด fastboot (หรือโหมด bootloader ซึ่งโดยปกติแล้วจะมีปุ่มเปิดปิดและปุ่มเพิ่มระดับเสียง)
- เชื่อมต่อสาย USB
ตรวจสอบว่าอุปกรณ์ตรวจพบอย่างถูกต้อง:
sudo fastboot devices
ลองบูตโดยใช้ ROM ใหม่ (โดยไม่ต้องกระพริบดังนั้นในกรณีที่มีปัญหาคุณต้องรีสตาร์ทโทรศัพท์เพื่อให้มันกลับมาตามรอยเปลี่ยน./new-boot.img
ชื่อไฟล์ด้วยตัวคุณเอง):
sudo fastboot boot ./new-boot.img
หากโทรศัพท์ทำงานได้ดีกับอิมเมจสำหรับบูตใหม่ให้กลับไปที่โหมด fastboot และแฟลชอย่างถาวร:
sudo fastboot flash boot ./new-boot.img
sudo fastboot reboot
ข้อสรุป
ขั้นตอนนี้อาจดูน่ากลัวในตอนแรก แต่เมื่อคุณได้รับแล้วคุณจะเห็นว่าไม่จริง
ด้าน "ที่น่ากลัว" มาจากความจริงที่ว่าไม่มี "ระบบ Android" เดียว: ผู้ผลิตและผู้ให้บริการ ROM จำนวนมากทำการเปลี่ยนแปลงซึ่งอาจมีตั้งแต่เส้นทางที่แตกต่างไปเล็กน้อยสู่สภาพแวดล้อมที่ไม่ได้มาตรฐานอย่างสมบูรณ์
สิ่งที่คุณต้องทำคือกำหนดท่าทางของอุปกรณ์เฉพาะของคุณจากนั้นคำสั่งสองสามคำที่เหมาะสมในกรณีของคุณคืออะไร เมื่อคุณได้รับพวกเขาคุณสามารถติดกับพวกเขาและแม้กระทั่งสคริปต์ได้อย่างง่ายดายหากคุณต้องการพวกเขาบ่อย
บางครั้งฉันสมัครใจเข้าไปดูรายละเอียดค่อนข้างต่ำเพราะจะทำให้คุณแก้ไขปัญหาของคุณได้ง่ายขึ้น คุณจะใช้ยูทิลิตี้ทึบแสง "ง่ายขึ้น" เพื่อสร้างและแฟลชboot.img
ไฟล์ใหม่ของคุณและดูว่าอุปกรณ์ของคุณไม่สามารถเริ่มด้วยมันจะยากสำหรับคุณที่จะตัดสินว่าขั้นตอนใดผิดพลาด ที่นี่ในแต่ละขั้นตอนคุณจะสามารถเปรียบเทียบข้อมูลที่คุณจัดการกับข้อมูลที่มาจากboot.img
ไฟล์ต้นฉบับหรือข้อมูลตามที่เห็นบนโทรศัพท์หรือลองใช้อินสแตนซ์เพื่อสร้างboot.img
ไฟล์ใหม่หรือไฟล์ที่สร้างขึ้นใหม่ ไฟล์ดิสก์ RAM เพื่อตรวจสอบว่ามีความแตกต่างหรือไม่ (ซึ่งช่วยให้คุณระบุได้ว่าปัญหามาจากboot.img
หรือขั้นตอนการสร้างไฟล์ดิสก์ RAM หรือไม่