赞
踩
Android A/B升级又称静默升级,它是一种在系统运行过程中进行的升级功能。为了减小系统运行负荷,整个升级过程会保持在一个较低的IO状态,所以升级时间比recovery升级明显要长。
当AB系统升级时,有两种方式来调用updateengine,来实现升级:
一种方法是直接执行shell命令,调用update_engine_client。
另一种方式是应用层直接调用UpdateEngine的applyPayload
方法来升级,主要的核心逻辑模块是update_engine。
原生的升级参考示例APK(以Android Q AOSP为例):
packages/apps/Car/SystemUpdater
这是Android P(9)Google提供的一个Demo APK,可以用作本地U盘测试升级
启动方式:adb shell am start com.android.car.systemupdater/.SystemUpdaterActivity
该应用大概流程逻辑:
May 6, 2022 less than 1 minute read
Android A/B升级又称静默升级,它是一种在系统运行过程中进行的升级功能。为了减小系统运行负荷,整个升级过程会保持在一个较低的IO状态,所以升级时间比recovery升级明显要长。
当AB系统升级时,有两种方式来调用updateengine,来实现升级:
adb logcat -s update_engine
- //解压升级包
- adb shell
- update_engine_client --payload=file:///storage/5F49-FB9D/socupdate8g/payload.bin --update --headers="FILE_HASH=YP7Z1bFDv6O8C5LTWZ20JxTljXyoVitlCX27TBTyVDM=
- FILE_SIZE=967460335
- METADATA_HASH=1gpTz/Q7T1ysTu6suP8N2KVOfa+vKEdnJGnPsKcPiXw=
- METADATA_SIZE=75378"
applyPayload
方法来升级,主要的核心逻辑模块是update_engine原生的升级参考示例APK(以Android Q AOSP为例):
packages/apps/Car/SystemUpdater
这是Android P(9)Google提供的一个Demo APK,可以用作本地U盘测试升级
启动方式:adb shell am start com.android.car.systemupdater/.SystemUpdaterActivity
该应用大概流程逻辑:
源代码位置:
framwork/base/core/java/android/os/UpdateEngine.java
framwork/base/core/java/android/os/UpdateEngineCallback.java
(需要系统权限的App,需要系统签名,这些Api也是@SystemApi的)
mUpdateEngine.bind(mUpdateEngineCallback)
,因为bind方法时接受的callback对象,而我们创建的类继承了callback,传入当前类的对象即可applyPayload(String url,long offset,long size,String[] headerKeyValuePairs)
方法具体执行升级onStatusUpdate(int status, float percent)
方法中根据拿到的状态执行进度逻辑onPayloadApplicationComplete(int errorCode)
方法中执行升级完成后的逻辑update_engine是A/B升级的核心逻辑,用于执行下载和升级,路径:
android/system/update_engine/
update_engine_client:update_engine_client是客户端进程,用来解析命令行的各种操作(
suspend/resume/cancel/reset_status/follow/update
),并将这些操作和参数通过binder机制,转发为对服务端进程UpdateEngineService相应操作的调用
update_engine升级会依次执行四个升级动作:InstallAction,DownloadAction,FilesystemVerfierAction,PostinstallRunnerAction
启动DownloadAction和PostinstallRunnerAction耗时最长
DownloadAction是执行具体的升级拷贝动作,将镜像文件中的内容拷贝到指定分区,这一步的时间不容易缩减。
PostinstallRunnerAction是根据post install script进行预编译工作,将target_slot标记为active。
在device.mk配置是:
- #调试工具
- PRODUCT_PACKAGES_DEBUG += \
- update_engine_client
-
- # A/B OTA dexopt package升级脚本
- PRODUCT_PACKAGES += otapreopt_script
-
- #将这部分注释掉,可以减少PostinstallRunnerAction步骤的耗时(需谨慎修改)
- # A/B OTA dexopt update_engine hookup
- AB_OTA_POSTINSTALL_CONFIG += \
- RUN_POSTINSTALL_system=true \
- POSTINSTALL_PATH_system=system/bin/otapreopt_script \
- FILESYSTEM_TYPE_system=ext4 \
- POSTINSTALL_OPTIONAL_system=true
文章转载:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。