U盘OTA升级

7 篇文章 0 订阅
1 篇文章 0 订阅
	最近在做安卓设备,考虑到一个问题,设备到达现场,需要更新系统,但是拆机刷机有很麻烦,并且数据丢失,为了解决这个问题,考虑到两个方式,第一个就是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升级全过程。附图
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值