MTK OTA (一)

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 在相应的项目中查看,

例如:


idh.code/customize/res/z502/base/z502.prj 中
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


当MTK_SYSTEM_UPDATE_SUPPORT = yes的宏打开后,这两个模块会参与编译。生成SystemUpdate.apk 和 SystemUpdateAssistant.apk
其中
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


WriteCommandService的主要工作是写入命令,如果升级包是放在data分区以外的位置的话,如sdcard(外置,内置sdcard通常是挂载在data分区的,通常是/data/media/)、cache分区等;
创建/cache/recovery/command文件,并写入命令:--update_package=升级包路径 
如果升级包是放在data分区的话,则需要:
1、创建一个/cache/recovery/uncrypt_file文件,并写入升级包路径
2、创建/cache/recovery/command文件,并写入命令:"@/cache/recovery/block.map"



通过不同的传参来调用RebootRecoveryService


1、如果升级包放在data分区的话,传入REBOOT_METHOD值为PMS_REBOOT(2),
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

猜你喜欢

转载自blog.csdn.net/zyfzhangyafei/article/details/78532395
OTA
MTK
今日推荐