博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
http://blog.csdn.net/howellzhu/article/details/42841191
阅读量:5037 次
发布时间:2019-06-12

本文共 3063 字,大约阅读时间需要 10 分钟。

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

 

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

这里主要介绍如何从system的源目录生成最后的ota的zip包。对于从ota包中解包得到文件的方式可以参见我的另一篇博文:。

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

 

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

其实制作system.img非常简单简单,请参考另一篇博文:。

 

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] 
 
  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] 
 
  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.   
  7. def main(argv):  
  8.   tgt = sparse_img.SparseImage("system.img");  
  9.   bif = blockimgdiff.BlockImageDiff(tgt, None)  
  10.   bif.Compute("system")  
  11.   
  12. if __name__ == '__main__':  
  13.   main(sys.argv[1:])  

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

 

[plain] 
 
  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] 
 
  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文件:

工具中包含的文件:
 

 

转载于:https://www.cnblogs.com/helinzi/p/4444964.html

你可能感兴趣的文章
spring.factories
查看>>
php使用amqplib方式使用rabbitmq
查看>>
打印控件
查看>>
技术团队的目标管理
查看>>
gitlab的介绍
查看>>
利用logging.basicConfig生成文件--中文乱码解决方法
查看>>
matlab新手入门(二)(翻译)
查看>>
Python 编码规范 PEP8
查看>>
mac os 下安装 nmap网络扫描和嗅探工具包
查看>>
python 迷宫问题
查看>>
Ubuntu 14.04 源
查看>>
android界面开发那点事
查看>>
js事件基础
查看>>
玩转CPU Topology
查看>>
jquery实现可以中英切换的导航条
查看>>
ConcurrentHashMap源码解析(JDK1.8)
查看>>
设计模式之中介者模式
查看>>
JavaScript动态清除
查看>>
SVN的忽略和只读使用方法学习记录
查看>>
smartupload 上传与下载(转载)
查看>>