Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码

简介: Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码

最近在搞 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);方法中执行升级完成后的逻辑


目录
相关文章
|
4天前
|
Shell Android开发
MT8385 Android AB分区系统升级(命令模式)
MT8385 Android AB分区系统升级(命令模式)
14 0
|
2天前
|
存储 设计模式 监控
88 PM撸代码之【Android四大基本组件】
88 PM撸代码之【Android四大基本组件】
9 0
|
2天前
|
Java Android开发
82 PM撸代码之Android【绝顶高手排行榜】
82 PM撸代码之Android【绝顶高手排行榜】
6 0
|
2天前
|
达摩院 安全 Java
80 PM撸代码之Android【武侠讲封装、继承、多态】
80 PM撸代码之Android【武侠讲封装、继承、多态】
7 0
|
2天前
|
算法 Java BI
79 PM撸代码之Android【武侠篇:面向对象基础】
79 PM撸代码之Android【武侠篇:面向对象基础】
6 0
|
2天前
|
XML 编解码 算法
76 PM撸代码之Android【宏观篇】
76 PM撸代码之Android【宏观篇】
8 0
|
3天前
|
存储 缓存 Android开发
Android系统分区与升级
Android系统分区与升级
21 4
|
4天前
|
Ubuntu Android开发 数据安全/隐私保护
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
|
4天前
|
Java Android开发
Android 长按桌面显示菜单的代码
Android 长按桌面显示菜单的代码
11 0
|
4天前
|
Java Android开发
Android 切换壁纸代码流程追踪
Android 切换壁纸代码流程追踪
15 0