android OTA update

news2025/1/11 10:08:25

可以使用系統的API來實現系統更新。分兩種更新,non-streaming 和 streaming。non-streaming就是把更新包下載好,放到本地,然後執行更新。而streaming是爲了你的設備內存不夠,不能把更新包下載下來,使用的,url要用https:xxxxx而不是本地文件路徑。

你也可以參考源碼中的sample,/bootable/recovery/updater_sample

UpdateEngine這個是系統的API,如果你要在app中使用,只能用反射的方法,如果在源碼中使用,就可以直接用了。

   
    public void applyPayload(String url, long offset, long size, String[] headerKeyValuePairs) {
        try {
            mUpdateEngine.applyPayload(url, offset, size, headerKeyValuePairs);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

 

方法一 在app中用反射:

Class<?> UpdateEngineClass = Class.forName("android.os.UpdateEngine");//完整类名
                Object UpdateEngine = UpdateEngineClass.newInstance();//获得实例

                Method bind = UpdateEngineClass.getMethod("bind", UpdateEngineCallback.class);
                bind.setAccessible(true);//调用方法前,设置访问标志
                bind.invoke(UpdateEngine, callback);

                Method applyPayload = UpdateEngineClass.getMethod("applyPayload", String.class, long.class, long.class, String[].class);//获得私有方法
                applyPayload.setAccessible(true);//调用方法前,设置访问标志
                applyPayload.invoke(UpdateEngine, "file://" + updateFilePath, offset, size, headerKeyValuePairs);//使用方法

這邊的callback你要自己寫,包名要和源碼中一樣,這樣就能編譯過。

 

這邊的url就是你OTA的路徑(也可以是https:xxxxxx),這邊還需要三個參數 offset , size , headerKeyValuePairs。可以通過下面的方法從更新包zip中獲取。

這邊的headerKeyValuePairs

* String[] pairs = {
*   "FILE_HASH=lURPCIkIAjtMOyB/EjQcl8zDzqtD6Ta3tJef6G/+z2k=",
*   "FILE_SIZE=871903868",
*   "METADATA_HASH=tBvj43QOB0Jn++JojcpVdbRLz0qdAuL+uTkSy7hokaw=",
*   "METADATA_SIZE=70604"
* };

就是這樣的。filesize 就是size

    private String[] headerKeyValuePairs = new String[4];
    private String[] updateTemp1 = new String[MaxRow];
    private String[] updateTemp2 = new String[MaxRow];
    private String[] updateTemp3 = new String[MaxRow];


try {
            i=0;
            j=0;
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            ZipInputStream zin = new ZipInputStream(in);
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                if (ze.isDirectory()) {
                    //Do nothing
                } else {
                    if (ze.getName().contains("payload_properties.txt")) {
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(zin));
                        String line;
                        while ((line = br.readLine()) != null) {
                            headerKeyValuePairs[i] = line;
                            i++;
                        }
                       
                    }
                    if (ze.getName().contains("metadata")) {
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(zin));
                        String line;
                        while ((line = br.readLine()) != null) {
                            if (i >= MaxRow) {
                                Log.i("OTA", "MaxRow is too small, Cannot get metadata total information");
                                break;
                            }
                            updateTemp1[j] = line;
                            j++;
                        }
                       
                    }
                }
            }
            zin.closeEntry();
            zin.close();
            readSize();
        } catch (IOException e) {
            e.printStackTrace();
        }







private void readSize() {
        for (int i = 0; i < updateTemp1.length; i++) {
            if (updateTemp1[i].contains("ota-streaming-property-files")) {
                updateTemp4 = updateTemp1[i];
                break;
            }
        }
        updateTemp2 = updateTemp4.split(",");
        for (int i = 0; i < updateTemp2.length; i++) {
            if (updateTemp2[i].contains("ota-streaming-property-files")) {
                updateTemp4 = updateTemp2[i];
            }
        }
        updateTemp3 = updateTemp4.split(":");
        offset = Long.parseLong(updateTemp3[1]);
        size = Long.parseLong(updateTemp3[2]);


    }

方法二:

直接在源碼中使用,比較簡單。參數獲取都一樣,不說了。

至於streaming的方式去更新,使用也一樣,只是url變成了https:xxxxx,然後其它參數就要提前提供,可以用python去獲取,然後再告訴設備,然後設備再去update。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Helm 部署 java 项目到 K8S

文章目录部署流程模板目录文件解析DeploymentServiceIngress_helpers.tplChart.yamlvalues.yaml部署命令部署流程 准备 jar 包使用 Dockerfile 构建镜像上传镜像到仓库&#xff08;Harbor&#xff09;使用 Helm 模板部署 jar 到 K8S 本文着重讲解第四步&#xff0c;如何制作 …

后分库分表时代的数据库新选择:二维火搭载OceanBase再出发

如今&#xff0c;在中国任意走进一家餐饮商户&#xff0c;不论其规模大小&#xff0c;扫码点餐、自助点餐机、商家点餐小程序等已经基本成为标配。随着餐饮行业数智化持续加速推进&#xff0c;餐饮 SaaS 已经逐渐成为商户们的“必选题”&#xff0c;二维火便是这“必选题”之一…

深度解析 Git 是如何工作的?

深度解析 Git 是如何工作的&#xff1f;前言Git 的特性Git 实际上是如何工作的Commits 对象Tree 对象Blobs 对象总结分支创建与合并代码合并与冲突代码合并算法&#xff08;Myers&#xff09;图搜索代码 diff结尾参考&#xff1a;《Pro Git》、《Advanced Git》 前言 Git 是一…

如何实现工具无关化?关于自动化测试脚本的设计

1.问题的提出 最近几年来&#xff0c;我的自动化测试工具之旅大致是这样的&#xff0c;最早用的是QTP,然后是RFT(IBM的功能测试自动化产品),之后也经历了Selenium, Watir等&#xff0c;再后还是一些商业工具主要是偏web自动化及移动自动化&#xff0c;如sahi, appnium, Keynot…

你知道ArcGIS电子地图也有大字体地图吗(附下载方法)

概述 如果你经常使用水经微图&#xff0c;应该知道在水经微图内&#xff0c;百度电子地图和高德电子地图有大字体地图&#xff0c;最近我偶然发现ArcGIS电子地图也有大字体地图&#xff0c;这里给大家介绍一下下载方法。 加载地图 在ArcGIS中打开目录窗格&#xff0c;点击添…

五、卷积神经网络CNN8(不同卷积后图像大小计算)

类型划分 2 维卷积的计算分为了 3 类&#xff1a;1.full 2.same 3. valid 1、full蓝色为原图像&#xff0c;白色为对应卷积所增加的 padding&#xff0c;通常全部为 0&#xff0c;绿色是卷积后图片。图中的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积&#xff…

为什么企业需要实时跟踪进度的项目管理工具?

市场上的大多数 项目管理工具&#xff0c;都是垃圾进-垃圾出&#xff0c;这意味着如果你的团队没有输入正确甚至漏了输入他们活动的状态信息&#xff0c;就无法准确跟踪项目进展。 当选择了一个不能跟踪实时进度状态的项目管理工具&#xff0c;它不能给你提供准确报告进度所需…

大型复杂项目管理之风险预防

最近一个项目让项目经理小王焦头烂额&#xff0c;一问才知是第一次主导大型项目&#xff0c;各个维度的风险问题频发不断&#xff0c;项目感觉推动不下去了。例如&#xff0c;子项目进度延误、项目资源不足、项目交付物质量不过关等因素造成项目的整体延误等等。 项目案例信息&…

GoogLeNet 与 Inception

本篇主要介绍GoogLeNet,其被改进并应用在了YOLOV1目标检测算法中。 GoogLeNet是google推出的基于Inception模块的深度神经网络模型&#xff0c;在2014年的ImageNet竞赛中夺得了冠军&#xff0c;在随后的两年中一直在改进&#xff0c;形成了Inception V2、Inception V3、Incepti…

Java 将PDF转为Word

众所周知&#xff0c;PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性&#xff0c;在工作中可以有效避免别人无意中对文档内容进行修改。但与此同时&#xff0c;也妨碍了对文档的正常修改。这时我们可以将PDF转为Word文档进行修改或再编辑。使用软件将 PDF 文档转换为…

Spring事务,浅谈!

目录 一、EnableTransactionManagement工作原理 二、Spring事务基本执行原理 三、Spring事务详细执行流程 四、Spring事务传播机制 五、Spring事务传播机制分类 六、Spring事务强制回滚 七、TransactionSynchronization 一、EnableTransactionManagement工作原理 开启Spr…

在C++中,为什么部分程序员喜欢在循环中写‘++i’而不是‘i++’?

自入行以来&#xff0c;无论是查阅资料、技术博客亦或是同事间的技术交流&#xff0c;都有一个共识:在循环的时候&#xff0c;务必使用前置操作符&#xff0c;因为其性能优于后置操作符&#xff0c;久而久之&#xff0c;这个就像一个不成文的规定&#xff0c;大家都在遵循&…

C++异常介绍

目录 一.异常 1.1C异常概念 1.2异常的使用 1.3异常和栈帧,重新抛出 二.异常体系 2.1自定义异常体系 2.2C标准库的异常体系 2.3异常规范 3.异常的优缺点 3.1优点 3.2缺点 一.异常 1.1C异常概念 语言传统的处理错误的方式&#xff1a; 1. 终止程序&#xff0c;如assert…

浮点类型的比较

浮点类型的比较一.浮点数精度的损失二.浮点数的比较1.方法一2.方法二3.方法三&#xff1a;系统方案一.浮点数精度的损失 关于浮点数的比较就不得不提到浮点数在内存中的存储&#xff0c;但这里篇幅太大&#xff0c;故我将其放在另一篇博客里&#xff0c;&#xff08;如果不了解…

laravel对于百万级别数据导出的一些经验

业务上的需求&#xff0c;我们开发的供应链系统某些业务表也陆续突破了百万级别。 原先使用 \Maatwebsite\Excel 插件导出的效率越来越慢&#xff0c;5w条数据导出基本要达到20min&#xff0c;甚至于30w数据导出基本上都超时。 为了解决这个问题&#xff0c;多种尝试&#xf…

AI 让观众成为 3D 版《老友记》的导演了?

《老友记》上线 3D 版了&#xff1f; 允许用户旋转镜头&#xff0c;且从近景切换到全景观看故事&#xff1f; 今年出炉的 3D 方向 AI 项目 SitCom3D&#xff0c;能够自动补齐《老友记》原剧中的三维拍摄空间&#xff0c;用户可以选择主视图、侧视图等不同角度欣赏剧集。镜头的…

[ vulhub漏洞复现篇 ] solr 远程命令执行 (CVE-2019-17558)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

优秀的内部知识库对企业的重要性

我们都知道在客户服务方面&#xff0c;选择正确的知识库软件的重要性。但我们经常忘记的是&#xff0c;我们的员工也是我们的客户。根据盖洛普公司最近的研究&#xff0c;世界正在经历一场员工参与危机。只有大约三分之一的美国员工在工作中具有参与感&#xff0c;而在全球范围…

一文读懂Docker、K8s

目标&#xff1a; docker原理以及在运维工作的地位和作用&#xff0c;运维工作进化论&#xff0c;docker、微服务、k8s的联系、devops和docker的关系&#xff0c;docker的前世今生容器、镜像和仓库、容器和虚拟化&#xff0c;优势和劣势&#xff0c;底层的核心容器除了docker还…

什么是项目管理软件,能带来哪些作用?

在这个信息化时代&#xff0c;企业的项目管理除了需要一位出色的项目管理者外&#xff0c;还需要借助项目管理软件来对项目进行全面管理。因为如今的项目需求多样化&#xff0c;内容也愈加丰富&#xff0c;传统的项目管理方式已经难以满足&#xff0c;所以很多项目管理软件也应…