由于项目需求,需要制作一个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 = 02.
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