Flashing ROM Fastboot MIUI dari GNU/Linux

Jika Anda membaca cerita mengenai bagaimana saya mengatasi bootloop pada Xiaomi Mi 4c, tentunya terbayang kerepotan yang saya lakukan kala itu. Hape bootloop, sementara kapasitas baterai kian menyusut dan tidak ada akses internet. Bahkan sampai harus bersusah-payah memasang Windows 7 64 bit.

Itu bootloop perdana yang saya alami pada hape milik pribadi, jadi ya lumayan panik. Kini, setelah hape normal kembali kadang saya tersenyum kecut mengingat kejadian tersebut. Terlebih, setelah mengetahui ternyata kita tidak perlu berepot-ria memasang Windows 64 bit, atau bahkan tidak perlu Windows sama sekali jika hanya untuk flashing ROM fastboot ke Xiaomi.

Pada saat kekisruhan mengatasi bootloop tersebut, saya mendapati bahwa di dalam berkas ROM fastboot Xiaomi terdapat dua buah skrip Bourne shell (sh). Berdasar penemuan ini, setelah hape sembuh dari bootloop, saya pun kemudian mencari guna dari skrip-skrip tersebut. Ternyata, skrip tersebut berguna untuk melakukan flashing dari dalam sistem Linux (atau mungkin BSD dan sistem lainnya yang mengerti Bourne shell dan memiliki adb serta fastboot). Wow, andai saya tahu dan paham lebih awal...

Kemarin, demi menuntaskan rasa penasaran mengapa kemampuan penerimaan sinyal Mi 4c masih juga lemah meski telah berganti custom ROM dari yang berdasar Android 7 ke custom ROM yang berdasar Android 5.1.1, saya pun berencana melakukan flashing ulang ke ROM MIUI 6.1.7 yang berdasar Android 5.1.
Logikanya, jika ternyata setelah diganti ke ROM MIUI Android 5.1 ternyata penerimaan sinyalnya masih juga lemah, sepertinya kerusakan bukan pada tingkat perangkat lunak, melainkan telah pada tingkat perangkat kerasnya.

Berikut rangkuman langkah demi langkah yang saya lakukan untuk flashing ROM fastboot ke hape Xiaomi Mi 4c dari dalam sistem Debian Sid. Sebagai catatan, bootloader hape ini telah unlocked. Saya tidak tahu apa ini berpengaruh ke bisa atau tidaknya kita flashing dari Linux, but, that's it, just for your information....

  • Buka laman en.miui.com untuk mengunduh ROM yang sesuai dengan jenis hape Xiaomi yang Anda miliki.

    Berkas ROM fastboot biasa dikemas dalam bentuk arsip tgz (tar gunzip) dan berukuran lebih dari 1GB.
    Selepas pengunduhan, uraikan berkas tgz tersebut agar kita bisa mengakses isinya secara langsung.
    Misal, saya mengunduh ROM fastboot bernama libra_images_6.1.7_20151221.0000.11_5.1_cn_b09dac70a0.tgz dan kemudian menguraikannya menggunakan perintah berikut:

    tar -xvzf libra_images_6.1.7_20151221.0000.11_5.1_cn_b09dac70a0.tgz
    

    Hasilnya adalah sebuah folder bernama libra_images_6.1.7_20151221.0000.11_5.1_cn, yang jika dilihat menggunakan perintah tree, susunan isinya seperti berikut:

    libra_images_6.1.7_20151221.0000.11_5.1_cn
    ├── flash_all.bat
    ├── flash_all_except_data_storage.bat
    ├── flash_all_except_data_storage.sh
    ├── flash_all.sh
    ├── images
    │   ├── bk2.img
    │   ├── boot.img
    │   ├── BTFM.bin
    │   ├── cache.img
    │   ├── cust.img
    │   ├── dummy.img
    │   ├── emmc_appsboot.mbn
    │   ├── gpt_backup0.bin
    │   ├── gpt_both0.bin
    │   ├── gpt_main0.bin
    │   ├── hyp.mbn
    │   ├── logo.img
    │   ├── misc.img
    │   ├── NON-HLOS.bin
    │   ├── patch0.xml
    │   ├── persist.img
    │   ├── pmic.mbn
    │   ├── prog_emmc_firehose_8992_ddr.mbn
    │   ├── rawprogram0.xml
    │   ├── recovery.img
    │   ├── rpm.mbn
    │   ├── sbl1.mbn
    │   ├── sdi.mbn
    │   ├── system.img
    │   ├── tz.mbn
    │   └── userdata.img
    └── misc.txt
    
    1 directory, 31 files
    

    Bisa kita lihat dua buah skrip sh, yakni flash_all_except_data_storage.sh dan flash_all.sh. Skrip tersebutlah yang akan kita gunakan untuk flashing ROM fastboot MIUI ke hape Xiaomi Mi 4c dari dalam sistem Linux.

  • Pasang perkakas Android Debug Bridge (ADB) dan Fastboot.
    Nama paket yang mengandung perkakas tersebut mungkin akan berbeda antar distro. Pada Debian nama paketnya adalah adb dan fastboot, yang bisa dipasang menggunakan perintah berikut:
    sudo apt install adb fastboot
    
  • Sambungkan hape ke komputer dengan menggunakan kabel USB data dan hidupkan pengaturan USB debugging di hape (Settings ➜ Additional settings ➜ Developer options ➜ USB debugging).
    Jalankan perintah berikut untuk melihat apakah hape telah dikenali oleh komputer:

    adb devices
    

    Jika hape telah dikenali oleh komputer, akan tampak output seperti berikut:

    List of devices attached
    4494c888  device
    

  • Jika hape memang telah dikenali oleh komputer, reboot hape ke moda fastboot. Bisa secara manual dengan cara mematikan hape dan setelah hape mati kemudian menekan tombol POWER + VOLUME DOWN, atau jika hape belum dipasangi custom bootloader (misalnya TWRP), perintah berikut akan membuat hape reboot ke fastboot:

    adb reboot bootloader
    

  • Setelah hape masuk moda fastboot (yang ditandai tampilan layar hitam dan hape seperti mati), periksa apakah ia bisa dikenali oleh komputer.

    fastboot devices
    

    Tergantung distro atau sistem yang digunakan, Anda mungkin perlu menggunakan sudo dalam menjalankan fastboot.

    Jika hape telah dikenali, output perintah di atas akan serupa berikut:

    4494c888 fastboot
    

  • Saatnya untuk flashing ROM.
    Masuklah ke dalam folder hasil uraian ROM fastboot pada langkah pertama di atas. Misalnya, yang telah saya contohkan folder-nya adalah libra_images_6.1.7_20151221.0000.11_5.1_cn.

    cd libra_images_6.1.7_20151221.0000.11_5.1_cn
    

    Di dalam folder tersebut terdapat 4 skrip untuk flashing ROM; 2 skrip bat untuk digunakan di Microsoft Windows, dan 2 skrip sh untuk digunakan di GNU/Linux (atau sistem lain yang memahami Bourne shell).

    Kita hanya akan peduli pada dua skrip sh tersebut:

    • flash_all.sh. Skrip ini digunakan untuk flashing semua partisi di hape.
    • flash_all_except_data_storage.sh. Skrip ini digunakan untuk flashing semua partisi, kecuali partisi tempat menyimpan data.

    Berdasar pengalaman saya, skrip flash_all_except_data_storage.sh tidak mencapai hasil yang diharapkan. Flashing berjalan lancar, namun hape tidak bisa masuk launcher karena banyak jendela error bermunculan dan tidak bisa ditutup. Your mileage may vary.

    Dari pengalaman tersebut, saya lebih menyarankan menggunakan skrip flash_all.sh, tentunya dengan resiko semua data di dalam hape akan dihapus. Jadi, pastikan untuk terlebih dahulu mencadangkan data penting dari dalam hape ke tempat yang lebih aman, baru kemudian ikuti langkah selanjutnya untuk flashing seluruh partisi hape.

  • Jadikan skrip flash_all.sh executable.

    sudo chmod +x flash_all.sh
    

  • Mulai flashing dengan menjalankan skrip flash_all.sh. Skrip ini mendayagunakan fastboot, jadi seperti yang telah disinggung di atas, mungkin pada beberapa distro Anda perlu untuk menggunakan sudo.

    sudo ./flash_all.sh
    

  • Skrip akan melakukan flashing secara otomatis dan tidak memerlukan interaksi dengan user, jadi kita tunggu saja sampai proses flashing selesai.

    iza@sid:/tmp/libra_images_6.1.7_20151221.0000.11_5.1_cn$ sudo ./flash_all.sh  
    product: MSM8992
    target reported max download size of 536870912 bytes
    sending 'pmic' (36 KB)...
    OKAY [  0.040s]
    writing 'pmic'...
    OKAY [  0.021s]
    finished. total time: 0.061s
    target reported max download size of 536870912 bytes
    sending 'pmicbak' (36 KB)...
    OKAY [  0.040s]
    writing 'pmicbak'...
    OKAY [  0.022s]
    finished. total time: 0.061s
    target reported max download size of 536870912 bytes
    sending 'hyp' (92 KB)...
    OKAY [  0.040s]
    writing 'hyp'...
    OKAY [  0.024s]
    finished. total time: 0.064s
    target reported max download size of 536870912 bytes
    sending 'hypbak' (92 KB)...
    OKAY [  0.040s]
    writing 'hypbak'...
    OKAY [  0.024s]
    finished. total time: 0.064s
    target reported max download size of 536870912 bytes
    sending 'tz' (560 KB)...
    OKAY [  0.059s]
    writing 'tz'...
    OKAY [  0.034s]
    finished. total time: 0.093s
    target reported max download size of 536870912 bytes
    sending 'tzbak' (560 KB)...
    OKAY [  0.049s]
    writing 'tzbak'...
    OKAY [  0.032s]
    finished. total time: 0.081s
    target reported max download size of 536870912 bytes
    sending 'sbl1' (474 KB)...
    OKAY [  0.049s]
    writing 'sbl1'...
    OKAY [  0.032s]
    finished. total time: 0.081s
    target reported max download size of 536870912 bytes
    sending 'sbl1bak' (474 KB)...
    OKAY [  0.049s]
    writing 'sbl1bak'...
    OKAY [  0.035s]
    finished. total time: 0.084s
    target reported max download size of 536870912 bytes
    sending 'sdi' (27 KB)...
    OKAY [  0.040s]
    writing 'sdi'...
    OKAY [  0.021s]
    finished. total time: 0.061s
    target reported max download size of 536870912 bytes
    sending 'rpm' (187 KB)...
    OKAY [  0.039s]
    writing 'rpm'...
    OKAY [  0.026s]
    finished. total time: 0.066s
    target reported max download size of 536870912 bytes
    sending 'rpmbak' (187 KB)...
    OKAY [  0.039s]
    writing 'rpmbak'...
    OKAY [  0.033s]
    finished. total time: 0.073s
    target reported max download size of 536870912 bytes
    sending 'aboot' (469 KB)...
    OKAY [  0.049s]
    writing 'aboot'...
    OKAY [  0.031s]
    finished. total time: 0.080s
    target reported max download size of 536870912 bytes
    sending 'abootbak' (469 KB)...
    OKAY [  0.049s]
    writing 'abootbak'...
    OKAY [  0.031s]
    finished. total time: 0.081s
    erasing 'boot'...
    OKAY [  0.039s]
    finished. total time: 0.039s
    erasing 'sec'...
    OKAY [  0.044s]
    finished. total time: 0.044s
    target reported max download size of 536870912 bytes
    sending 'misc' (8 KB)...
    OKAY [  0.040s]
    writing 'misc'...
    OKAY [  0.021s]
    finished. total time: 0.061s
    target reported max download size of 536870912 bytes
    sending 'modem' (73473 KB)...
    OKAY [  2.464s]
    writing 'modem'...
    OKAY [  1.285s]
    finished. total time: 3.749s
    target reported max download size of 536870912 bytes
    erasing 'system'...
    OKAY [  0.306s]
    sending sparse 'system' 1/3 (517255 KB)...
    OKAY [ 17.914s]
    writing 'system' 1/3...
    OKAY [ 10.276s]
    sending sparse 'system' 2/3 (520525 KB)...
    OKAY [ 17.445s]
    writing 'system' 2/3...
    OKAY [  9.472s]
    sending sparse 'system' 3/3 (507806 KB)...
    OKAY [ 17.591s]
    writing 'system' 3/3...
    OKAY [ 10.086s]
    finished. total time: 83.090s
    target reported max download size of 536870912 bytes
    erasing 'cache'...
    OKAY [  0.026s]
    sending 'cache' (8336 KB)...
    OKAY [  0.367s]
    writing 'cache'...
    OKAY [  0.161s]
    finished. total time: 0.554s
    target reported max download size of 536870912 bytes
    erasing 'userdata'...
    OKAY [  1.122s]
    sending 'userdata' (332558 KB)...
    OKAY [ 11.211s]
    writing 'userdata'...
    OKAY [  5.949s]
    finished. total time: 18.282s
    target reported max download size of 536870912 bytes
    sending 'recovery' (47717 KB)...
    OKAY [  1.651s]
    writing 'recovery'...
    OKAY [  0.839s]
    finished. total time: 2.490s
    target reported max download size of 536870912 bytes
    sending 'boot' (45541 KB)...
    OKAY [  1.530s]
    writing 'boot'...
    OKAY [  0.793s]
    finished. total time: 2.323s
    target reported max download size of 536870912 bytes
    sending 'bluetooth' (113 KB)...
    OKAY [  0.040s]
    writing 'bluetooth'...
    OKAY [  0.029s]
    finished. total time: 0.068s
    target reported max download size of 536870912 bytes
    sending 'bk2' (151 KB)...
    OKAY [  0.040s]
    writing 'bk2'...
    OKAY [  0.027s]
    finished. total time: 0.067s
    target reported max download size of 536870912 bytes
    sending 'logo' (1504 KB)...
    OKAY [  0.078s]
    writing 'logo'...
    OKAY [  0.048s]
    finished. total time: 0.126s
    target reported max download size of 536870912 bytes
    sending 'cust' (207452 KB)...
    OKAY [  7.012s]
    writing 'cust'...
    OKAY [  3.615s]
    finished. total time: 10.627s
    rebooting...
    
    finished. total time: 0.506s
    

    Dan selepas flashing, skrip akan otomatis menghidupkan ulang hape. Jangan kaget jika proses boot perdana ini berlangsung agak lama, tunggu saja. Jika selama boot muncul bootsplash Mi dan kemudian android, maka kemungkinan besar proses flashing telah berhasil.

That's it.
Mudah bukan? Sedemikian mudah sehingga saya merasa bodoh telah panik dan repot ketika mengalami bootloop kemarin.
Jadi jika lain kali Anda perlu untuk melakukan flashing ROM fastboot ke hape Xiaomi (atau Android) sementara hanya memiliki sistem GNU/Linux, jangan khawatir, flash saja hapenya dari dalam Linux seperti yang telah saya terangkan di atas.
Satu yang masih mengganjal adalah; apakah cara ini bisa dilakukan pada hape yang bootloader-nya masih terkunci?

Ehm, BTW, ternyata setelah hape ini memakai ROM MIUI 6.1.7 yang berdasar Android 5.1, ia masih tetap kesulitan dalam mengais sinyal... Damn...