Android OTA升级原理和流程分析(二)---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 OTA升级原理和流程分析(一)--update.zip包的制作

下一篇:Android OTA升级原理和流程分析(三)---Android系统的三种启动模式

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: x-cube-mcsdk-ful_5.4.6.zip是一款蓝牙物联网软件开发套件。它通过使用蓝牙技术,将智能设备(如手机、平板电脑等)与其他设备(如传感器、灯、温度计等)连接起来,实现智能家居、智能照明等应用。此套件提供了多种模块,括设备管理、蓝牙连接、数据传输等,方便开发者快速地构建自己的应用。此套件也可以进行次开发,添加更多自定义功能。它支持多种开发板(如STM32)和操作系统(如Windows、Linux、macOS等),易于使用。此套件的功能丰富,适合各种物联网应用程序的开发。此外,它还具有高度移植性和灵活性,适合初学者和专业开发者使用。综上所述,x-cube-mcsdk-ful_5.4.6.zip是一款优秀的蓝牙物联网软件开发套件,将在未来智能家居、智能照明、智能医疗等应用中扮演重要角色。 ### 回答2: x-cube-mcsdk-ful_5.4.6.zip是为STM32微控制器开发的全功能SDK。这个SDK提供了丰富的API和驱动程序,方便了开发人员在STM32上实现与云端的连接。通过这个SDK,开发人员可以快速地将他们的STM32电路板连接到云平台上,实现数据的收集和控制。这个SDK提供了许多有用的组件,如MQTT协议、OTA升级功能、数据推送、云端诊断等等,使得开发人员可以更容易地将STM32嵌入式系统与云服务进行集成。同时,这个SDK还提供了丰富的例程和API文档,使开发人员可以更好地理解和使用SDK。总之,x-cube-mcsdk-ful_5.4.6.zip是一款功能十分强大的SDK,可以显著地提高STM32嵌入式系统与云服务之间的连接效率和稳定性,从而满足用户对于互联设备的需求。 ### 回答3: x-cube-mcsdk-ful_5.4.6.zip是意法半导体提供的一款软件开发工具,用于开发物联网设备和应用程序。该工具提供了丰富的软件组件和示例应用,支持多种硬件平台和通信协议。使用x-cube-mcsdk-ful_5.4.6.zip可以简化物联网设备和应用程序的开发过程,提高开发效率和软件质量。该工具主要括以下几个方面: 1.物联网平台:x-cube-mcsdk-ful_5.4.6.zip提供了完整的物联网平台解决方案,支持设备和云端的快速集成和连接。 2.通信协议:x-cube-mcsdk-ful_5.4.6.zip支持MQTT、CoAP等通信协议,可以保证设备和云端的稳定通信和数据传输。 3.软件组件:x-cube-mcsdk-ful_5.4.6.zip括了多个软件组件,如TLS、JSON解析、文件系统等,可以满足不同的开发需求,并且易于集成和使用。 4.示例应用:x-cube-mcsdk-ful_5.4.6.zip提供了多个示例应用,如温湿度监测、智能插座控制等,可以帮助开发者快速搭建自己的物联网应用。 总之,x-cube-mcsdk-ful_5.4.6.zip是一款非常实用的物联网开发工具,它可以为开发者提供丰富的软件组件和示例应用,帮助他们快速搭建物联网设备和应用程序,实现设备和云端之间的通信和数据传输。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值