Android OTA 简介

来源:互联网 发布:js中switch case语句 编辑:程序博客网 时间:2024/05/29 08:49

AndroidOTA 简介

   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 ,然后copySD卡的根目录下.

 在运行上面指令的过程中,同时会在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 ,可以copySD卡的更目录下,做增量

式升级使用.

(备注:如果升级有特殊的要求,比如格式化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卡的挂载点.启动了2service,一个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模式,执行上面的过程.

   

 

原创粉丝点击