最近在做安卓设备,考虑到一个问题,设备到达现场,需要更新系统,但是拆机刷机有很麻烦,并且数据丢失,为了解决这个问题,考虑到两个方式,第一个就是OTA在线升级、第二个U盘升级,其实原理差不多,但是如果设备内存有点小,可以使用U盘升级系统、我们这个采用的是是全包升级,当然也可以差分别升级系统。
1. 制作全量升级包
1.source build/envsetup.sh
2.lunch (选择合适的配置)
3.make otapackage
执行上面的命令,在out目录可以生成升级包。
2.升级APP的制作,其实原理也很简单,但是要使用到系统权限,则需要平台签名,同时需要一些APP权限,由于OTA升级,升级不要放错,不要放在data分区、system分区,一般放在cache分区吗。
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.RECOVERY" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM"/>
上面为权限代码,接着就是复制U盘数据到cache分区,以下复制是带进度条
public void copyFile(String oldPath, String newPath) {
try {
int byteread;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文件存在时
File newFIle = new File(newPath);
InputStream inStream = new FileInputStream(oldPath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[4048];
while ((byteread = inStream.read(buffer)) != -1) {
if (System.currentTimeMillis() - time1 > 1000) {
long l1 = 100 * newFIle.length() / oldfile.length();
int l = (int) l1;
progressListenr.onProcess((int) l1);
time1 = System.currentTimeMillis();
}
Log.d(TAG, "----byteRead--" + newFIle.length() / (1024 * 1024) + "----" + oldfile.length() / (1024 * 1024));
fs.write(buffer, 0, byteread);
fs.flush();
}
inStream.close();
fs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
拷贝完成之后,最后就是升级固件,将选中的文件传入函数 ,验证、即可升级
//升级
public void installOtaPackageAuto(Context context, File otaPackageFile) {
Log.e(TAG, "----otaPackageFile -" + otaPackageFile.exists());
if (otaPackageFile.exists()) {
try {
Log.e(TAG, "----verifyPackage--");
progressListenr.onProcessStart(1);
RecoverySystem.verifyPackage(otaPackageFile, this, null);
progressListenr.onProcessSuccess(1);
Log.eTAG, "----installPackage--");
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog1show();
}
});
RecoverySystem.installPackage(context, otaPackageFile);
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面升级是带进度条,直观明了,这个就是OTA升级全过程。附图