最近在做一个手机项目,每次使用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,加上一行
/xxx vfat /dev/block/mmcblkXpY
xxx就是挂载点了,vfat是格式,后面是刚才记下来的设备名。
打开recovery.c,在main()中加入一行
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升级。只是不支持大文件的问题有些蹊跷,有时间再分析吧。
这篇文章是我转载过来的。我的问题是,我从华为的一个项目copy过来的时候,华为用自己独立的OTA升级的APK,而我自己开发了一个OTA的升级APK,之后可以进行SD卡升级,但是怎么样都无法进行内置存储升级,到目前,这还是一个问题,华为使用了一个/HWUser 这个目录。我的APK 找不到这个目录,没有把zip升级包复制进去。