
最近在搞 AndroID A/B 分区 OTA 升级,手机方案公司出来之后就好久没搞过源码开发了,开始以为挺简单的一个事,没想到折腾了几天,还好终于搞定!
最开始以为还是走 Recoverysystem.installPackage 这种方式,确认之后得用UpdateEngine方式了。
另外有点坑的是,代码调用其实就那么点,但是参数之类的很关键,还有权限也很关键,搬砖过来走不通,我就是卡了2天,一些莫名的错误,没法定位。
如:
ErrorCodeConstants.DOWNLOAD_TRANSFER_ERROR = 9
后面各种查资料,结合系统代码,写了一个解析类 只需传入update.zip包(当然也可以解压之后再传对应的参数),解析后升级,爽的一批。
需要注意的坑在代码里也备注了,有需要的码友要注意下,特别是如果卡住了找不到原因所在的情况。
源码APK我也放在csdn上了,供参考。
下载链接 =====> 应用层调用UpdateEngine代码Apk源码
调用代码大致如下:
package com.system.ota;import androID.content.Context;import androID.os.UpdateEngine;import androID.os.UpdateEngineCallback;import androID.util.Log;import java.net.MalformedURLException;import java.text.DecimalFormat;public class SystemUpdateManager { private static final String TAG = "ota"; UpdateEngine mUpdateEngine; public SystemUpdateManager(Context context) throws MalformedURLException { mUpdateEngine = new UpdateEngine(); } UpdateEngineCallback mUpdateEngineCallback = new UpdateEngineCallback() { @OverrIDe public voID onStatusUpdate(int status, float percent) { Log.d(TAG, "onStatusUpdate status: " + status); switch (status) { case UpdateEngine.UpdateStatusConstants.UPDATED_NEED_REBOOT: rebootNow(); break; case UpdateEngine.UpdateStatusConstants.DOWNLOADING:// 回调状态,升级进度 //mProgressbar.setProgress((int) (percent * 100)); DecimalFormat df = new DecimalFormat("#"); String progress = df.format(percent * 100); Log.d(TAG, "update progress: " + progress); break; default: // noop } } @OverrIDe public voID onPayloadApplicationComplete(int errorCode) { Log.d(TAG, "onPayloadApplicationComplete errorCode=" + errorCode); if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS) {// 回调状态 Log.d(TAG, "UPDATE SUCCESS!"); } } }; public voID startUpdateSystem(UpdateParser.ParsedUpdate parsedUpdate) { mUpdateEngine.bind(mUpdateEngineCallback);// 绑定callback mUpdateEngine.applyPayload( parsedUpdate.mUrl, parsedUpdate.mOffset, parsedUpdate.mSize, parsedUpdate.mProps); } /** * Reboot the system. */ private voID rebootNow() { Log.e(TAG, "rebootNow"); }}相关代码接口说明如下
一、framwork层 应用接口
源代码位置:framwork/base/core/java/androID/os/UpdateEngine.java
framwork/base/core/java/androID/os/UpdateEngineCallback.java
二、app应用调取applyUpdate方法我这里只说一下大致流程
当然得系统权限的App了,需要系统签名,这些API也是@SystemAPI的
1、创建 UpdateEngineCallback 的对象 mUpdateEngineCallback
2、创建 UpdateEngine 的对象 mUpdateEngine, 创建后服务开启
3、使用mUpdateEngine.bind(mUpdateEngineCallback) 因为bind方法时接受的callback对象,而我们创建的类继承了callback,传入当前类的对象即可
4、调用 applyPayload(String url,long offset,long size,String[] headerkeyvaluePairs) 方法具体执行升级
5、在重写的onStatusUpdate(int status, float percent)方法中根据拿到的状态执行进度逻辑
在重写的onPayloadApplicationComplete(int errorCode);方法中执行升级完成后的逻辑
总结以上是内存溢出为你收集整理的Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码全部内容,希望文章能够帮你解决Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)