当前位置: 首页 > news >正文

Android AB升级(三) - update engine架构概述

update engine是通过AIDL对上层client端和server端分离,实现跨进程。上层提供服务绑定接口,以及升级触发和回调接口,底层实现升级的具体逻辑。本篇只是简单梳理下流程流转的过程。

1. 应用升级接口相关文件

1.framework层应用接口(systemApi)

  • frameworks/base/core/java/android/os/UpdateEngineCallback.java
  • frameworks/base/core/java/android/os/UpdateEngine.java

2.AIDL接口文件:

  • system/update_engine/binder_bindings/android/os/IUpdateEngine.aidl
  • system/update_engine/binder_bindings/android/os/IUpdateEngineCallback.aidl

3.服务端接口文件:

  • 继承BnUpdateEngine: system/update_engine/binder_service_android.h
  • 继承BnUpdateEngineCallback: system/update_engine/update_engine_client_android.cc

1.1. UpdateEngine类接口

UpdateEngine类(@SystemApi)主要提供bind和applyPayload接口给应用

1.1.1. 代码流程(bind和applyPayload)

1.UpdateEngine.java

  • bind(final UpdateEngineCallback callback, final Handler handler) 主要接受UpdateEngineCallback对象,同步代码块中会实现callback的两个接口,获取升级服务的状态码和结果错误码
  • applyPayload传递升级包路径大小等信息,并会传递到服务端进行实际逻辑的操作
//frameworks/base/core/java/android/os/UpdateEngine.java//传递升级包信息public void applyPayload(String url, long offset, long size, String[] headerKeyValuePairs) {try {mUpdateEngine.applyPayload(url, offset, size, headerKeyValuePairs);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}public boolean bind(final UpdateEngineCallback callback, final Handler handler) {synchronized (mUpdateEngineCallbackLock) {//IUpdateEngineCallback对象mUpdateEngineCallback = new IUpdateEngineCallback.Stub() {//重写回调类的接口,其中会调用到服务端的对应实现接口@Overridepublic void onStatusUpdate(final int status, final float percent) {if (handler != null) {handler.post(new Runnable() {@Overridepublic void run() {callback.onStatusUpdate(status, percent);}});} else {callback.onStatusUpdate(status, percent);}}@Overridepublic void onPayloadApplicationComplete(final int errorCode) {if (handler != null) {handler.post(new Runnable() {@Overridepublic void run() {callback.onPayloadApplicationComplete(errorCode);}});} else {callback.onPayloadApplicationComplete(errorCode);}}};try {return mUpdateEngine.bind(mUpdateEngineCallback);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}}

2.AIDL接口

interface IUpdateEngine {/** @hide */void applyPayload(String url,in long payload_offset,in long payload_size,in String[] headerKeyValuePairs);/** @hide */boolean bind(IUpdateEngineCallback callback);....

3.服务端接口

//system/update_engine/binder_service_android.h
class BinderUpdateEngineAndroidService : public android::os::BnUpdateEngine,public ServiceObserverInterface {...//system/update_engine/binder_service_android.cc
Status BinderUpdateEngineAndroidService::applyPayload(const android::String16& url,int64_t payload_offset,int64_t payload_size,const std::vector<android::String16>& header_kv_pairs) {const std::string payload_url{android::String8{url}.string()};std::vector<std::string> str_headers;str_headers.reserve(header_kv_pairs.size());for (const auto& header : header_kv_pairs) {str_headers.emplace_back(android::String8{header}.string());}brillo::ErrorPtr error;//调用system/update_engine/update_attempter_android.cc的接口if (!service_delegate_->ApplyPayload(payload_url, payload_offset, payload_size, str_headers, &error)) {return ErrorPtrToStatus(error);}return Status::ok();
}Status BinderUpdateEngineAndroidService::bind(const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {callbacks_.emplace_back(callback);const android::sp<IBinder>& callback_binder =IUpdateEngineCallback::asBinder(callback);auto binder_wrapper = android::BinderWrapper::Get();binder_wrapper->RegisterForDeathNotifications(callback_binder,base::Bind(base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),base::Unretained(this),base::Unretained(callback_binder.get())));// Send an status update on connection (except when no update sent so far),// since the status update is oneway and we don't need to wait for the// response.if (last_status_ != -1)callback->onStatusUpdate(last_status_, last_progress_);*return_value = true;return Status::ok();
}

1.2. UpdateEngineCallback类接口

主要是onStatusUpdate和onPayloadApplicationComplete接口

1.2.1. 代码流程(onStatusUpdate和onPayloadApplicationComplete)

1.抽象类,实现在UpdateEngine的bind方法中:

//frameworks/base/core/java/android/os/UpdateEngineCallback.java
@SystemApi
public abstract class UpdateEngineCallback {public abstract void onStatusUpdate(int status, float percent);public abstract void onPayloadApplicationComplete(int errorCode);
}

2.AIDL接口:

//system/update_engine/binder_bindings/android/os/IUpdateEngineCallback.aidl
oneway interface IUpdateEngineCallback {/** @hide */void onStatusUpdate(int status_code, float percentage);/** @hide */void onPayloadApplicationComplete(int error_code);
}

3.服务端接口:

//system/update_engine/update_engine_client_android.cc
private:class UECallback : public android::os::BnUpdateEngineCallback {public:explicit UECallback(UpdateEngineClientAndroid* client) : client_(client) {}// android::os::BnUpdateEngineCallback overrides.Status onStatusUpdate(int status_code, float progress) override;Status onPayloadApplicationComplete(int error_code) override;private:UpdateEngineClientAndroid* client_;};
...android::sp<android::os::IUpdateEngine> service_;android::sp<android::os::BnUpdateEngineCallback> callback_;
};
//升级过程中会打印这两个接口的日志
Status UpdateEngineClientAndroid::UECallback::onStatusUpdate(int status_code,float progress) {update_engine::UpdateStatus status =static_cast<update_engine::UpdateStatus>(status_code);LOG(INFO) << "onStatusUpdate(" << UpdateStatusToString(status) << " ("<< status_code << "), " << progress << ")";return Status::ok();
}Status UpdateEngineClientAndroid::UECallback::onPayloadApplicationComplete(int error_code) {ErrorCode code = static_cast<ErrorCode>(error_code);LOG(INFO) << "onPayloadApplicationComplete(" << utils::ErrorCodeToString(code)<< " (" << error_code << "))";client_->ExitWhenIdle((code == ErrorCode::kSuccess || code == ErrorCode::kUpdatedButNotActive)? EX_OK: 1);return Status::ok();
}

2. 解析升级包payload.bin工具

  • payload dumper

使用payload dumper对升级包patload.bin文件进行解析,可以生成对应升级的image镜像文件

http://www.dtcms.com/a/605644.html

相关文章:

  • 二叉树递归题目(一)
  • 太仓有没有做网站建设的专业网页设计价格
  • 工作手机监管系统:敏感词预警+行为监控,让销售更规范
  • 实战|SpringBoot+Vue3 医院智能预约挂号系统(含 AI 助手)
  • 网站分析报告范文动态asp.net网站开发
  • 南充做网站公司网站需要网监备案
  • 如何轻松安全地擦除手机数据以便以旧换新
  • 大模型强化学习-DPO
  • 下拉网站导航用ps怎么做新建设网站如何推广
  • 做一个企业网站的费用wordpress+php调优
  • 服务器数据恢复—5盘RAID5中四盘重建RAID5,原RAID5数据恢复有戏吗?
  • 4.3 诗词创作案例:用DeepSeek打造你的专属AI诗人
  • 五 网站开发总体进度安排wordpress添加单页
  • 2025.11.13【服务器】|从芯片、物理核心到逻辑核心的深度解析
  • 2手房产App网站开发wordpress 预缓存
  • 阿里云百炼BatchAPI:大模型批量推理的“高效引擎“
  • 阿里云 FunctionAI 技术详解:基于 Serverless 的企业级 AI 原生应用基础设施构建
  • 安全可靠数据库选型之阿里云PolarDB分布式版V2.0
  • 安全可靠的国产数据库选型之阿里云PolarDB V2.0
  • 库尔勒谁在做电商网站建设2345浏览器电脑版首页
  • 网站积分方案市场监督管理局管什么
  • 构建AI智能体:九十三、基于OpenAI Whisper-large-v3模型的本地化部署实现语音识别提取摘要
  • 网站建设技术服务协议企点app下载
  • 【期末网页设计作业】HTML+CSS+JS 旅行社网站、旅游主题设计与实现(附源码)
  • 新世代的 C++:当 ChatGPT 遇上模板元编程
  • 关于Chaos Vantage云渲染平台,看看豆包、元宝、Deepseek、Gemini、ChatGPT怎么回答
  • MPC模型预测控制:从基本概念到数学推导(基于 DR_CAN 课堂笔记整理)
  • 大型网站建设方案常见问题wordpress只有vip会员下载
  • 张掖做网站公司seo标题优化
  • 【贪心 从一般到特殊】3644. 排序排列|1775