Android recovery從內置存儲升級

最近在做一個手機項目,每次使用ZIP包升級都需要先拷到SD卡上,然後再從SD卡上升級。SD卡不好找,每次都要從別的手機上卸下來,升級完再裝回去,麻煩的很。既然支持內置存儲,為什麼不能從內置存儲上升級呢?貌似華為等手機都支持這個功能的。

進入recovery,看到默認是不掛載內置SD的,僅支持外部SD。首先要做的是把內置SD掛載上。

正常啟動,adb shell,df查看當前內置SD卡是怎麼掛載的。

這裡看到是一個類似 /dev/block/vold/179:1 之類的設備,顯然是被vold管理著的。根據設備號,到 /dev/block下 ls -l 一下,找到設備真正的名字,是mmcblkXpY之類的,其中XY是數字。先記下來。

打開recovery.fstab,加上一行

[plain]
/xxx vfat /dev/block/mmcblkXpY 

xxx就是掛載點瞭,vfat是格式,後面是剛才記下來的設備名。
打開recovery.c,在main()中加入一行

[cpp] 
ensune_path_mounted("/xxx"); 

編譯運行,在通過ADB查看,/xxx這個目錄已經被掛載上瞭,ls看一下,內容與正常開機時顯示一樣。
第一個問題解決瞭,內置SD卡可以正常掛載。下來一個問題是,如何在recovery添加菜單項和對應的功能。

查看代碼,main()最後是用prompt_and_wait()函數來等待操作,在這個函數裡,又是通過get_menu_selection()來獲得當前菜單選擇。打開default_recovery_ui.c,找到MENU_ITEMS,在其中增加一項。recovery_ui.h中增加對應的宏。回到prompt_and_wait(),仿照ITEM_APPLY_SDCARD,增加自己的處理流程。基本上都是一樣的,隻是把路徑替換成瞭/xxx。

再編譯,運行。

這裡遇到瞭一個問題,運行後卡死,通過DEBUG發現是將文件從內置SD讀入內存的時候莫名其妙的崩潰瞭,還看不到錯誤到底是怎麼回事。於是修改瞭一下升級用的ZIP包,精簡掉一些APK,文件體積變小瞭。再使用這個較小的ZIP,成功升級。

通過以上方法修改,可以成功從內置SD升級。隻是不支持大文件的問題有些蹊蹺,有時間再分析吧。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。