1. 升级方式
- 目前有两种升级方式,Recovery升级(非AB升级,Android7.1之前主流,现在也一直在使用),AB升级(Android7.1之后,高版本Android自带方式)
2. Recovery升级
- 优点简单,缺点是升级过程中若将镜像损坏可能变砖,占空间小。
- 可以在Android命令行中升级,或者在recovery模式中选择升级包升级。
- ITX-3588J仅支持recovery升级,不支持AB升级
- recovery升级OTA包制作,参考如下:
source build/envsetup.sh && lunch tardis-eng
#make dist 会构建完整的OTA软件包
make dist DIST_DIR=dist_output
#也可以单独生成OTA包
make otapackage
#生成完整OTA包,位于dist_output或out目录
aosp_cf_x86-ota-eng.zip
- 以Android中命令行升级为例,将升级包放到指定位置,将命令写入到/cache/recovery/command,重启为recovery模式后自动升级。升级方式如下:
adb root
adb remount
adb push update.zip /data/update.zip
adb shell
uncrypt /data/update.zip /cache/recovery/block.map
echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
adb reboot recovery
3. AB分区升级
- 用户使用A分区时升级B分区,将升级包烧写到B分区中,假设升级失败可以再次升级,不易变砖,升级成功后自动切换分区,整个过程未进入recovery。用户体验好,客户认为一次重启就是升级。缺点相比recovery升级占用更大存储空间(几个G数量级)。
- Nxp imx8qm Android12为AB分区,Cuttlefish Android12为AB分区。
- Android支持查看当前分区和手动切换分区,查看方式如下:
getprop ro.boot.slot_suffix
- Android中可使用命令行update_engine_client升级或APP调用update_engine提供的applyPayload方法,参考谷歌原生升级Demo APP com.android.car.systemupdater。
3.1 Cuttlefish OTA升级
- Cuttlefish当前支持AB分区升级,不支持recovery升级
- 使用完整OTA包进行升级,包大时间长
- 使用差分包升级,包小时间稍短
3.2 编译OTA升级包
lunch aosp_cf_x86_auto-userdebug
make dist DIST_DIR=cf_x86
ota_from_target_files ./cf_x86/aosp-target_files-eng.zip ota_update.zip
ota_from_target_files -i PREVIOUS-aosp_cf_x86-target_files-eng.zip aosp_cf_x86-target_files-eng.zip incremental_ota_update.zip
3.3 命令行升级
- 若整包OTA则push ota_update.zip,若差分升级则push incremental_ota_update.zip
- update_engine_client入参可从通过ota.py脚本获得,执行 python2 ota.py incremental_ota_update.zip。ota.py脚本内容如下:
#!/usr/bin/env python
import sys
import zipfile
def main():
if len(sys.argv) != 2:
sys.stderr.write('Use: %s <ota_file.zip>\n' % sys.arv[0])
return 1
otazip = zipfile.ZipFile(sys.argv[1], 'r')
payload_info = otazip.getinfo('payload.bin')
payload_offset = payload_info.header_offset + len(payload_info.FileHeader())
payload_size = payload_info.file_size
payload_location = '/data/ota_package/update.zip'
headers = otazip.read('payload_properties.txt')
print (
'update_engine_client --update --follow --payload=file://{payload_location}'
' --offset={payload_offset} --size={payload_size}'
' --headers="{headers}"').format(**locals())
return 0
if name == '__main__':
sys.exit(main())
- update_engine_client 命令行升级
adb root
adb remount
adb enable-verity
adb push ota_update.zip data/ota_package/update.zip
adb reboot
adb shell
update_engine_client --update --follow --payload=file:///data/ota_package/update.zip --offset=6362 --size=80012 --headers="FILE_HASH=Dca1LrOBjZuQrERQXcCK8KNboT8zjNtxMzD4YVAoL3k=
FILE_SIZE=80012
METADATA_HASH=bBT07ewUYEL4uPp7IO4nc7tC06P3Ly5FPaUNXGL0CN4=
METADATA_SIZE=72270
"
getprop ro.boot.slot_suffix
3.4 APP升级
- 无需root,remount,只需enable-verity和一次重启
- 将升级包放到storage/版本号/目录下
- 启动谷歌systemupdater进行升级,启动命令如下:
adb shell am start com.android.car.systemupdater/.SystemUpdaterActivity
- 点击升级包选择升级,升级成功后系统自动重启到b分区