前面兩篇博客分別介紹了經過fastboot和QFIL工具退出FFBM模式的方法。雖然售後的同窗能夠這麼指導用戶作恢復,但步驟多操做也麻煩,且屬於過後處理,若是大面積高几率地出現,會嚴重影響用戶體驗。這個問題是高通引入FFBM模式致使的,採用高通芯片方案的Android設備均可能會出現。Google一下,友商Pico的VR一體機用戶在官方論壇反映《進入FFBM模式怎麼退出》,一個多月前的帖子目前尚未迴應。這裏必須爲咱們售後的同窗點贊,客戶反饋問題24小時內就回應並解決了。Android手機主要是聯想的旗艦機ZUK出現過,《The phone is blocking in mode FFBM》、《stuck in "ffbm" diagnostics》、《HELP. Test Mode / FFBM Mode》。看來必須從根上接決這個問題,不然售後同窗的壓力會很大,用戶也會很煩。php
進入FFBM模式是由於misc分區被修改了,誰修改的一時也弄不清楚。從售後同窗那裏瞭解到,用戶並無作root或unlock等特殊操做。考慮到可能有多個修改的源,無法都給堵上,因此打算從後端入手,修改init直接過濾掉該模式,不管misc分區被修改爲什麼樣,都直接啓動到Android系統,而不進入FFBM。修改的代碼不多,以下。html
修改代碼後,執行命令make systemimage -j8編譯生成system.img,經過fastboot將新生成的system.img燒錄處處於FFBM模式下的故障機器裏,並重啓。奇蹟出現了,果真正常進入了Android系統,以下圖所示。android
能夠看到,Kernel是老的,Android是新的。再查看misc分區的內容及dmesg,以下圖所示。後端
經過dd命令查看misc分區,內容爲ffbm-00,Kernel command line有androidboot.mode=ffbm-00的配置,在init中直接忽略了androidboot.mode的配置,Android系統正常啓動,相關log以下。工具
msm8998:/ # dd if=/dev/block/bootdevice/by-name/misc count=1 bs=128 ffbm-00 boot-factory 1+0 records in 1+0 records out 128 bytes transferred in 0.004 secs (32000 bytes/sec) msm8998:/ # dmesg | grep -iE "ffbm|androidboot" [ 0.000000] Kernel command line: rcupdate.rcu_expedited=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc1b0000 androidboot.hardware=qcom androidboot.veritymode=enforcing androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.bootdevice=1da4000.ufshc androidboot.serialno=25f47d23 androidboot.mode=ffbm-00 quite dvt androidboot.baseband=apq skip_initramfs rootwait ro init=/init root=/dev/sda6 [ 1.172876] init: Ignore androidboot.mode!
改動以前的log以下,init會根據Kernel command line的配置進入ffbm模式,fs_mgr不掛載userdatafs_mgr,而且不啓動Android。ui
[ 0.000000] Kernel command line: rcupdate.rcu_expedited=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc1b0000 androidboot.hardware=qcom androidboot.veritymode=enforcing androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.bootdevice=1da4000.ufshc androidboot.serialno=25f47d23 androidboot.mode=ffbm-00 quite dvt androidboot.baseband=apq skip_initramfs rootwait ro init=/init root=/dev/sda6 [ 1.355482] init: Booting into ffbm mode [ 1.849985] fs_mgr: ffbm mode,skip mount userdatafs_mgr: __mount(source=/dev/block/bootdevice/by-name/modem_a,target=/firmware,type=vfat)=0
[ 1.869366] init: ffbm mode, not start class main