http://blog.csdn.net/howellzhu/article/details/42841191

Android 5.0开始,ota包采用了一种新的system.img的压缩方式。对于这种方式,如果是完整地升级,在ota的zip包中放的基本上就是一个ext4格式的image,但是它不是完整的ext4镜像,而是一个扣除了很多全零信息的包。如果是针对一个基础镜像做差值得到的差量包,也可以用这种方式进行稀疏描述。

这里主要介绍如何从system的源目录生成最后的ota的zip包。对于从ota包中解包得到文件的方式可以参见我的另一篇博文:Android5.0的更新包中system.new.dat文件的解包http://blog.csdn.net/howellzhu/article/details/41967523

如果想生成一个ota完整包,一般会放置boot、system以及其他一些image,后面的一般跟设备有关,比如radio,slb等。Boot的生成其实也跟设备相关,比如有的需要dt(device tree)什么的。这里主要介绍一下system的打包:如何生成system.new.dat等文件。

1.      第一步,利用system目录和file_contexts生成system.img

其实制作system.img非常简单简单,请参考另一篇博文:android中system.img的打包过程

http://blog.csdn.net/howellzhu/article/details/42804191

2.利用system.img得到system.new.dat、system.patch.dat和system.transfer.list文件

这是本文的重点。

这个过程的主要目的是降低ota.zip的大小,将system.img转换成为稀疏数组描述。

我们先看看android的源代码工具是如何工作的。

在blockimgdiff.py文件中,blockimgdiff.py:BlockImageDiff::WriteTransfers()函数中,会将self.transfers中的所有xf写入transfer.list文件中。

参见如下的调用栈:

[html] view plaincopy

  1. [call stack]
  2. build/tootls/releasetools/blockimgdiff.py:BlockImageDiff::ComputePatches&BlockImageDiff::WriteTransfers
  3. build/tootls/releasetools/blockimgdiff.py:BlockImageDiff::Compute
  4. build/tootls/releasetools/common.py:BlockDifference::__init__
  5. build/tootls/releasetools/ota_from_target_files:WriteFullOTAPackage
  6. build/tootls/releasetools/ota_from_target_files:main()
  7. /build/core/Makefile:$(INTERNAL_OTA_PACKAGE_TARGET):$(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)

其实BlockImageDiff的是一个sparse_img.SparseImage对象和一个None对象。

用下面的img2sdat.py脚本就可以在当前目录下生成system.new.dat、system.transfer.list和空的system.patch.dat文件:

[python] view plaincopy

  1. </pre><pre name="code" class="python">#!/usr/bin/env python
  2. import sys
  3. import blockimgdiff
  4. import sparse_img
  5. from rangelib import *
  6. def main(argv):
  7. tgt = sparse_img.SparseImage("system.img");
  8. bif = blockimgdiff.BlockImageDiff(tgt, None)
  9. bif.Compute("system")
  10. if __name__ == ‘__main__‘:
  11. main(sys.argv[1:])

为了简化工作,我将上述的一些python脚本进行打包,形成一个python包文件:img2sdat.zip,并提供在文章最后提到的mkotazip工具包中。利用该包对system.img的处理就非常简单了,就是如下的命令:

[plain] view plaincopy

  1. $ python img2sdat.zip

这样就会在当前目录下生成system.new.dat、system.patch.dat和system.transfer.list文件。

3. 准备升级脚本文件和升级执行文件

升级执行文件由Android提供,名字是update-binary,需要放在压缩包中如下目录:META-INF/com/google/android

为了方便,我已经将该文件打包在最后提到的压缩文件中了。

另一个文件就是自己要编写修改的updater-script脚本文件了,也需要放在压缩包中和update-binary一个目录。这里提供一个hammerhead的参考:

[html] view plaincopy

  1. show_progress(0.05, 0);
  2. getprop("ro.product.device") =="hammerhead" || abort("This package is for\"hammerhead\" devices; this is a \"" +getprop("ro.product.device") + "\".");
  3. show_progress(0.75, 10);
  4. block_image_update("/dev/block/platform/msm_sdcc.1/by-name/system",package_extract_file("system.transfer.list"),"system.new.dat", "system.patch.dat");
  5. show_progress(0.20, 2);
  6. package_extract_file("boot.img","/dev/block/platform/msm_sdcc.1/by-name/boot");

4. 将上面准备的文件打包生成一个zip文件。

这一步非常简单,利用zip、minizip或者7zip等工具都可以实现。为了方便,在mkotazip工具中提供了一个install.sh脚本,将前面生成的那些文件放到合适的目录下,然后打包。该脚本接受一个参数,即存放ota包的目的目录。如果不指定,在当前目录下新建一个otazip目录,然后作为目标目录。

5.对该zip文件进行签名[可选]

这部分内容就不说了,网上有很多类似的文章。

总结一下上面的步骤。

1.      下载博文中提到的工具包mkotazip.zip(下载地址参见文章最后)解压;

2.      利用mkext4_fs工具生成system.img;

3.      利用命令python img2sdat.zip得到system.new.dat等文件;

4.      修改updater-script文件;

5.      运行install.sh脚本,生成ota.zip文件。

Ok

附录:mkotazip.zip文件:

mkotazip工具

工具中包含的文件:

时间: 2024-08-27 17:51:49

http://blog.csdn.net/howellzhu/article/details/42841191的相关文章

中文录入问题 转载自:http://blog.csdn.net/ichsonx/article/details/8625925

2.1中文录入问题 默认安装的msysgit的shell环境中无法输入中文,为了能在shell界面输入中文,需要修改配置文件/etc/inputrc,增加或修改相关配置如下: #disable/enable 8bit input set meta-flag on set input-meta on set output-meta on set convert-meta off 关闭bash再重启就可以输入中文了. 2.2分页器中文输出问题 对于/etc/inputrc正确配置之后能正确输入中文了

VMware下Ubuntu与宿主Windows共享文件夹 (转至 http://blog.csdn.net/zz962/article/details/7706755)

概述1.安装VMware Tool2.设置共享 步骤开始安装VMware Tool 显示如下画面(如果宿主无法访问外网,可能会出现一个更新失败,可以无视之) 通过下列命令解压.执行,分别是下面的tar和sudo的两行(下面是已有vmware tool的情况,注意密码是登录口令,不会显示) 一路按Enter,最后得到 在VMware中给虚拟机设置共享目录 执行mount命令(下图中sudo mount那一行),之后mnt/hgfs里就可以看到前面设置的共享目录 如果mnt出错,可以执行 sudo

解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347

本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2. 冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中

第十八章 并发登录人数控制——《跟我学Shiro》(http://blog.csdn.net/lhacker/article/details/19334305)

第十八章 并发登录人数控制——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro 目录贴:跟我学Shiro目录贴 在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录:要么踢出前者登录(强制退出).比如spring security就直接提供了相应的功能:Shiro的话没有提供默认实现,不过可以很容易的在Shiro中加入这个功能. 示例代码基于<第十六章 综合实例>完成,通过Shiro Filter机制扩展Ki

Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)

开始使用QT了,所以第一步就是把环境搭起来,这里小记一下,以免以后忘记. 1. 下载安装文件 要使用QT功能,那么必须要下载QT的源码,还必须要一个是用QT的编译环境,可以是VS2010,也可以是专用于QT编程的QT Creator.本人选择QT Creator,所以也必须要下载QT Creator. 根据网上大部分教程及自己买的书籍获取的信息,在选择版本的时候,QT 源码选择4.8.4,而QT Creator选择2.8.0(QT5.0以后许多原有的文件路径改变). 选择好版本之后,可以上QT的

http://blog.csdn.net/wzlas111/article/details/39741091

转载:http://blog.csdn.net/wzlas111/article/details/39741091 Android TV上的焦点凸显特效相信大家都看到过,那么我们就来实现它吧,首先上张效果图. 先说一下实现原理,主要通过重写RelativeLayout实现item,之后在其中加入scalanimation动画效果.刚开始处理时,还是发现了一些问题,比如item放大后会被其他item遮挡,如何添加选中边框等等,以及动画的实现等等.下面放上实现细节. 首先是item的代码: [htm

Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)

本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包 下载 (2012-10-10更新) 一.Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具. apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的

ABAP面试经历【转http://blog.csdn.net/tsj19881202/article/details/8792742】

本周三面试了一次HP的globe部门,整个过程自己感觉特别糟糕.总结了一下经验, 1.不能把自己平时做的东西,很好的用语言描述出来 2.技术点其实都会,但是不了解对方问题的意思,所以没能很好的回答对方的问题.比如问对方dialog有几个事件,我只记得有pai,pbo.其实f1和f4事件也是.但是我没有意识到.诸如此类的问题有很多. 3. 简历上一定要真实的经验.比如我简历上写了逻辑数据库知识,但是这个跟我理解的是有差别的. 以下是我面试的一些题目.只做参考 开始,就是英文的自我介绍,大致讲一下自

一致性hash 参考:http://blog.csdn.net/cywosp/article/details/23397179/

hash好坏的四个定义: 平衡性:平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用. 单调性:单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中.哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区. 添加节点后,原有的哈希结果要么不迁移,要么迁移到新的节点,不会迁移到旧的节点.以hash后取模方式为例,增加一个节点(槽),有的键可能分配到旧节点里 分散性:在分布式