最近在做安卓設備,考慮到一個問題,設備到達現場,需要更新系統,但是拆機刷機有很麻煩,並且數據丟失,爲了解決這個問題,考慮到兩個方式,第一個就是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升級全過程。附圖