Làm cách nào để giải nén và chỉnh sửa boot.img để chuyển ROM?


14

Gần đây tôi đã tải xuống bản ROM này cho Allview P5 của mình (Allview P5 tương đương với Gionee GN700W / FLY IQ441 / QMobile Noir A8). Nó được gọi là ROM Primonex và được tạo cho phiên bản Gionee của điện thoại.

  • Đầu tiên, tôi đã cố gắng cài đặt nó nhưng nó bị kẹt ở màn hình khởi động.
  • Sau một số nghiên cứu tôi phát hiện ra rằng nó có thể là một vấn đề với boot.imgtệp và tôi không biết làm thế nào để giải nén hoặc chỉnh sửa nó ...

Ai đó có thể cho tôi biết làm thế nào để làm điều đó?

Câu trả lời:


12

Lựa chọn công cụ

Phương pháp tôi trình bày ở đây dựa vào mã nguồn Android của CyanogenMod.

Trong khi AOSP của Google chỉ cung cấp các công cụ để xây dựng các boot.imgtập tin, CyanogenMod cũng cho biết thêm những unpackbootimgcông cụ cho phép bạn giải nén nó. Công cụ này dường như không được thiết kế riêng cho CyanogenMod theo bất kỳ cách nào, vì vậy hầu hết các cơ hội là nó cũng sẽ hoạt động cho các ROM khác.

Tuy nhiên, có một số lượng lớn các lựa chọn thay thế để giải nén boot.imgtệp mà tất cả đều hoạt động ít nhiều giống nhau.

Về cơ bản, công cụ giải nén như vậy sẽ trích xuất nội dung của boot.img tệp và hiển thị một tập hợp các tham số bạn sẽ phải chuyển đến mkbootimgcông cụ của Google để xây dựng một tệp có cấu hình (chủ yếu là tham số kernel và địa chỉ bộ nhớ) sẽ khớp với tệp gốc.

Dưới đây là một vài ví dụ, tôi đã không kiểm tra chúng một cách cá nhân nên không thể đề xuất bất kỳ và tôi chỉ trình bày chúng cho mục đích tham khảo:

  • Một số ít là mã nguồn mở hoặc dựa trên tập lệnh:

    • Android Kitchen rõ ràng là một loại dao quân đội Thụy Sĩ dành cho các nhà phát triển Android. Tác giả ban đầu chính thức ngừng duy trì dự án, một vài người dùng khác đã chia rẽ nó như javilonas hoặc cmotc .
    • szym nhắm mục tiêu dễ dàng bằng cách thêm trình bao bọc kịch bản lệnh shell vào bộ công cụ của nó để làm cho quá trình giải nén và đóng gói lại hoàn toàn đơn giản hơn.
    • osm0sis đề xuất một nhánh của các công cụ của CyanogenMod "rẽ nhánh và cập nhật" theo mô tả riêng của dự án. Dự án này dường như vẫn được duy trì không phổ biến trong lĩnh vực này, tuy nhiên lợi thế thực sự so với các công cụ ban đầu của CyanogenMod vẫn chưa rõ ràng đối với tôi.
  • Một số là nhị phân độc quyền nguồn đóng miễn phí:

    • Kuismaunmkbootimg xuất hiện khá thường xuyên trên các diễn đàn trợ giúp và dường như làm rất tốt trong việc giúp xử lý các trường hợp kỳ lạ, đưa ra khuyến nghị tiếng Anh "có thể đọc được" của con người khi cần một số sửa đổi trong mkbootimgmã nguồn và hiển thị dòng lệnh chính xác để sử dụng để xây dựng lại hình ảnh.
    • Xiaolumkbootimg_tools dường như cũng được đề cập khá thường xuyên và cho phép giải nén và đóng gói lại boot.imgvà tập tin cây thiết bị dt.img. Đừng để bị lừa bởi thực tế nó được lưu trữ trên GitHub: nó một nhị phân độc quyền nguồn đóng và chỉ có các nhị phân được biên dịch có sẵn trên kho lưu trữ của họ (thực sự tôi thậm chí còn tự hỏi về lợi ích chính xác của việc sử dụng kho lưu trữ mã nguồn để lưu trữ blobs nhị phân, nhưng những người khác nhau, tâm trí khác nhau ...).
    • CNexus trên diễn đàn XDA cung cấp một kho lưu trữ với một lựa chọn các công cụ.
    • Câu trả lời này trong Unix.SE đề xuất một số công cụ từ dự án Cổng nối tiếp Android dường như không còn tồn tại. Tuy nhiên, tên tệp khiến tôi nghĩ rằng đây phải là các phiên bản dựng sẵn cũ của các công cụ của CyanogenMod (dự án đã bị đóng, không có tài liệu cũng không hỗ trợ).

Tất cả các công cụ này (và các công cụ khác mà bạn có thể tìm thấy với bất kỳ công cụ tìm kiếm nào) sẽ hoạt động theo cùng một cách, nhưng một số công cụ có thể hoạt động tốt hơn các công cụ khác trong việc xử lý một số trường hợp cạnh cụ thể mà bạn có thể gặp phải với thiết bị của mình. Tuy nhiên, hầu hết trong số họ, ít nhất là trong lĩnh vực nguồn mở, dường như không được duy trì thường xuyên, do đó, cách tốt nhất theo quan điểm của tôi là có các công cụ làm việc, bảo trì và tài liệu là đi với các công cụ của CyanogenMod.

Một số nhà sản xuất sản xuất ROM cách xa tiêu chuẩn AOSP (địa chỉ, tiêu đề, định dạng tệp, v.v.). Nếu quy trình chuẩn dưới đây không hoạt động, có thể một trong những phần mềm thay thế này có thể thực hiện thủ thuật. Mặt khác, bạn sẽ phải kiểm tra các sự cố cụ thể cho thiết bị của mình: một số dường như cần một quy trình cụ thể hoặc thậm chí các công cụ cụ thể (trao câu hỏi này ví dụ: liên quan đến thiết bị MediaTek).

Công cụ cài đặt

Việc biên dịch bộ công cụ CyanogenMod để boot.imgđóng gói và giải nén khá đơn giản.

  • Nếu bạn đã cài đặt cây mã nguồn Android hoàn chỉnh (bạn có thể kiểm tra câu trả lời khác của tôi để có thêm thông tin về điều này), hãy vào system/core/mkbootimg/thư mục (như một lời nhắc nhở, mã nguồn AOSP của Google chỉ cung cấp công cụ để xây dựng boot.imgtệp, họ không cung cấp bất kỳ công cụ giải nén nào),
  • Nếu bạn chưa và không cần điều này cho bất kỳ mục đích nào khác, một giải pháp dễ dàng và nhanh chóng hơn là chỉ sao chép kho lưu trữ android_system_core của CyanogenMod :

    git clone https://github.com/CyanogenMod/android_system_core.git
    cd android_system_core/mkbootimg/
    

Khi vào đúng thư mục, biên dịch và cài đặt:

gcc -o ./mkbootimg -I ../include ../libmincrypt/*.c ./mkbootimg.c
gcc -o ./unpackbootimg -I ../include ../libmincrypt/*.c ./unpackbootimg.c
sudo cp ./mkbootimg ./unpackbootimg /usr/bin/

Lưu ý rằng Google đang thay thế C mkbootimgbằng phiên bản Python , vì vậy trong các phiên bản trong tương lai, không cần phải biên dịch nữa cho lệnh này.

Bạn cũng sẽ cần cài đặt các công cụ Android trên máy tính để cho phép nó giao tiếp với điện thoại của bạn. Bạn sẽ cần adb(Cầu gỡ lỗi Android, tiện ích shell cho phép giao tiếp với hệ thống con gỡ lỗi của Android), adbd(trình nền có liên quan) vàfastboot (tiện ích shell cho phép giao tiếp với hệ thống bộ tải khởi động điện thoại của bạn).

Bản phân phối Linux yêu thích của bạn có thể cung cấp chúng trong một gói duy nhất hoặc riêng biệt, nhưng thông thường chúng luôn được gọi là "công cụ android":

  • Debian / Ubuntu: sudo apt-get install android-tools-{adb,adbd,fastboot}
  • Fedora / CentOS: sudo yum install android-tools
  • mở sudo zypper install android-tools

Lấy boot.imgtập tin

Trích xuất boot.img từ tệp ROM .zip hoặc trực tiếp từ thiết bị:

  • Từ tệp .zip ROM: một số ứng dụng như SuperSU có thể sửa đổi boot.img trực tiếp trên thiết bị, thay thế nó bằng stock stock sẽ phá vỡ các ứng dụng đó.
  • Trực tiếp từ thiết bị: một số người báo cáo vấn đề đọc dẫn đến hỏng boot.img. IMO, những vấn đề này rất có thể liên quan đến việc sử dụng cáp USB kém hoặc bộ chia USB và có thể tránh được bằng cách sử dụng cáp chất lượng tốt kết nối trực tiếp điện thoại với máy tính. Bạn cũng cần khả năng chạy ADB trong chế độ root (tùy thuộc vào ROM được sử dụng, điều này có thể không quan trọng hoặc không).

Phương pháp đầu tiên rất rõ ràng: giải nén tệp .zip bằng bất kỳ phần mềm ZIP nào, boot.imgtệp phải ở ngay gốc của tệp lưu trữ.

Đối với phương pháp thứ hai, trước tiên bạn sẽ phải xác định đường dẫn (cụ thể là thiết bị) đến thiết bị lưu trữ nơi boot.imgcó thể truy xuất nội dung của nó. Tôi biết hai phương pháp cho việc này:

  • ls /dev/block/platform/*/by-name/(trong đó *bao gồm một tên thư mục dành riêng cho thiết bị khác, rất có thể đó là thư mục duy nhất bên dưới platform/), tên chính xác để tìm kiếm cũng phụ thuộc vào nền tảng nhưng có ý nghĩa thông thường (một số ví dụ : boot, LNX(viết tắt của "Linux")). Các tệp trong thư mục này thực sự là các liên kết tượng trưng và một số người bận tâm đến mục tiêu theo cách thủ công, nhưng tôi khuyên bạn nên sử dụng đường dẫn dựa trên tên cấp cao hơn, trong khi lâu hơn, vẫn ít bị lỗi hơn. Vì vậy, bạn sẽ kết thúc với một con đường như thế /dev/block/platform/sdhci-tegra.3/by-name/LNX.
  • Trên một số thiết bị (cũ hơn?), Có thể tìm thấy thiết bị phù hợp bằng cách điều tra đầu ra của cat /proc/mtd. Nếu bạn thấy thiết bị được mtd2liên kết với "boot"nhãn, thì bạn sẽ sử dụng đường dẫn /dev/mtd2.

Hiện nay:

  • Từ menu nhà phát triển điện thoại:
    • Cho phép gỡ lỗi trên điện thoại của bạn,
    • Cho phép quyền truy cập root vào ADB (bước này áp dụng cho điện thoại chạy CynogenMod, các thiết bị khác có thể yêu cầu một số quy trình phức tạp hơn tiềm năng),
  • Kết nối nó với máy tính của bạn (và từ đó đến máy khách VM nếu bạn đang chạy các công cụ Android từ bên trong một máy ảo).

Nếu điều này chưa được thực hiện, tôi khuyên bạn nên khởi động thủ công máy chủ ADB ở phía máy tính, điều này sẽ cho phép bạn xác thực trực tiếp khóa RSA ở phía thiết bị mà không ảnh hưởng đến hành vi của các lệnh ADB sau:

adb start-server

Sau đó chuyển ADB trong chế độ root:

adb root

Cuối cùng, bạn sẽ có thể trích xuất trực tiếp boot.imgtệp từ thiết bị bằng lệnh đó (đường dẫn và tên đích và nguồn được đưa ra làm ví dụ, điều chỉnh chúng theo nhu cầu và sở thích của bạn):

adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img

Lệnh sẽ sao chép toàn bộ phân vùng, cả không gian đã sử dụng và không gian trống, vì vậy đừng ngạc nhiên rằng boot.imgtệp kết quả sẽ lớn hơn bản gốcboot.img tệp đi kèm với tệp ROM .zip, nội dung vẫn giữ nguyên.

Khi quá trình chuyển hoàn tất, hãy ngắt kết nối điện thoại và đừng quên vô hiệu hóa cả gỡ lỗi và truy cập root từ menu nhà phát triển.

Giải nén boot.imgtập tin gốc

Giải nén boot.imgtập tin bằng cách sử dụng lệnh được biên dịch trước đó:

unpackbootimg -i ./boot.img

Điều này sẽ xuất ra một số thông tin cần thiết để cho phép bạn xây dựng lại một cái mới boot.imgvới cấu trúc chính xác liên quan đến cổ phiếu boot.img. Tuy nhiên, đừng vội sử dụng notepad của bạn vì CyanogenMod upackbootimgcũng lưu thông tin tương tự trong một số tệp chúng ta sẽ sử dụng sau này.

Lệnh này tạo ra một số tệp có hậu tố cụ thể được thêm vào tên của tệp đầu vào:

  • *-second: Đây là bộ tải khởi động giai đoạn hai, tùy chọn và hiếm khi được sử dụng trên điện thoại của người dùng cuối. Nếu tệp này trống (trường hợp phổ biến nhất), thì bộ tải khởi động của điện thoại sẽ gọi trực tiếp hạt nhân Linux.
  • *-zImage: Đây là nhân Linux.
  • *-ramdisk.gzhoặc *-ramdisk.lz4: đĩa RAM được sử dụng để điền vào thư mục gốc của thiết bị. Phần mở rộng khác nhau tùy thuộc vào thuật toán nén được sử dụng.
  • *-dt: Cây thiết bị, dân cư /dev.
  • Phần còn lại là các tệp nhỏ, mỗi tệp lưu trữ một trong các giá trị được hiển thị ở unpackbootimgđầu ra. Các giá trị này xác định tham số dòng lệnh để truyền vào nhân Linux và các địa chỉ nơi bộ tải khởi động sẽ phải tải từng đối tượng khi khởi động.

Thông thường, người ta giải nén boot.imgđể có thể chỉnh sửa nội dung của thư mục gốc của điện thoại. Như đã thấy ở trên, nội dung này được lưu trữ trong *-ramdisk.gzhoặc *-ramdisk.lz4tệp và nó có thể được trích xuất bằng các lệnh bên dưới:

mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd

Đối với đĩa RAM nén LZ4, thay thế bước cuối cùng bằng lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd.

Bây giờ bạn có thể tự do thực hiện các sửa đổi bạn muốn trước khi tiến hành. Tuy nhiên, có thể đáng để làm theo quy trình giải nén hoàn toàn - đóng gói lại - khởi động một lần mà không thay đổi bất cứ điều gì để đảm bảo rằng các công cụ của bạn hoạt động như mong đợi. Mặt khác, trong trường hợp có vấn đề, bạn sẽ không chắc chắn nếu nguyên nhân là do sửa đổi của bạn hoặc một số không tương thích (xem nhận xét của tôi khi bắt đầu về một số nhà sản xuất yêu cầu các quy trình hoặc công cụ không chuẩn).

Xây dựng lại để có được cái mới new-boot.img tập tin

Quá trình xây dựng ROM CyanogenMod dựa trên một công cụ nội bộ mkbootfs, để tạo boot.imgtệp (điều này xảy ra trong bản dựng / công cụ / releasetools / common.py ). Tuy nhiên, các bước để xây dựng công cụ này dường như vô cùng phức tạp đối với tôi, trong khi sử dụng hệ thống được cung cấp cpiodường như hoạt động tốt như vậy. Sự khác biệt chính giữa hai cái, theo sự hiểu biết của tôi sau khi kiểm tra nhanh (rất) mkbootfsmã souce, dường như là cái sau áp dụng một số biện pháp tỉnh táo bằng cách không bao gồm các tệp chấm và /rootthư mục trong kho lưu trữ kết quả trong khicpio quy trình dựa trên bên dưới sẽ chỉ mù quáng đưa toàn bộ cây thư mục được chọn vào kho lưu trữ.

Kết luận: phức tạp không cần thiết để biên dịch với rất ít lợi thế, vì vậy hãy sử dụng các công cụ do hệ thống cung cấp!

Bắt đầu bằng cách tạo đĩa RAM mới, từ ramdiskthư mục được tạo ở trên, gõ:

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | gzip > ../new-boot.img-ramdisk.gz

Hoặc, nếu bạn cần tạo một kho lưu trữ LZ4:

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | lz4 > ../new-boot.img-ramdisk.lz4

Mục tiêu ở đây là tạo một tệp đĩa RAM mới với các thuộc tính càng gần với tệp gốc (ví dụ: cài đặt chủ sở hữu dường như thường thiếu trong các quy trình được chia sẻ trên các diễn đàn và blog, tuy nhiên điều này là bắt buộc trên thiết bị của tôi).

Đi ngay trong thư mục cha để tạo new-boot.imgtập tin chính nó.

cd ..

Như đã thấy ở trên, unpackbootimglệnh của CyanogenMod tạo ra một tệp khớp với từng tham số dự kiến mkbootimg. Do đó, tất cả những gì bạn phải làm là đưa ra một mkbootimg -hdanh sách tất cả các tham số, sau đó đặt từng tham số thành giá trị phù hợp bằng cách sử dụng tệp phù hợp. Lưu ý rằng một số tham số mong đợi đường dẫn tệp trong khi các tham số khác mong muốn nhận nội dung của tệp dưới dạng giá trị. Xem ví dụ về lệnh kết quả bên dưới:

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

Chỉ có hai tham số không được đặt ở đây:

  • --board: Theo hiểu biết của tôi, đây chỉ là một trường thông tin cho phép chèn tên mô hình vào hình ảnh kết quả.
  • --id: Điều này không mong đợi bất kỳ giá trị nào, nó chỉ in ra một mã định danh duy nhất sau khi hình ảnh được xây dựng (kết hợp dấu thời gian và tổng kiểm tra).

Flash new-boot.imgtập tin vào thiết bị

  • Khởi động thiết bị ở chế độ fastboot (còn gọi là chế độ bộ nạp khởi động, thường bằng cách giữ nút nguồn và tăng âm lượng).
  • Kết nối cáp USB.
  • Kiểm tra xem thiết bị có được phát hiện chính xác không:

    sudo fastboot devices
    
  • Hãy thử khởi động bằng ROM mới (chưa flash nó, vì vậy trong trường hợp có vấn đề, bạn chỉ cần khởi động lại điện thoại để lấy lại trên đường mòn, thay thế ./new-boot.imgtên tệp bằng tên của bạn):

    sudo fastboot boot ./new-boot.img
    
  • Nếu điện thoại hoạt động thành công với hình ảnh khởi động mới, hãy quay lại ở chế độ fastboot và flash nó vĩnh viễn:

    sudo fastboot flash boot ./new-boot.img
    sudo fastboot reboot
    

Phần kết luận

Thủ tục này ban đầu có vẻ nản chí, nhưng một khi bạn nhận được nó, bạn sẽ thấy nó thực sự không.

Khía cạnh "nan giải" xuất phát từ thực tế là không có một "hệ thống Android" duy nhất: rất nhiều nhà sản xuất và nhà cung cấp ROM thực hiện các thay đổi có thể từ sự khác biệt đường dẫn đến môi trường hoàn toàn không chuẩn.

Những gì bạn phải làm là xác định tư thế của thiết bị cụ thể của bạn, và sau đó một vài lệnh phù hợp trong trường hợp của bạn là gì. Khi bạn nhận được chúng, bạn có thể dính vào chúng và thậm chí dễ dàng viết kịch bản cho chúng nếu bạn cần chúng thường xuyên.

Đôi khi tôi tự nguyện đi vào chi tiết tương đối thấp vì nó sẽ giúp bạn khắc phục sự cố dễ dàng hơn. Bạn có sử dụng một số tiện ích mờ "dễ dàng hơn" để xây dựng và flash boot.imgtệp mới của bạn và thấy rằng thiết bị của bạn không thể bắt đầu với nó, sẽ khó khăn hơn để bạn xác định bước nào bị lỗi. Ở đây, ở mỗi bước, bạn sẽ có thể so sánh dữ liệu bạn đang thao tác với dữ liệu đến từ boot.imgtệp gốc hoặc dữ liệu như trên điện thoại hoặc thử xây dựng lại boot.imgtệp với bản gốc hoặc bản gốc mới được tạo Tệp đĩa RAM để kiểm tra xem điều đó có khác biệt gì không (điều này cho phép bạn xác định chính xác nếu sự cố xuất phát từ boot.imghoặc quy trình tạo tệp đĩa RAM).


2

Sử dụng bếp Android. Có một tùy chọn để giải nén / đóng gói boot.img ở đó, bên dưới Advanced options.


Đáng buồn thay, tác giả ban đầu đã chính thức dừng bảo trì Android Kitchen: " Dự án này đã ngừng hoạt động vào năm 2013, vì tôi đã trở nên quá tải với số lượng thiết bị hỗ trợ, nhu cầu, sức khỏe xấu và yêu cầu trợ giúp liên tục ". Một vài nhánh đã được thực hiện (tôi đưa ra một số liên kết trong câu trả lời của tôi), nhưng tôi không biết chúng được hỗ trợ bao nhiêu (tôi không tìm thấy bất kỳ cách công khai rõ ràng nào để nêu vấn đề hoặc yêu cầu một sự tiến hóa chẳng hạn).
WhiteWinterWolf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.