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


    最近在搞 Android A/B 分区 OTA 升级,手机方案公司出来之后就好久没搞过源码开发了,开始以为挺简单的一个事,没想到折腾了几天,还好终于搞定!

    最开始以为还是走 RecoverySystem.installPackage 这种方式,确认之后得用UpdateEngine方式了。

    另外有点坑的是,代码调用其实就那么点,但是参数之类的很关键,还有权限也很关键,搬砖过来走不通,我就是卡了2天,一些莫名的错误,没法定位。
    如:
    ErrorCodeConstants.DOWNLOAD_TRANSFER_ERROR = 9

    后面各种查资料,结合系统代码,写了一个解析类 只需传入update.zip包(当然也可以解压之后再传对应的参数),解析后升级,爽的一批。

    需要注意的坑在代码里也备注了,有需要的码友要注意下,特别是如果卡住了找不到原因所在的情况。

    源码APK我也放在csdn上了,供参考。

    下载链接 =====> 应用层调用UpdateEngine代码Apk源码

    调用代码大致如下:

     

    1. package com.system.ota;
    2. import android.content.Context;
    3. import android.os.UpdateEngine;
    4. import android.os.UpdateEngineCallback;
    5. import android.util.Log;
    6. import java.net.MalformedURLException;
    7. import java.text.DecimalFormat;
    8. public class SystemUpdateManager {
    9. private static final String TAG = "ota";
    10. UpdateEngine mUpdateEngine;
    11. public SystemUpdateManager(Context context) throws MalformedURLException {
    12. mUpdateEngine = new UpdateEngine();
    13. }
    14. UpdateEngineCallback mUpdateEngineCallback = new UpdateEngineCallback() {
    15. @Override
    16. public void onStatusUpdate(int status, float percent) {
    17. Log.d(TAG, "onStatusUpdate status: " + status);
    18. switch (status) {
    19. case UpdateEngine.UpdateStatusConstants.UPDATED_NEED_REBOOT:
    20. rebootNow();
    21. break;
    22. case UpdateEngine.UpdateStatusConstants.DOWNLOADING:// 回调状态,升级进度
    23. //mProgressBar.setProgress((int) (percent * 100));
    24. DecimalFormat df = new DecimalFormat("#");
    25. String progress = df.format(percent * 100);
    26. Log.d(TAG, "update progress: " + progress);
    27. break;
    28. default:
    29. // noop
    30. }
    31. }
    32. @Override
    33. public void onPayloadApplicationComplete(int errorCode) {
    34. Log.d(TAG, "onPayloadApplicationComplete errorCode=" + errorCode);
    35. if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS) {// 回调状态
    36. Log.d(TAG, "UPDATE SUCCESS!");
    37. }
    38. }
    39. };
    40. public void startUpdateSystem(UpdateParser.ParsedUpdate parsedUpdate) {
    41. mUpdateEngine.bind(mUpdateEngineCallback);// 绑定callback
    42. mUpdateEngine.applyPayload(
    43. parsedUpdate.mUrl, parsedUpdate.mOffset, parsedUpdate.mSize, parsedUpdate.mProps);
    44. }
    45. /**
    46. * Reboot the system.
    47. */
    48. private void rebootNow() {
    49. Log.e(TAG, "rebootNow");
    50. }
    51. }

    相关代码接口说明如下

    一、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);方法中执行升级完成后的逻辑

  • 相关阅读:
    系统移植3:kernel的配置,编译和移植以及根文件系统
    ubuntu 复制文件路径
    Unity脚本的基础语法(8)-协同程序与销毁方法
    Hexagon_V65_Programmers_Reference_Manual(17)
    Springboot整合RabbitMQ消息中间件
    LeetCode刷题:27. 移除元素
    LabVIEW代码生成错误 61056
    c++程序
    前端+后端项目 - 论坛信息管理系统(Web+servlet+MySQL+JDBC)
    GitLab搭建
  • 原文地址:https://blog.csdn.net/xiaowang_lj/article/details/133634635