Pemilihan alat
Metode yang saya sajikan di sini bergantung pada kode sumber Android CyanogenMod.
Sementara AOSP Google hanya menyediakan alat untuk membangun satu boot.img
berkas, CyanogenMod juga menambahkan unpackbootimg
tool 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.img
file yang semuanya bekerja kurang lebih sama.
Pada dasarnya, alat unpack tersebut akan mengekstraksi konten boot.img
file dan menampilkan seperangkat parameter yang harus Anda lewati ke mkbootimg
alat 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:
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.img
pengemasan 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.img
file, 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 mkbootimg
dengan 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.img
file
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.img
file 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.img
konten 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 mtd2
terkait 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.img
file 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.img
file yang dihasilkan akan lebih besar daripada boot.img
file 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.img
file aslinya
Buka paket boot.img
file 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.img
dengan struktur yang benar sehubungan dengan stok boot.img
. Namun, jangan terburu-buru pada notepad Anda karena CyanogenMod upackbootimg
juga 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.gz
atau *-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
unpackbootimg
output. 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.img
untuk dapat mengedit konten direktori root ponsel. Seperti yang terlihat di atas, konten ini disimpan dalam file *-ramdisk.gz
atau *-ramdisk.lz4
dan 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.img
file baru
Proses pembuatan CyanogenMod ROM bergantung pada alat internal mkbootfs
,, untuk menghasilkan boot.img
file (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 cpio
tampaknya bekerja dengan baik. Perbedaan utama antara keduanya, sesuai pemahaman saya setelah (sangat) memeriksa cepat dalam mkbootfs
kode sumber, tampaknya bahwa yang terakhir menerapkan beberapa langkah kewarasan dengan tidak termasuk file putus-putus dan /root
direktori dalam arsip yang dihasilkan saat cpio
prosedur 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 ramdisk
direktori 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.img
file itu sendiri.
cd ..
Seperti yang terlihat di atas, unpackbootimg
perintah CyanogenMod menghasilkan file yang cocok dengan setiap parameter yang diharapkan oleh mkbootimg
. Karenanya, yang harus Anda lakukan adalah mengeluarkan a mkbootimg -h
untuk 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.img
file 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.img
nama 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.img
file 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.img
file asli atau data seperti yang terlihat di telepon, atau coba misalnya untuk membangun kembali boot.img
file 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.img
atau prosedur pembuatan file disk RAM).