android ota增量包的制作

由于项目需求,需要制作一个ota zip包的增量升级包,命令如下:

./build/tools/releasetools/ota_from_target_files -v -i ~/chafen2/A.zip ~/chafen2/B.zip ~/chafen2/update.zip

其中 -v代表 打印详细信息, -i代表生成 增量包,A.zip代表基础包, B.zip代表要升级到的包, update.zip代表将来要生成的差分包。



这里有两点需要注意

1. 必须在build目录下运行上面的命令, 如果在releasetools目录下执行   ota_from_target_files -v -i ~/chafen2/A.zip ~/chafen2/B.315.zip ~/chafen2/update.zip, 那么会报错。

2. A.zip 和 B.zip 不是ota包,这点一定要注意, 他们的路径是在out/target/product/mt5880/obj/PACKAGING/target_files_intermediates下。


生成的增量包里其实有两种,一种是由.p组成的, 一种是原始的.apk 或者so。 在ota_from_target_files 这个python文件里, 有一个阀值,默认是0.95, 也就是说,新版本和旧版本的同一个文件对比,如果差异小于0.95,那么就生成.P的差分包, 如果差异大于0.95,那么就把新版本的这个文件放进去,到时候升级的时候直接替换这个文件。

这个阀值的名字是OPTIONS.patch_threshold = 0.95 。

个人感觉 生成.P的差分包不是很实用, 因为用户在安装了原始包后, 很有可能做了一些升级apk,或者其他的改动, 即用户现在系统 和原始包很可能已经不一样了,这个时候生成的.P差分包就会升级失败。 而我们的用户是以万计, 使用.P的差分包很有可能造成很多用户升级失败, 所以我们不再用这种方式的升级包。

修改也很简单, 把OPTIONS.patch_threshold = 0。 就可以了。


另外,在升级的时候可能会出现失败, 我们可以到 /cache/recovery/last_log 里查看失败的原因, 我第一次制作的差分包, 升级失败,log如下:

Installing update...
kevin____update_package_path:/mnt/usb/sda1/V8-0MT5502-LF1V317.zip
Verifying current system...
contents of partition "/dev/block/mmcblk0p5" didn't match EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33
file "EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33" doesn't have any of expected sha1 sums; checking cache
failed to stat "/cache/saved.file": No such file or directory
failed to load cache file
script aborted: assert failed: apply_patch_check("EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33")
assert failed: apply_patch_check("EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33")
E:Error in /mnt/usb/sda1/V8-0MT5502-LF1V317.zip
(Status 7)
Installation aborted.


可以看到是由于

contents of partition "/dev/block/mmcblk0p5" didn't match EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33
, 这个原因我百思不得骑姐,查看update.zip里的升级脚本, 可以看到/dev/block/mmcblk0p5是/boot分区,后来 我们的解决方法是,在ota_from_target_files去掉了boot 的差分,代码如下:

549   updating_boot = (source_boot.data != target_boot.data)
550   updating_boot = False
551 
552   source_recovery = common.GetBootableImage(
553       "/tmp/recovery.img", "recovery.img", OPTIONS.source_tmp, "RECOVERY")
554   target_recovery = common.GetBootableImage(
555       "/tmp/recovery.img", "recovery.img", OPTIONS.target_tmp, "RECOVERY")
556   updating_recovery = (source_recovery.data != target_recovery.data)
557   updating_recovery = False

这样暂时解决了问题, 可如果以后boot.img也有变化呢? 以后遇到再说吧。


下面是我写的一个脚本command.sh,可以自从拷贝基础包以及新的升级包到当前目录下,使用方法也很简单,./command.sh 或./command.sh -f

代码如下:

#!/bin/bash

# usage : ./command.sh  or  ./command.sh -f
# This command will copy old.zip(new.zip) to current dir and name it A.zip(B.zip), and then make increasmental package , the final generate file is update.zip 
# if -f parameter is given, A.zip and B.zip will be removed and copy again.
#  


CUR_DIR=`pwd`

OLD_ZIP_PATH="/home/lw/mt55_3600_old/Code_GridUI/Project/vm_linux/android/ics-4.x/out/target/product/mt5880/obj/PACKAGING/target_files_intermediates"
NEW_ZIP_PATH="/home/lw/mt55_3600/Code_GridUI/Project/vm_linux/android/ics-4.x/out/target/product/mt5880/obj/PACKAGING/target_files_intermediates"

echo ----------------Setp 1 , get A.zip and B.zip ----------------------
if [ ! -e ${CUR_DIR}/A.zip ]; then
    echo "A.zip doesn't exist, copy A.zip form ${OLD_ZIP_PATH}/*.zip"
    cp ${OLD_ZIP_PATH}/*.zip ${CUR_DIR}/A.zip
elif [ "$1" == "-f" ]; then
    echo "remving A.zip and copy from ${OLD_ZIP_PATH}"
    cp ${OLD_ZIP_PATH}/*.zip ./A.zip
else 
    echo "A.zip exist..."
fi

if [ ! -e ${CUR_DIR}/B.zip ]; then
    echo "B.zip doesn't exist, copy B.zip form ${NEW_ZIP_PATH}/*.zip"
    cp ${NEW_ZIP_PATH}/*.zip ${CUR_DIR}/B.zip
elif [ "$1" == "-f" ]; then
    echo "remving B.zip and copy from ${NEW_ZIP_PATH}"
    cp ${NEW_ZIP_PATH}/*.zip ./B.zip
else 
    echo "B.zip exist..."
fi
echo Step1 Done. ------------------------------
echo 
echo 
echo


echo Step2--------------Copy ota_from_target_files-------------
pushd ${NEW_ZIP_PATH}/../../../../../../../build/tools/releasetools/
cp ota_from_target_files  ota_from_target_files.backup
cp ${CUR_DIR}/ota_from_target_files ./
popd


echo Step3--------------Start generate increasmental package...-------------

rm ~/chafen2/update.zip  2>/dev/null
#pushd /home/lw/mt55_3600/Code_GridUI/Project/vm_linux/android/ics-4.x/
pushd ${NEW_ZIP_PATH}/../../../../../../../
./build/tools/releasetools/ota_from_target_files -v -i ${CUR_DIR}/A.zip ${CUR_DIR}/B.zip ${CUR_DIR}/update.zip
popd


echo ---------------Generate increasmental package Done---------------------
ls --color=auto -alht

pushd ${NEW_ZIP_PATH}/../../../../../../../build/tools/releasetools/
cp ota_from_target_files.backup  ota_from_target_files
popd


ota_from_target_files 修了2处,修改的代码如下:

1.

 84 #OPTIONS.patch_threshold = 0.95                                                                                                                   
 85 OPTIONS.patch_threshold = 0

2.
549   updating_boot = (source_boot.data != target_boot.data)
550  updating_boot = False

556   updating_recovery = (source_recovery.data != target_recovery.data)
557   updating_recovery = False




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值