android OTA 升级包含增量升级
来源:互联网 发布:java math.ceil 编辑:程序博客网 时间:2024/06/05 05:56
转自:http://www.xuebuyuan.com/631753.html
这篇文章页不错,参考:http://lhc180.blog.51cto.com/316940/757378
这篇文章页写得很好:http://blog.csdn.net/mu0206mu/article/details/7399822
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模式,执行上面的过程.
- android OTA 升级包含增量升级
- android OTA升级
- Android OTA 升级
- Android OTA 升级
- Android OTA 升级
- Android OTA升级过程
- android OTA 升级
- Android OTA 升级
- Android OTA 升级
- Android OTA升级
- android 空中OTA升级
- Android系统OTA升级
- Android ota 升级
- Android OTA蓝牙升级
- [转][Android]Android OTA 升级
- Android增量升级功能
- Android应用增量升级
- android 增量升级
- JVM(java 虚拟机)内存设置
- LeetCode OJ算法题(三):Longest Substring Without Repeating Characters
- 1014. 福尔摩斯的约会 (20)
- NYOJ 网络的可靠性(换个思路想超简单的一道题)
- android源码使用U盘激活Launcher
- android OTA 升级包含增量升级
- android打包混淆-proguard配置详解
- android ueventd 本地native部分源码分析
- OFBiz entity engine 关于数据库自增序列生成算法的源码解读
- float (**def)[10]这个是什么?
- Android中通过xml资源文件定义数组
- 黑马程序员-点语法,成员变量作用域,@property,@synthsize和 id
- 两个Fragment之间的跳转,和数据的传递
- C++习题 矩阵求和--重载运算符