U盤OTA升級

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章