我想控制针对特定版本的Android rooted设备的固件升级。
我知道,要从设备下载zip后更新固件'制造商,致电RecoverySystem.installPackage(Context context, File packageFile)
在那里,我计划检查将安装在设备上的较新版本,即 固件版本号,设备将升级到该版本。
那么如何从下载的zip文件中获取版本信息。
答案 0 :(得分:0)
我找到了。 每个FOTA zip包含名为' metadata'在位置" / META-INF / com / android /"。该文件中的第一行包含版本信息,包括版本号
您可以通过以下代码获得。
/**
* API to unzip package file and retrieve version no from
* /META-INF/com/android/metadata file inside zip
*
* @param File
*
* @return String versioNo
*/
private static String getVersion(File packageFile) {
String versionNo = null;
if (packageFile != null && packageFile.exists()) {
String firstLine = getFirstLine(packageFile);
Log.d(TAG, "in getVersion. firstLine: " + firstLine);
if (TextUtils.isEmpty(firstLine) == false) {
String[] arrStr = firstLine.split("/");
if (arrStr.length > 1) {
String[] data = arrStr[2].split(":");
if (data.length > 0) {
return data[1];
}
}
}
}
return versionNo;
}
/**
* API to unzip package file and retrieve first line from
* /META-INF/com/android/metadata file
*
* @param File
*
* @return String versioNo
*/
private static String getFirstLine(File packageFile) {
ZipInputStream zin = null;
FileInputStream fin = null;
try {
fin = new FileInputStream(packageFile.getPath());
zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
if (ze.isDirectory()) {
File f = new File(packageFile.getCanonicalPath());
if (!f.isDirectory()) {
f.mkdirs();
}
} else {
String name = ze.getName();
String[] arr;
if (TextUtils.isEmpty(name)) {
continue;
} else {
arr = name.split("/");
}
if (arr.length < 1) {
continue;
}
if ("metadata".equals(arr[arr.length - 1])) {
InputStreamReader isr = null;
BufferedReader buf = null;
try {
isr = new InputStreamReader(zin, "UTF-8");
buf = new BufferedReader(isr);
return buf.readLine();
} catch (IOException e) {
e.getStackTrace();
} finally {
if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (buf != null) {
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
zin.closeEntry();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}