Android OTA

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支持查看当前分区和手动切换分区,查看方式如下:
#通过查看 ro.boot.slot_suffix 属性值的方式,这个属性值显示当前使用分区名
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整包,用于整包升级
ota_from_target_files ./cf_x86/aosp-target_files-eng.zip ota_update.zip

#生成OTA差分包,用于差分升级
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
#入参可通过python2 ota.py ota_update.zip获得 
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
" 
#等待约10分钟,提示升级成功后
  • 重启后可检查当前启动为AB中的哪个分区.
getprop ro.boot.slot_suffix

3.4 APP升级

  • 无需root,remount,只需enable-verity和一次重启
  • 将升级包放到storage/版本号/目录下
  • 启动谷歌systemupdater进行升级,启动命令如下:
adb shell am start com.android.car.systemupdater/.SystemUpdaterActivity
  • 点击升级包选择升级,升级成功后系统自动重启到b分区
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值