Android系统Recovery工作原理之使用update.zip升级过程分析(二)---update.zip差分包问题的解决

在上一篇末尾提到的生成差分包时出现的问题,现已解决,由于最近比较忙,相隔的时间也比较长,所以单列一个篇幅提示大家。这个问题居然是源码中的问题,可能你已经制作成功了,不过我的这个问题确实是源码中的一个问题,不知道是不是一个bug,下文会具体分析!

一、生成OTA增量包失败的解决方案

在上一篇中末尾使用ota_from_target_files脚本制作update.zip增量包时失败,我们先将出现的错误贴出来。

在执行这个脚本的最后读取input_zip中RADIO/bootloader.img时出现错误,显示DeviceSpecifiParams这个对象中没有input_zip属性。

我们先从脚本中出现错误的调用函数中开始查找。出现错误的调用地方是在函WriteIncrementalOTAPackage(443行)中的device_specific.IncrementalOTA_InstallEnd(),其位于WriteIncrementalOTAPackage()中的末尾。进一步跟踪源码发现,这是一个回调函数,他的具体执行方法位于源码中/device/telechips/common/releasetools.py脚本中的IncrementalOTA_InstallEnd()函数。下面就分析这个函数的作用。

releasetools.py脚本中的两个函数FullOTA_InstallEnd()和IncrementalOTA_InstallEnd()的作用都是从输入包中读取RADIO/下的bootloader.img文件写到输出包中,同时生成安装bootloader.img时执行脚本的那部分命令。只不过一个是直接将输入包中的bootloader.img镜像写到输出包中,一个是先比较target_zip和source_zip中的bootloader.img是否不同(使用选项-i生成差分包时),然后将新的镜像写入输出包中。下面先将这个函数(位于/device/telechips/common/releasetools.py)的具体实现贴出来:

我们的实际情况是,在用命令make otapackage时生成的包中是没有这个RADIO目录下的bootloader.img镜像文件(因为这部分更新已被屏蔽掉了)。但是这个函数中对于从包中未读取到bootloader.img文件的情况是有错误处理的,即返回。所以我们要从  出现的实际错误中寻找问题的原由。

真正出现错误的地方是:

target_bootloader=info.input_zip.read(“RADIO/bootloader.img”)。

出现错误的原因是:AttributeError:‘DeviceSpecificParams’object has no attribute  ‘input_zip’,提示我们DeviceSpecificParams对象没有input_zip这个属性。

在用ota_from_target_files脚本制作差分包时使用了选项-i,并且只有这种情况有三个参数,即target_zip 、source_zip、 out_zip。而出现错误的地方是target_bootloader=info.input_zip_read(“RADIO/bootloader.img”),它使用的是input_zip,我们要怀疑这个地方是不是使用错了,而应该使用info.target_zip.read()。下面可以证实一下我们的猜测。

从ota_from_target_files脚本中WriteFullOTAPackage()和WriteIncrementalOTAPackage这两个函数(分别用来生成全包和差分包)可以发现,在他们的开始部分都对device_specific进行了赋值。其中WriteFullOTAPackage()对应的参数是input_zip和out_zip,而WriteIncrementalOTAPackage对应的是target_zip,source_zip,out_zip,我们可以看一下在WriteIncrementalOTAPackage函数中这部分的具体实现:

从上图可以发现,在WriteIncrementalOTAPackage函数对DeviceSpecificParams对象进行初始化时确实使用的是target_zip而不是input_zip。而在releasetools.py脚本中使用的却是info.input_zip.read(),所以才会出现DeviceSpecificParams对象没有input_zip这个属性。由此我们找到了问题的所在(这是不是源码中的一个Bug?)。

将releasetools.py脚本IncrementalOTA_InstallEnd(info)函数中的 target_bootloader=info.input_zip.

read(“RADIO/bootloader.img”)为:target_bootloader=info.target_zip.read(“RADIO/bootloader.img”),然后重新执行上面提到的制作差分包命令。就生成了我们需要的差分包update.zip。

二、          差分包update.zip的更新测试

在上面制作差分包脚本命令中,生成差分包的原理是,参照第一个参数(target_zip),将第二个参数(source_zip)中不同的部分输出到第三个参数(output_zip)中。其中target_zip与source_zip的先后顺序不同,产生的差分包也将不同。

在实际的测试过程中,我们的增量包要删除之前添加的一个应用(在使用update.zip全包升级时增加的),其他的部分如内核都没有改动,所以生成的差分包很简单,只有META-INF这个文件夹。主要的不同都体现在updater-script脚本中,其中的#----start make changes  here----之后的部分就是做出改变的部分,最主要的脚本命令是: delete(“/system/app/CheckUpdateAll.apk”

, “/system/recovery.img”);在具体更新时它将删除CheckUpdateAll.apk这个应用。

为了大家参考,还是把这个差分包的升级脚本贴出来,其对应的完全升级的脚本在第九篇已贴出:

mount("yaffs2", "MTD", "system", "/system");

assert(file_getprop("/system/build.prop", "ro.build.fingerprint") == "telechips/full_tcc8800_evm/tcc8800:2.3.5/GRJ90/eng.mumu.20120309.100232:eng/test-keys" ||

file_getprop("/system/build.prop", "ro.build.fingerprint") == "telechips/full_tcc8800_evm/tcc8800:2.3.5/GRJ90/eng.mumu.20120309.100232:eng/test-keys");

assert(getprop("ro.product.device") == "tcc8800" ||

getprop("ro.build.product") == "tcc8800");

ui_print("Verifying current system...");

show_progress(0.100000, 0);

# ---- start making changes here ----

ui_print("Removing unneeded files...");

delete("/system/app/CheckUpdateAll.apk",

"/system/recovery.img");

show_progress(0.800000, 0);

ui_print("Patching system files...");

show_progress(0.100000, 10);

ui_print("Symlinks and permissions...");

set_perm_recursive(0, 0, 0755, 0644, "/system");

set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");

set_perm(0, 3003, 02750, "/system/bin/netcfg");

set_perm(0, 3004, 02755, "/system/bin/ping");

set_perm(0, 2000, 06750, "/system/bin/run-as");

set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");

set_perm(0, 0, 0755, "/system/etc/bluetooth");

set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");

set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");

set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");

set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");

set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");

set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");

set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");

set_perm(0, 0, 06755, "/system/xbin/librank");

set_perm(0, 0, 06755, "/system/xbin/procmem");

set_perm(0, 0, 06755, "/system/xbin/procrank");

set_perm(0, 0, 06755, "/system/xbin/su");

set_perm(0, 0, 06755, "/system/xbin/tcpdump");

unmount("/system");

在做更新测试时,我们要以target_zip系统为依据,也就是更新之前的开发板系统是用target_zip包升级后的系统。否则会更新就会失败,因为在更新时会从系统对应的目录下读取设备以及时间戳等信息(updater-script脚本一开始的部分),进行匹配正确后才进行下一步的安装。

所有准备都完成后,将我们制作的差分包放到SD卡中,在Settings-->About Phone-->System Update-->Installed From SDCARD执行更新。最后更新完成并重启后,我们会发现之前的CheckUpdateAll.apk被成功删掉了,大功告成!

至此终于将update.zip包以及其对应的差分包制作成功了,下面的文章开始具体分析制作的update.zip包在实际的更新中所走的过程!

android 版本更新原理,Android系统Recovery工作原理之使用update.zip升级过程分析(二)...相关推荐

  1. Android系统Recovery工作原理之使用update.zip升级过程分析(五)

    Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务文章开头我们就提到update.zip包来源有两种,一个 ...

  2. Android系统Recovery工作原理之使用update.zip升级过程分析(二)---u...

    2019独角兽企业重金招聘Python工程师标准>>>  Android系统Recovery工作原理之使用update.zip升级过程分析(二)---update.zip差分包问题的 ...

  3. Android系统Recovery工作原理之使用update.zip升级过程分析(一)

    这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是And ...

  4. Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】...

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ...

  5. Android系统Recovery工作原理之使用update.zip升级过程分析(四)

    Android系统Recovery模式的工作原理在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及 ...

  6. android传感器原理,Android移动设备中光电传感器的工作原理解析

    在移动技术中,传感器是被测量信号输入的首要技术,也是传感器系统中的元件组成部分,它包括载体和电路连接的敏感元件和转换元件,但是传感器系统却是组合某种信息处理能力元件的传感器. Android平台应用的 ...

  7. 室内空气流动原理图_新风系统的工作原理是什么 新风系统各部件的用途

    健康舒适的人居环境是我们一致的生活诉求,实现这一目标,家居环境仅仅拥有恒温恒湿还不够,还必须恒氧,拥有24小时不间断的新鲜空气供应.家庭新风系统即为实现这一目标而诞生,它根据房间大小.人员多少,通过机 ...

  8. 双时隙的工作原理_双闭环直流调速系统的工作原理(一)

    双闭环直流调速系统的工作原理(一) 目录 1前言 2 2双闭环直流调速系统的工作原理 3 2.1双闭环直流调速系统的介绍 3 2.2双闭环直流调速系统的组成 4 2.3双闭环直流调速系统的稳太结构图和 ...

  9. 计算机机房空调原理,精密空调/机房专用空调双系统机组工作原理

    精密空调/机房专用空调双系统设备技术服务 精密空调/机房专用空调双系统机组工作原理 机房精密空调双系统机组的工作原理 风冷式直接蒸发系统使用冷媒作为传热媒介.机组内的制冷系统由蒸发盘管.压缩机.冷凝器 ...

最新文章

  1. Vue+Element-ui+二级联动封装组件
  2. [译]Node v5.0.0 (Stable)
  3. ffmpeg库编译加文字_ffmpeg第三方库编译记录
  4. 【Python】函数递归实例之字符串反转、汉诺塔问题分析
  5. win10系统U盘启动
  6. Win10 注册IIs4.0的解决方案
  7. mysql解压版有配置文件么_3分钟安装MySQL5.7解压版
  8. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八) MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统...
  9. 《CSS权威指南》第3版
  10. 计算机专业英语教程第七版,经典_计算机专业英语教程.pdf
  11. c语言运算优先级口诀简单,C语言运算符优先级和口诀
  12. mysql查询语句创建临时表_MySQL 临时表_mysql临时表创建_mysql临时表创建
  13. 车联网TBOX国六OBD排放终端远程在线监控系统
  14. 计算机没有有效的ip配置,win7电脑没有有效的ip配置怎么办
  15. 51单片机——人体红外感应报警
  16. revit相关报错合集
  17. 屏蔽ip段访问 html,限制某IP段对网页的访问(ASP)
  18. 基于雨流计数法的源-荷-储双层协同优化配置 代码主要做的是一个源荷储优化配置的问题
  19. OCR在转转游戏的应用
  20. c3p0连接池使用完毕后连接返还

热门文章

  1. mysql datetime 默认值_老大让我整理下公司内部MySQL使用规范,分享给大家
  2. halcon python 联合开发_使用pythonnet调用halcon脚本
  3. linux搭建gitlab内网,ubuntu14搭建内网gitlab服务器(示例代码)
  4. 皮一皮:真是个看脸的年代...
  5. 最近很火的 ClickHouse 是什么?
  6. GitHub中的奇葩项目:登顶过趋势榜的女装大佬项目
  7. 你可能会忽略的 Git 提交规范
  8. linux mysql 事务_linux下mysql Insert update delete 事务 用户管理
  9. matlab mlpkginstall,Matlab选择mingw编译器
  10. macos apache php,如何在mac上配置apache和php