1、打开systemupdate的编译开关
客户项目下的ProjectConfig.mk,把MTK_SYSTEM_UPDATE_SUPPORT这个宏设置为true
topwise的源代码配置是在idh.code/device/top/[BASE_DEVICE]/ProjectConfig.mk中配置 MTK_SYSTEM_UPDATE_SUPPORT = yes其中top6737t_35g_m0 在相应的项目中查看,
例如:
BASE_PRODUCT=full_top6737t_35g_m0
BASE_DEVICE=top6737t_35g_m0 ------这里
CUSTOMIZE_SRC_mediatek=z502
CUSTOMIZE_SRC_servicemenu=z502
打开该宏编译完成后,版本中打开 设置-》关于手机-》系统升级 菜单就会显示出来
上层代码:
alps/vendor/mediatek/proprietary/packages/apps/SystemUpdate
alps/vendor/mediatek/proprietary/packages/apps/SystemUpdateAssistant
其中
SystemUpdate.apk模块:
包含了更新策略、下载、安装等及服务器打交道的一些功能。
我们这里不关注他的更新策略和任务管理、下载等功能,只关心更新包下载、检查完毕后的安装过程。
SystemUpdateAssistant.apk模块:
是一个辅助模块,里面仅有RebootRecoveryService、WriteCommandService、SysOperService三个服务。
SystemUpdate在调用installPackage函数,使用InstallPkgThread这个类(线程)。
在这个InstallPkgThread类中主要使用 setInstallInfo函数和调用SystemUpdateAssistant的RebootRecoveryService服务
调用GoogleOtaBinder本地服务:
代码路径:idh.code/vendor/mediatek/proprietary/external/GoogleOtaBinder
setInstallInfo 通过GoogleOtaBinder远程调用接口 GoogleOtaAgent::setRebootFlag() 把命令“boot-recovery”写入到/misc的指定位置,
这个位置对于emmc flash来说,就是0。
GoogleOtaBinder提供的三个远程接口:
int setRebootFlag() //写misc分区reboot命令int clearUpgradeResult() //擦除misc分区中的命令
int readUpgradeResult() //从misc分区中读取结果
调用WriteCommandService:
创建/cache/recovery/command文件,并写入命令:--update_package=升级包路径
如果升级包是放在data分区的话,则需要:
1、创建一个/cache/recovery/uncrypt_file文件,并写入升级包路径
2、创建/cache/recovery/command文件,并写入命令:"@/cache/recovery/block.map"
通过不同的传参来调用RebootRecoveryService:
2、如果是在非data分区的话,传入REBOOT_METHOD值为NORMAL_REBOOT(1)
调用RebootRecoveryService:
1、如果传入的REBOOT_METHOD为NORMAL_REBOOT(1:正常启动),则以normal的方式重启机器
2、如果传入的REBOOT_METHOD为PMS_REBOOT(2),则以recovery的方式重启机器
至此,上层的准备工作就结束了。接下来的工作,由重启后的部分来完成。
开机流程:
uboot在启动时,会读取位于misc分区的bootloader_message (BCB :Bootloader Control Block ) ,判断是否是进入正常的kernal还是进入recovery。结构体定义:
struct bootloader_message{
char command[32]; //存放不同的启动命令
char status[32]; //update-radio或update-hboot完成存放执行结果
char recovery[1024]; //存放/cache/recovery/command中的命令
};
我们在上层setInstallInfo时,就通过GoogleOtaBinder把命令“boot-recovery”写入到/misc的指定位置。recovery是一个完整的系统,只是这个系统没有我们一般的android系统那么复杂。
代码:idh.code/bootable/recovery/recovery.cpp
在main()函数中,来判断传入参数,执行相应的操作,如果是:
load_volume_table();//加载分区配置表(recovery系统的/etc/recovery.fstab)
mt_main_init_sdcard2();//检查并创建sdcard2,外置T卡
开始升级:
mt_main_update_package() -> install_package()->really_install_package()
参考资料:
http://www.cnblogs.com/xiaolei-kaiyuan/p/5456227.html
http://blog.csdn.net/zpc1012/article/details/46483047
http://blog.csdn.net/fengying765/article/details/38301895
http://blog.csdn.net/myarrow/article/details/8115610
签名问题:
http://blog.csdn.net/huangyabin001/article/details/44465145
http://blog.csdn.net/wzy_1988/article/details/46862247#recovery%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90
Android 镜像文件生成流程
http://blog.csdn.net/kehyuanyu/article/details/47110065
linux之fstab文件详解
http://blog.csdn.net/richerg85/article/details/17917129