解决差分包升级失败的思路

最近有一个项目使用ota升级的时候出现一个问题:使用整包升级是没问题,但是当使用差分包的时候就出现升级失败的问题。

这个问题在其他同事那儿了解到是一个遗留问题。而且客户需要是用差分包进行升级,一般差分包在20M以内,而整包是在190M。流量的差距不言而喻。

首先编译debug版本系统进行差分包升级,查看/cache/recovery/last_log_r文件,内部有如下记录:

根据日志显示ProjectConfig.mk文件和机器内部的校验码不一致导致校验不通过。于是对系统代码进行修改添加日志

bootable\recovery\applypatch\applypatch.c中的applypatch_check、FindMatchingPatch、ParseSha1的方法进行添加日志结果如下:

发现是mk文件的sha1值不对,于是利用下面java代码获取基础版本中该文件的sha1值

public static String getFileSHA1(File file) {
		MessageDigest md = null;
		FileInputStream fis = null;
		StringBuilder sha1Str = new StringBuilder();
		try {
			fis = new FileInputStream(file);
			MappedByteBuffer mbb = fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
			md = MessageDigest.getInstance("SHA-1");
			md.update(mbb);
			byte[] digest = md.digest();
			String shaHex = "";
			for (int i = 0; i < digest.length; i++) {
				shaHex = Integer.toHexString(digest[i] & 0xFF);
				if (shaHex.length() < 2) {
					sha1Str.append(0);
				}
				sha1Str.append(shaHex);
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
				}
			}
		}
		return sha1Str.toString();
	}

发现和差分包中META-INF\com\google\android\updater-script记录的sha1值不一致。

制作差分包的是python写的,于是进入python环境读取该文件。

import zipfile
print zipfile.ZipFile(“the source file path”).read(“SYSTEM/data/misc/ProjectConfig.mk”)

发现读取出来的文件是乱码的,想起了我们公司对mk文件是加了密的,但是解压以后读取的文件是正常的,于是对build\tools\releasetools\ota_from_target_files\ota_from_target_files进行修改

但是发现还是不行,于是取消生成差分包的清理操作,再次读取文件,发现在/tmp目录下的mk文件读取出来是乱码的。于是对alps\build\tools\releasetools\common.py中的UnzipTemp方法进行修改:

然后制作差分包,升级成功。

至此完成bug修复。

You May Also Like

About the Author: ice.zhai

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注