美文网首页
Android系统升级A/B分区OTA升级应用层调用Update

Android系统升级A/B分区OTA升级应用层调用Update

作者: Crazy程序猿 | 来源:发表于2021-02-08 11:59 被阅读0次

    最近在搞 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升级应用层调用Update

          本文链接:https://www.haomeiwen.com/subject/qcbxxltx.html