Android OTA 差分包升级
原帖地址 http://quanminchaoren.iteye.com/blog/1344607
稍作修改,因为直接用会有些错误
根目录下两个命令:
1、make ——会生成系统的img文件,system.img,boot.img,userdata.img,recovery.img
2、make otapackage——会生成sd卡用的全部系统升级包,如msm8660_surf-target_files-eng.xxxx.zip
要生成差分升级包,需要先作出两个全升级包,然后根据这两个升级包做出差分升级包
1、制作全系统升级包
source目录下:. build/envsetup.sh(.后有空格)
choosecom 1 1 7 eng
make
make otapackage(或m otapackage)
2、在用户名下建立一个目录,这个随意,在哪里建都行
mkdir ~/OTA
3、将编译生成的out/target/product/msm8660_surf/obj/PACKAGING/target_files_intermediates/msm8660_surf-target_files-eng.xxxx.zip 拷贝并且更名放到目录~/OTA/msm8660_surf-target_files-eng.A.zip
4、在代码中做一些修改,
5、第二次make;make otapackage
6、第二次编译生成的out/target/product/msm8660_surf/obj/PACKAGING/target_files_intermediates/msm8660_surf-target_files-eng.xxxx.zip 拷贝并且更名放到目录/OTA/msm8660_surf-target_files-eng.tangzm_B.zip
7、在src根目录下执行制作差分包的命令,必须在src根目录下执行,因为ota_from_target_files.py这个脚本里面写定了相对路径的引用文件。
./build/tools/releasetools/ota_from_target_files -x pagesize=xxxx -k xxxx -d MMC -i <A包> <B包> <差分包名>。
如: ./build/tools/releasetools/ota_from_target_files -x pagesize=4096 -k ~/project/build/target/product/security/testkey -d mmc -v -i ~/OTA/msm8660_surf-target_files-eng.tangzm_B.zip ~/OTA/msm8660_surf-target_files-eng.tangzm_B.zip ~/OTA/update.zip
~/OTA/update.zip 就是升级用的差分包。
注:
在源码根目录下采用步骤7中命令格式( ./build/tools/releasetools/ota_from_target_files -x pagesize=xxxx -k xxxx -d MMC -i <A包> <B包> <差分包名>。)不好用,因为我的是厂家自定义编译脚本,需要用到外部.py文件,所以修改了build/core/Makefile文件,该文件中默认好像执行./build/tools/releasetools/ota_from_target_files生成FullOtaPackage,我在调用位置采用步骤7命令格式保存修改,编译,根据log显示看到能够进行A、B包的差分比较。
-x pagesize=4096 是设置pagesize的大小,因为执行程序的过程中需要这个参数,否则会报错keyerror。 还有一种情况不加-x,编译时出现keyerror错误,可能是引用外部key-value时,key不存在导致(如:keyerror:'/recovery'),我编译时折腾了一天,原因是编译脚本是厂家自定义,里面包含android系统既存编译命令m otapackage,在自定义的脚本中键值对为(recovery,recovery),而在调用build/tools/releasetools/ota_from_target_files中函数时传的参数为"/recovery"。
-k 是在签名的时候会用到的信息,不过貌似不加也可以成功,因为后面会执行java命令进行签名
-d mmc 是指使用文件格式为ext4,默认为mtd,即yaffs2。因为我们这个系统使用了ext4文件系统的支持
-v 显示具体命令
-i A.zip B.zip Update.zip 为产生增量包,后面跟着源文件和差分包的路径名称
不明确的话 ,可以直接打开ota_from_target_files 里面有各个命令的说明。
这个脚本被build/core/Makefile调用,因为Makefile中有引用外部变量所以不用特别设置,但是直接执行这个脚本则要设置import相关信息,好像很麻烦,还是用build/core/Makefile调用来的方便。