android OTA 简介

    OTA 全称 over the air ,   OTA 升级是 Android 系统提供的标准软件升级方式。 它功能强大,提供了完全升级、增量升级模式,可以通过 SD 卡升级,也可以通过网络升级。

       这里,首先介绍SD卡升级,网络升级原理和SD卡大致一样.下面我们将介绍这一过程.在升级前,我们要准备升级包,所有编译好的包都命名为update.zip ,不管是增量升级还是完全升级.

    1.生成完全升级包.

    ./mk prj new

    ./mk prj otapackage

编译完成之后,将在\out\target\product\prj\目录下生成prj-ota-eng.root.zip ,这个zip将是我们升级用的包,我们要把他改名为update.zip ,然后copy 到SD卡的根目录下. 在运行上面指令的过程中,同时会在 out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip 这个文件非常重要,我们将他保存为old.zip 它是我们做增量包的基础文件.

 

    2.生成增量包.

    当代码有更新时,我们更新新的代码.同样运行./mk prj otapackage 产生代码更改后的完全升级包. 这时同样会在out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip 我们把它重命名为new.zip ,接下来我们完成生成增量包的最后一步.运行./build/tools/releasetools/ota_from_target_files -i old.zip new.zip diff.zip ,产生new.zip 到old.zip 的增量包diff.zip ,同样我们要把它命名为update.zip ,可以copy 到SD卡的更目录下,做增量式升级使用.

(备注:如果升级有特殊的要求,比如格式化data 分区,更新uboot等分区,需要修改ota_from_target_files.py 这个脚本)

 

    上面的内容介绍了如何准备update.zip 升级文件.接下来介绍升级过程.先说一下正常开机过程, 按power 键开机,uboot 在运行完之后,将把boot 分区的内容boot.img 文件加载到内存,然后跳转到boot中linux内核的开始位置,运行linux 内核代码,在内核的最后执行正常启动时的init.rc 文件,挂载system分区到/system 目录下,挂载data 分区到 /data 目录下.启动虚拟机等相关的一下服务.

    要升级程序,开机的时候,需要按住power 和下vol 键,这样uboot 在运行完之后将加载recovery分区的recovery.img 文件到内存.现在我们看一下,recovery.img 这个镜像里面有什么内容.详细的内容我们可以查看build/core/makefile 文件,在这个文件里面我们查找 Recovery image ,从这里开始的内容,主要是打包recovery.img 的内容.关于recovery.img的具体内容,说的简单点,就是linux 内核和将\out\target\product\prj\recovery目录打包成ramdisk 的一个镜像的集合.对比正常开机的boot.img镜像,区别为boot.img 里面的ramdisk镜像是out\target\product\prj\root 打包来的.其内核文件是同一个文件. recovery.img 镜像里面的ramdisk 文件系统包含的用于数据升级相关的bin文件,比如gzip,recovery 等重要的程序.

    在机器加载recovery.img ,执行完内核后,运行recovery 模式下的init.rc 该文件在bootable\recovery\etc\目录下,我们拿它和正常开机的init.rc 文件相比.发现recovery 模式的init.rc 仅仅新建了几个目录,包括sdcard,用于SD卡的挂载点.启动了2个service,一个ueventd,一个recovery的主菜单程序recovery(该文件是bootable\recovery\recovery.c 编程而成),内容非常简单.在recovery 的主界面,选择更新程序后,recovery将会解压update.zip 文件,执行其中的\META-INF\com\google\android\updater-script ,recovery会对脚本进行解析.下面是这个脚本的部分摘录.

 

show_progress(0.500000, 0);
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("recovery", "/system");
package_extract_dir("system", "/system");
symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",
        "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",
        .......
        "/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
........
show_progress(0.200000, 10);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
show_progress(0.100000, 0);
unmount("/system");

(以上脚本为系统自动生成)

从脚本可以看到,首先格式化system区分,然后把updata.zip 里面的system目录的内容解压到system 分区.接着修改system分区下文件的权限.最后将boot.img 镜像写回到boot 分区.

 

    从以上的介绍,可以看到android 的功能非常强大,在recovery 模式下,linux 已经完全跑了起来.除了apk,jar 不能运行之外,你可以做任何你想做的事情.上面的例子中,更新了system分区和boot分区,如果需要还可以更新 uboot分区,logo分区,格式化data 分区等等 .

    关于OTA的网络实现,实际上是检查网络上的更新,或者网络通知更新.把更新包(update.zip)下载到本地,在用户的选择下,重启机器自动进入recovery模式,执行上面的过程.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值