无SD卡环境下安装Android OTA更新的可行性及实现方案问询
问题描述
我们有一台已root的Android 7.1设备,已开发配套应用及自定义ROM,ROM编译正常。
此前多年通过以下方式完成OTA更新:将OTA包推送到SD卡,在/cache/recovery目录放置脚本,设备重启进入Recovery后执行脚本完成安装,脚本内容如下:
--update_package=/sdcard/update.zip reboot
现在需推出无SD卡版本设备,但所有无SD卡OTA尝试均失败。尝试用内部存储存放更新包,但Recovery无法访问该存储。已尝试的方案及失败点:
- 将更新包存放至Recovery已挂载的文件夹,但无访问权限;
- 创建专门存放更新包的分区,但Recovery无法挂载该分区;
- 重启进入Recovery后推送更新包,但不知调用何种命令完成安装。
确认无SD卡情况下是否可完成OTA更新,若可行请给出实现方法。
解决方案
无SD卡情况下完全可以实现OTA更新,以下是针对Android 7.1设备的可行方案:
方案1:修复Recovery对内部存储的挂载支持
Android 7.1的Recovery默认未挂载内部存储对应的data分区,导致无法访问内部存储。需修改Recovery的挂载配置并重新编译:
- 找到Recovery源码中对应设备的
recovery.fstab文件(路径通常为device/[你的设备厂商]/[设备型号]/recovery.fstab); - 添加内部存储分区的挂载规则(需根据设备实际分区路径调整),示例:
/dev/block/bootdevice/by-name/userdata /data ext4 defaults relatime,errors=panic wait,check - 重新编译Recovery镜像并刷入设备;
- 系统模式下将更新包推送到内部存储根目录(对应Recovery中的
/data/media/0/update.zip); - 修改
/cache/recovery中的脚本为:--update_package=/data/media/0/update.zip reboot
设备重启进入Recovery后即可自动完成安装。
方案2:使用ADB Sideload推送更新
这是官方标准的无卡更新方式,无需提前在设备存放更新包:
- 确保你的自定义Recovery支持ADB Sideload功能。若没有,需在设备的
BoardConfig.mk中添加:
重新编译Recovery并刷入;BOARD_HAS_ADB_SIDELOAD := true - 设备重启进入Recovery,选择
apply update from adb选项; - 电脑端执行命令推送更新包:
adb sideload /path/to/your/update.zip - 推送完成后Recovery会自动安装更新,完成后提示重启设备。
方案3:利用Cache分区临时存放更新包
Cache分区是Recovery默认挂载且有权限访问的分区,可作为更新包的临时存储:
- 确认Cache分区空间足够容纳更新包,若不足需调整分区表及ROM编译配置扩大Cache分区;
- 系统模式下将更新包推送到
/cache/update.zip; - 修改
/cache/recovery中的脚本为:--update_package=/cache/update.zip reboot
设备重启进入Recovery后即可自动读取并安装更新包。
内容的提问来源于stack exchange,提问作者Mark Mercer
相关产品推荐
相关产品推荐

