当前位置:操作系统 > 安卓/Android >>

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升级。只是不支持大文件的问题有些蹊跷,有时间再分析吧。

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,