最近有一个项目使用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修复。