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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 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包在实际的更新中所走的过程!

转载于:https://my.oschina.net/u/572562/blog/63835

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java编写一个WebService并在Tomcat上发布

本例采用Myeclipse 2016 CI 6,JDK1.8 。新建一个Web Service Project。 选择如下设置: 在src目录下建个包: 编写一个接口,其中一个方法返回ArrayList,另一个方法返回JSON: package Services; import java.sql.SQLExce…

ftp简介

简介 ftp基于TCP服务,不支持UDP,使用21(控制端口)和20(数据端口),但ftp的数据端口并不总是20. ftp模式 主动模式客户端从一个任意的端口N(N>1024)连接到FTP服务器的命令端口(21端口)。然后客户端开始监听端口N1&…

Windows环境下搭建Tomcat

下载Tomcat,点击这里下载Tomcat 解压到指定目录: 配置环境变量:右键“我的电脑” ——属性——高级系统设置——环境变量 配置三个环境变量: 在系统变量里新建变量名:CATALINA_BASE,变量值:D:\apache-t…

C#非泛型集合类-使用HashTable组织数据

HashTable称为哈希表,是System.Collections命名空间中的一个重要的类。与ArrayList不同,哈希表可以存储键/值(key/value)对的集合。如果把哈希表当做字典,那么“键”就是字典中查的单词,“值”就是关于单词解释内容,正…

c3p0连接池的配置和简单使用

背景 一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接。因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连…

Iterator_迭代器模式_PHP语言描述

2019独角兽企业重金招聘Python工程师标准>>> 感觉最近写的这些设计模式的例子,在定义描述方面差很多,以后都会先写一下用例设计模式的定义及简单讲解,在把例子附上,这样的感觉更好些,也让大家看得更清楚一些…

数组去重复

做一个新数组&#xff0c;重复的不加入 <script type"text/javascript">Array.prototype.delrepeat function() {var arr this;var _arr new Array();for (var i in arr) {if (i delrepeat) continue;if (_arr.length 0) _arr.push(arr[i]);for (var j 0…

Spring整合JDBC开发

背景 在JDBC开发中&#xff0c;充斥这大量重复的代码&#xff0c;可能只是换了个SQL语句&#xff0c;其他代码是完全不用变的。Spring的jar包里&#xff0c;提供了一个叫JDBCTemplate的模板&#xff0c;在保持操作灵活方便的情况下&#xff0c;将代码量降到最低。 配置文件 首…

【Android】EditText标签调用键盘

转自天翼空间开发资料。在xml文件中EditText标签有一个属性android:editable"false"和android:numeric"integer" android:numeric"integer"表示只允许输入数字&#xff0c;此属性可以限制用户只能输入数字内容。 android:editable表示是否可以输…

基于SpringMVC进行REST服务开发

背景 REST的概念这里不多过多阐述。在REST中&#xff0c;资源通过URL进行识别和定位。一般来说&#xff0c;以下这些HTTP方法通常会匹配为如下的CRUD动作&#xff1a; Create&#xff1a;POST Read&#xff1a;GET Update&#xff1a;PUT或PATCH Delete&#xff1a;DELETE…

HDU-1569 方格取数(2) 最小割最大流

题义很简单&#xff0c;还记得方格取数(1)的时候&#xff0c;使用状态压缩写的&#xff0c;这里由于行列数太大&#xff0c;因此无法进行压缩。所以要运用的最小割最大流的思想来解这道题。 大概是这样分析的&#xff0c;题义是要我们求在一个方格内取出N个点&#xff0c;使得这…

通俗易懂的讲SOA

<微服务设计>1.3节&#xff1a;SOA是一种设计方法&#xff0c;其中包含多个服务&#xff0c;而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用&#xff0c;而非采用进程内调用的方式。 通俗易懂的讲SOA …

PCI总线原理(二)

http://blog.c114.net/html/15/562315-75227.html PCI即Peripheral Component Interconnect&#xff0c;中文意思是“外围器件互联”&#xff0c;是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛&#xff0c;下面我详细介绍…

Windows环境中在同一个Tomcat下发布不同端口号的不同web程序

一、修改Tomcat路径下的conf文件下的 server.xml 文件。增加一个service 节点。 原service节点如下图所示&#xff1a; 新增service节点如下图所示&#xff0c;注意红色标注的是要修改的地方&#xff1a; 二、根据service.xml配置文件信息中对应的Engine节点的name属性&#…

java开发_Runtime

在java中经常需要获取一些系统信息&#xff0c;如系统的资源空间等。下面就是一些Runtime的应用&#xff1a; 1 public static void main(String[] a){2 Runtime runtime Runtime.getRuntime();3 long freeMemoery runtime.freeMemory();4 long tota…

Mybatis逆向工程自动生成代码文件

一般来说都会新建另外一个项目&#xff0c;用于生成代码文件&#xff0c;然后拷贝到需要的项目中。新建maven项目用于生成代码文件&#xff0c;项目目录如下所示&#xff1a; pom.xml内容如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" x…

LAMP平台架构浅析

LAMP是一个缩写&#xff0c;它指一组常用于来搭建动态网站或者服务器的开源软件&#xff0c;包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;PHP、Perl或者 Python编程语言(本文以php为例)。 下面就介绍一下如何基于rpm包的形式…

流程工业MES特点

流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主要通过对原料的混合、反应、分离、粉碎、加热等物理或化学的变化&#xff0c;是原料增值。 流程行业的生产过程与离散制造业有很大的不同&#xff0c;一般为批量连续生产&#xff0c;主…

掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。Android作为一种优秀的、承袭Linux的移动操作系统&#xff0c;其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。进程和线程的基本概念 当一个应用程序开始运行…

高温津贴:关键是消除劳动者“权利贫困”

每年6月至10月期间&#xff0c;劳动者从事露天岗位工作以及用人单位不能采取有效措施将作业场所温度降低到33℃以下的&#xff0c; 用人单位应当按月向劳动者发放高温津贴&#xff0c;违反者处 2000 元以上 10000 元以下罚款。 据报道&#xff0c;目前广州一些建筑工地、搬家公…