android OTA 简介

来源:互联网 发布:netstat查看指定端口 编辑:程序博客网 时间:2024/05/30 23:35
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 -iold.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会对脚本进行解析.下面是这个脚本的部分摘录.

 

[html] view plaincopy
  1. show_progress(0.500000, 0);  
  2. format("yaffs2", "MTD", "system");  
  3. mount("yaffs2", "MTD", "system", "/system");  
  4. package_extract_dir("recovery", "/system");  
  5. package_extract_dir("system", "/system");  
  6. symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",  
  7.         "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",  
  8.         .......  
  9.         "/system/bin/wipe");  
  10. set_perm_recursive(0, 0, 0755, 0644, "/system");  
  11. ........  
  12. show_progress(0.200000, 10);  
  13. assert(package_extract_file("boot.img", "/tmp/boot.img"),  
  14.        write_raw_image("/tmp/boot.img", "boot"),  
  15.        delete("/tmp/boot.img"));  
  16. show_progress(0.100000, 0);  
  17. unmount("/system");  
  18.   
  19. (以上脚本为系统自动生成)  

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

 

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

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