Bagaimana cara membongkar dan mengedit boot.img untuk port ROM?

14

Saya baru-baru ini mengunduh ROM ini untuk Allview P5 saya (Allview P5 setara dengan Gionee GN700W / FLY IQ441 / QMobile Noir A8). Itu disebut Primonex ROM dan dibuat untuk versi ponsel Gionee.

  • Pertama, saya mencoba untuk menginstalnya tetapi macet di layar boot.
  • Setelah beberapa penelitian saya menemukan bahwa itu bisa menjadi masalah dengan boot.imgfile dan saya tidak tahu cara mengekstrak atau mengeditnya ...

Adakah yang bisa memberi tahu saya cara melakukannya?

pengguna3448167
sumber

Jawaban:

12

Pemilihan alat

Metode yang saya sajikan di sini bergantung pada kode sumber Android CyanogenMod.

Sementara AOSP Google hanya menyediakan alat untuk membangun satu boot.imgberkas, CyanogenMod juga menambahkan unpackbootimgtool yang memungkinkan Anda untuk membongkar itu. Alat ini tampaknya tidak dirancang khusus untuk CyanogenMod dengan cara apa pun, jadi sebagian besar kemungkinannya adalah itu akan bekerja untuk ROM lain juga.

Namun, ada sejumlah besar alternatif untuk membongkar boot.imgfile yang semuanya bekerja kurang lebih sama.

Pada dasarnya, alat unpack tersebut akan mengekstraksi konten boot.imgfile dan menampilkan seperangkat parameter yang harus Anda lewati ke mkbootimgalat Google untuk membangun file yang konfigurasinya (terutama parameter kernel dan alamat memori) akan cocok dengan yang asli.

Berikut adalah beberapa contoh, saya tidak mengujinya secara pribadi sehingga tidak dapat merekomendasikan apapun dan saya menyajikannya hanya untuk tujuan referensi:

  • Beberapa berbasis open source atau script:

    • Dapur Android tampaknya dimaksudkan untuk menjadi semacam pisau tentara Swiss untuk pengembang Android. Penulis asli secara resmi berhenti memelihara proyek, beberapa pengguna lain bercabang seperti javilonas atau cmotc .
    • szym menargetkan kemudahan dengan menambahkan pembungkus skrip shell ke toolset-nya untuk membuat proses pembongkaran dan pengemasan yang lengkap menjadi lebih mudah.
    • osm0sis mengusulkan garpu alat CyanogenMod "bercabang dan diperbarui" sesuai dengan deskripsi proyek sendiri. Proyek ini tampaknya memang masih dipertahankan yang tidak terlalu umum di daerah ini, namun keuntungan sebenarnya atas alat asli CyanogenMod masih belum jelas bagi saya.
  • Beberapa adalah binari eksklusif sumber tertutup:

    • Kuisma'sunmkbootimg muncul cukup sering di forum bantuan dan tampaknya melakukan pekerjaan yang baik dalam membantu menangani kasus-kasus aneh, mengeluarkan rekomendasi bahasa Inggris yang "dapat dibaca manusia" ketika beberapa modifikasi diperlukan dalam mkbootimgkode sumber dan menampilkan baris perintah yang tepat untuk digunakan untuk membangun kembali gambar.
    • Xiaolumkbootimg_tools tampaknya juga cukup sering disebutkan dan memungkinkan untuk membongkar dan mengemas kembali boot.imgdan file pohon perangkat dt.img. Jangan tertipu oleh fakta bahwa ia di-host di GitHub: ini adalah sumber biner berpemilik sumber tertutup dan hanya binari yang dikompilasi yang tersedia di repositori mereka (sebenarnya saya bahkan bertanya-tanya tentang minat yang tepat menggunakan repositori kode sumber untuk menyimpan gumpalan biner, tetapi orang yang berbeda, pikiran yang berbeda ...).
    • CNexus di forum XDA menyediakan arsip dengan pilihan alat.
    • Jawaban ini di Unix.SE merekomendasikan beberapa alat dari proyek Android Serial Port yang sekarang tampaknya tidak berfungsi. Nama file, bagaimanapun, membuat saya berpikir ini harus menjadi versi lama prebuilt dari alat CyanogenMod (proyek ditutup, tidak ada dokumentasi atau dukungan).

Semua alat ini (dan lainnya yang Anda temukan dengan mesin pencari) harus bekerja dengan cara yang sama, tetapi beberapa mungkin bekerja lebih baik daripada yang lain dalam menangani beberapa kasus tepi tertentu yang mungkin Anda hadapi dengan perangkat Anda sendiri. Namun kebanyakan dari mereka, setidaknya di arena open source, tampaknya tidak dipelihara secara teratur, jadi taruhan terbaik menurut saya untuk memiliki alat yang bekerja, dipelihara dan didokumentasikan adalah pergi dengan yang CyanogenMod.

Beberapa produsen menghasilkan ROM yang kurang lebih jauh dari standar AOSP (alamat yang tidak biasa, tajuk, format file, dll.). Jika prosedur standar di bawah ini tidak berfungsi, mungkin salah satu dari perangkat lunak alternatif ini dapat melakukannya. Jika tidak, Anda harus memeriksa masalah khusus untuk perangkat Anda: beberapa tampaknya memerlukan prosedur khusus atau bahkan alat khusus (berikan pertanyaan ini terkait dengan perangkat MediaTek, misalnya).

Instalasi alat

Mengkompilasi toolset CyanogenMod untuk boot.imgpengemasan dan pembongkaran cukup mudah.

  • Jika Anda telah menginstal pohon kode sumber Android lengkap (Anda dapat memeriksa jawaban saya yang lain untuk mendapatkan informasi lebih lanjut tentang ini), masuk system/core/mkbootimg/direktori (sebagai pengingat, kode sumber AOSP Google hanya menyediakan alat untuk membangun boot.imgfile, mereka tidak sediakan alat pembongkar),
  • Jika Anda belum dan tidak membutuhkan ini untuk tujuan lain, solusi yang lebih mudah dan lebih cepat adalah dengan hanya mengkloning repositori android_system_core CyanogenMod :

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

Setelah di direktori yang benar, kompilasi dan instal:

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

Perhatikan bahwa Google mengganti C mkbootimgdengan versi Python , jadi di versi selanjutnya tidak diperlukan kompilasi lagi untuk perintah ini.

Anda juga perlu menginstal alat Android di komputer Anda agar dapat berkomunikasi dengan ponsel Anda. Anda perlu adb(Android Debug Bridge, utilitas shell yang memungkinkan untuk berkomunikasi dengan subsistem debug Android), adbd(daemon terkait) dan fastboot(utilitas shell yang memungkinkan untuk berkomunikasi dengan sistem bootloader ponsel Anda).

Distribusi Linux favorit Anda dapat menyediakannya dalam paket tunggal atau terpisah, tetapi biasanya mereka selalu disebut "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

Ambil boot.imgfile

Ekstrak boot.img baik dari file ROM .zip atau langsung dari perangkat:

  • Dari file .zip ROM stock: beberapa aplikasi seperti SuperSU dapat memodifikasi boot.img langsung pada perangkat, menggantinya dengan stock yang akan merusak aplikasi tersebut.
  • Langsung dari perangkat: beberapa orang melaporkan masalah baca yang mengarah ke rusak boot.img. IMO, masalah ini kemungkinan besar terkait dengan penggunaan kabel USB yang buruk atau hub USB dan dapat dengan mudah dihindari dengan menggunakan kabel berkualitas baik yang menghubungkan langsung telepon ke komputer. Anda juga memerlukan kemampuan untuk menjalankan ADB dalam mode root (tergantung pada ROM yang digunakan, ini mungkin sepele atau tidak).

Metode pertama sangat jelas: ekstrak file .zip dengan perangkat lunak ZIP apa pun, boot.imgfile tersebut harus ada di sana di akar arsip.

Untuk metode kedua, Anda harus terlebih dahulu menentukan jalur (sayangnya khusus perangkat) ke perangkat penyimpanan tempat boot.imgkonten dapat diambil. Saya tahu dua metode untuk ini:

  • ls /dev/block/platform/*/by-name/(di mana *cover belum khusus perangkat lain nama folder, kemungkinan itu adalah satu-satunya direktori bawah platform/), nama yang tepat untuk pencarian juga tergantung platform tapi masuk akal biasa (beberapa contoh: boot, LNX(singkatan dari "Linux")). File-file dalam direktori ini sebenarnya adalah tautan simbolis dan beberapa orang repot untuk secara manual pergi ke target, tetapi saya sarankan tetap menggunakan jalur berbasis nama tingkat tinggi yang, sementara lebih lama, tetap lebih rentan kesalahan. Jadi, Anda akan berakhir dengan jalan seperti /dev/block/platform/sdhci-tegra.3/by-name/LNX.
  • Pada beberapa perangkat (yang lebih lama?), Perangkat yang tepat dapat ditemukan dengan menyelidiki output dari cat /proc/mtd. Jika Anda melihat perangkat yang mtd2terkait dengan "boot"label, maka Anda akan menggunakan jalur /dev/mtd2.

Sekarang:

  • Dari menu pengembang ponsel:
    • Aktifkan debugging di ponsel Anda,
    • Izinkan akses root ke ADB (langkah ini berlaku untuk ponsel yang menjalankan CynogenMod, perangkat lain mungkin memerlukan beberapa prosedur yang mungkin lebih kompleks),
  • Hubungkan ke komputer Anda (dan dari sana ke tamu VM jika Anda menjalankan alat Android dari dalam mesin virtual).

Jika ini belum dilakukan, saya sarankan untuk memulai secara manual server ADB di sisi komputer, ini akan memungkinkan Anda untuk secara langsung memvalidasi kunci RSA di sisi perangkat tanpa mempengaruhi perilaku perintah-perintah ADB berikut:

adb start-server

Kemudian alihkan ADB dalam mode root:

adb root

Terakhir, Anda harus dapat mengekstraksi boot.imgfile langsung dari perangkat menggunakan perintah tersebut (jalur sumber dan tujuan dan nama diberikan sebagai contoh, sesuaikan dengan kebutuhan dan preferensi Anda):

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

Perintah ini akan menyalin seluruh partisi, baik yang digunakan maupun ruang kosong, jadi jangan heran bahwa boot.imgfile yang dihasilkan akan lebih besar daripada boot.imgfile asli yang datang dengan stock ROM .zip file, isinya sendiri tetap sama.

Setelah transfer selesai, putuskan sambungan telepon dan jangan lupa untuk menonaktifkan debugging dan akses root dari menu pengembang.

Buka paket boot.imgfile aslinya

Buka paket boot.imgfile itu sendiri menggunakan perintah yang dikompilasi sebelumnya:

unpackbootimg -i ./boot.img

Ini akan menghasilkan beberapa informasi penting untuk memungkinkan Anda membangun kembali yang baru boot.imgdengan struktur yang benar sehubungan dengan stok boot.img. Namun, jangan terburu-buru pada notepad Anda karena CyanogenMod upackbootimgjuga menyimpan informasi yang sama di beberapa file yang akan kita gunakan nanti.

Perintah ini menghasilkan beberapa file dengan sufiks tertentu yang ditambahkan ke nama file input:

  • *-second: Ini adalah bootloader tahap kedua, opsional dan jarang digunakan pada ponsel pengguna akhir. Jika file ini kosong (kasus yang paling umum), maka bootloader ponsel akan langsung memanggil kernel Linux.
  • *-zImage: Ini adalah kernel Linux.
  • *-ramdisk.gzatau *-ramdisk.lz4: disk RAM yang digunakan untuk mengisi direktori root perangkat. Ekstensi berbeda tergantung pada algoritma kompresi yang digunakan.
  • *-dt: Pohon perangkat, mengisi /dev.
  • Sisanya adalah file kecil yang masing-masing menyimpan salah satu nilai yang ditampilkan dalam unpackbootimgoutput. Nilai-nilai ini menentukan parameter baris perintah untuk dikirimkan ke kernel Linux dan alamat di mana bootloader harus memuat setiap objek pada saat boot.

Paling sering, seseorang membongkar boot.imguntuk dapat mengedit konten direktori root ponsel. Seperti yang terlihat di atas, konten ini disimpan dalam file *-ramdisk.gzatau *-ramdisk.lz4dan dapat diekstraksi menggunakan perintah di bawah ini:

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

Untuk disk RAM yang dikompresi LZ4, ganti langkah terakhir dengan lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd.

Anda sekarang bebas untuk melakukan modifikasi yang Anda inginkan sebelum melanjutkan. Namun, mungkin perlu mengikuti prosedur unpack - repack - boot sepenuhnya tanpa mengubah apa pun untuk memastikan bahwa alat Anda berfungsi seperti yang diharapkan. Kalau tidak, jika terjadi masalah, Anda tidak akan yakin apakah penyebabnya adalah modifikasi Anda atau ketidakcocokan (lihat komentar saya di awal tentang beberapa produsen yang memerlukan prosedur atau alat yang tidak standar).

Bangun kembali untuk mendapatkan new-boot.imgfile baru

Proses pembuatan CyanogenMod ROM bergantung pada alat internal mkbootfs,, untuk menghasilkan boot.imgfile (ini terjadi di build / tools / releasetools / common.py ). Namun, langkah-langkah untuk membangun alat ini tampaknya tidak berguna bagi saya, sedangkan menggunakan sistem yang disediakan cpiotampaknya bekerja dengan baik. Perbedaan utama antara keduanya, sesuai pemahaman saya setelah (sangat) memeriksa cepat dalam mkbootfskode sumber, tampaknya bahwa yang terakhir menerapkan beberapa langkah kewarasan dengan tidak termasuk file putus-putus dan /rootdirektori dalam arsip yang dihasilkan saat cpioprosedur berbasis di bawah ini hanya akan secara membabi buta meletakkan seluruh pohon direktori yang dipilih dalam arsip.

Kesimpulan: kompilasi yang tidak perlu rumit dengan sedikit keuntungan, jadi mari kita tetap pada alat yang disediakan sistem!

Mulailah dengan membuat disk RAM baru, dari ramdiskdirektori yang dibuat di atas, ketik:

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

Atau, jika Anda perlu membuat arsip LZ4:

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

Tujuannya di sini adalah untuk membuat file disk RAM baru dengan properti sedekat mungkin dengan yang asli (misalnya, pengaturan pemilik tampaknya sering hilang dalam prosedur bersama di forum dan blog, namun ini diperlukan pada perangkat saya).

Buka sekarang di direktori induk untuk menghasilkan new-boot.imgfile itu sendiri.

cd ..

Seperti yang terlihat di atas, unpackbootimgperintah CyanogenMod menghasilkan file yang cocok dengan setiap parameter yang diharapkan oleh mkbootimg. Karenanya, yang harus Anda lakukan adalah mengeluarkan a mkbootimg -huntuk mendapatkan daftar semua parameter, lalu atur masing-masing parameter tersebut ke nilai yang sesuai menggunakan file yang cocok. Perhatikan bahwa beberapa parameter mengharapkan jalur file sementara yang lain berharap menerima konten file sebagai nilai. Lihat contoh perintah yang dihasilkan di bawah ini:

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

Hanya dua parameter yang tidak ditetapkan di sini:

  • --board: Sesuai pemahaman saya, ini hanya bidang informatif yang memungkinkan untuk memasukkan nama model pada gambar yang dihasilkan.
  • --id: Yang ini tidak mengharapkan nilai apa pun, hanya mencetak pengidentifikasi unik setelah gambar dibuat (menggabungkan cap waktu dan checksum).

Flash new-boot.imgfile ke perangkat

  • Mulai perangkat dalam mode fastboot (mode bootloader, biasanya dengan menahan tombol power dan volume naik).
  • Hubungkan kabel USB.
  • Pastikan perangkat terdeteksi dengan benar:

    sudo fastboot devices
    
  • Cobalah untuk boot menggunakan ROM baru (tanpa menginstalnya, jadi jika ada masalah Anda hanya perlu me-restart telepon untuk mendapatkannya kembali di jalan, ganti ./new-boot.imgnama file dengan Anda sendiri):

    sudo fastboot boot ./new-boot.img
    
  • Jika ponsel berhasil bekerja dengan image booting baru, maka kembali dalam mode fastboot dan flash secara permanen:

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

Kesimpulan

Prosedur ini mungkin terasa menakutkan pada awalnya, tetapi begitu Anda mendapatkannya, Anda akan melihatnya sebenarnya tidak.

Aspek "menakutkan" berasal dari kenyataan bahwa tidak ada "sistem Android" tunggal: banyak produsen dan penyedia ROM melakukan perubahan yang dapat berkisar dari perbedaan jalur halus ke lingkungan yang sepenuhnya tidak standar.

Yang harus Anda lakukan adalah menentukan postur perangkat khusus Anda, lalu beberapa perintah yang sesuai untuk kasus Anda. Setelah Anda mendapatkannya, Anda dapat tetap menggunakannya dan bahkan dengan mudah menuliskannya jika Anda sering membutuhkannya.

Saya secara sukarela masuk ke detail tingkat yang relatif rendah kadang-kadang karena itu akan membuat Anda memecahkan masalah Anda dengan lebih mudah. Jika Anda menggunakan beberapa utilitas buram "lebih mudah" untuk membangun dan mem-flash boot.imgfile baru Anda dan melihat bahwa perangkat Anda tidak dapat memulainya, akan lebih sulit bagi Anda untuk menentukan langkah mana yang salah. Di sini, pada setiap langkah, Anda akan dapat membandingkan data yang Anda manipulasi dengan data yang berasal dari boot.imgfile asli atau data seperti yang terlihat di telepon, atau coba misalnya untuk membangun kembali boot.imgfile dengan yang asli atau yang baru dibuat File disk RAM untuk memeriksa apakah itu membuat perbedaan (ini memungkinkan Anda untuk menentukan apakah masalah tersebut berasal dari boot.imgatau prosedur pembuatan file disk RAM).

WhiteWinterWolf
sumber
2

Gunakan Dapur Android. Ada opsi untuk membongkar / membungkus ulang boot.img di sana, di bawah Advanced options.

aureljared
sumber
Sayangnya penulis asli telah secara resmi berhenti untuk mempertahankan Android Kitchen: " Proyek ini sudah pensiun pada 2013, karena saya menjadi kewalahan dengan jumlah perangkat untuk mendukung, permintaan, kesehatan yang buruk, dan permintaan bantuan konstan ". Beberapa garpu telah dibuat (saya memberikan beberapa tautan dalam jawaban saya), tetapi saya tidak tahu seberapa banyak mereka didukung (saya tidak menemukan cara publik yang jelas untuk mengangkat masalah atau meminta evolusi misalnya).
WhiteWinterWolf