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.img
tập tin, CyanogenMod cũng cho biết thêm những unpackbootimg
cô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.img
tệ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 mkbootimg
cô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:
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.img
tệ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 mkbootimg
bằ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.img
tậ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.img
tệ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.img
có 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 mtd2
liê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.img
tệ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.img
tệ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.img
tập tin gốc
Giải nén boot.img
tậ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.img
vớ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 upackbootimg
cũ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.gz
hoặ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.gz
hoặc *-ramdisk.lz4
tệ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.img
tệ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 cpio
dườ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) mkbootfs
mã 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à /root
thư 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ừ ramdisk
thư 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.img
tập tin chính nó.
cd ..
Như đã thấy ở trên, unpackbootimg
lệ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 -h
danh 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.img
tậ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.img
tê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.img
tệ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.img
tệ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.img
tệ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.img
hoặc quy trình tạo tệp đĩa RAM).