由于项目需求,需要制作一个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.zipVerifying current system...contents of partition "/dev/block/mmcblk0p5" didn't match EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33file "EMMC:/dev/block/mmcblk0p5:12580864:e4c3dde9067bc504d2b6d9355087332120bd607d:12580864:ab551c408865952c46d580e1bd17b08660b33e33" doesn't have any of expected sha1 sums; checking cachefailed to stat "/cache/saved.file": No such file or directoryfailed to load cache filescript 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 = False551 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.zipelif [ "$1" == "-f" ]; then    echo "remving A.zip and copy from ${OLD_ZIP_PATH}"    cp ${OLD_ZIP_PATH}/*.zip ./A.zipelse     echo "A.zip exist..."fiif [ ! -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.zipelif [ "$1" == "-f" ]; then    echo "remving B.zip and copy from ${NEW_ZIP_PATH}"    cp ${NEW_ZIP_PATH}/*.zip ./B.zipelse     echo "B.zip exist..."fiecho Step1 Done. ------------------------------echo echo echoecho Step2--------------Copy ota_from_target_files-------------pushd ${NEW_ZIP_PATH}/../../../../../../../build/tools/releasetools/cp ota_from_target_files  ota_from_target_files.backupcp ${CUR_DIR}/ota_from_target_files ./popdecho 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.zippopdecho ---------------Generate increasmental package Done---------------------ls --color=auto -alhtpushd ${NEW_ZIP_PATH}/../../../../../../../build/tools/releasetools/cp ota_from_target_files.backup  ota_from_target_filespopd


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 = False556   updating_recovery = (source_recovery.data != target_recovery.data)557   updating_recovery = False




更多相关文章

  1. myTuTu(android版) flash(.swf)生成程序(源码)
  2. android studio中使用NDK开发C++
  3. Android(安卓)编译生成目录
  4. Android(安卓)热修复 Tinker Gradle Plugin解析
  5. 如何使用Android(安卓)Studio开发/调试Android源码
  6. Android(安卓)Jetpack重磅升级!新的类库以及现有类库重大更新!
  7. Android(安卓)studio打包生成Jar包
  8. android studio 3.1 升级gradle4.4时所踩到的坑
  9. [Android] ButterKnifeProcessor 工作流程分析

随机推荐

  1. Android- NDK编译APK中native死机调试
  2. 转载 android 利用ksoap2方式连接webserv
  3. 【Android 系统开发】 编译 Android文件
  4. Android 开发小技巧
  5. 通过ant脚本,编译打包android工程
  6. Android的logcat输出
  7. View的状态属性简介
  8. Android之监听文本框输入的文字个数并实
  9. Android高斯模糊、高斯平滑(Gaussian Blur
  10. android:webView总结