一、OTA运行原理
Android 平台提供 Google diff arithmetic 差分机制,升级包支持完整升级以及差分升级,OTA 运行原理图如下所示。
1. OTA Server 负责对更新包进行上传,下载以及版本的管理。
2. 开发者在修改 Android 系统后,通过差分制作工具制作出差分包,并使用客户端进行更新包上传和版本管理。
3. 设备通过 wifi 网络进行连接和下载,最后完成更新工作。
二、非安全固件 OTA 升级方法
1、生成初始镜像与旧包
(1)正常编译 SDK,pack 命令打包 img(在 longan out 目录)
(2)执行 pack4dist 生成 target_file(在 out 目录)
(3)烧镜像到机器
(4)把 target_file 重命名成 old_target_files.zip,放到 SDK 根目录下
2、生成新镜像与 OTA 包
(1)正常编译 SDK,pack 命令打包 img(在 longan out 目录)
(2)执行 pack4dist 生成完整包 full-ota 包,差分包 inc-ota(在 out 目录)
(3)adb push xxx_full_ota.zip /sdcard/update.zip
(4)adb shell chmod 777 /sdcard/update.zip
(5)打开 Local Update 应用 -> OTA System Update -> 选择 update.zip 包升级
三、升级问题
Update应用显示在升级到20%的时候,OTA升级失败
OTA时通过logcat获取升级的相关日志信息
locat|grep update_engine
日志信息如下:
03-11 11:18:26.803 422 422 I update_engine: [INFO:delta_performer.cc(113)] Completed 0/? operations, 16384/931308852 bytes downloaded (0%), overall progress 0%
03-11 11:18:26.810 422 422 I update_engine: [INFO:delta_performer.cc(344)] Manifest size in payload matches expected value from Omaha
03-11 11:18:26.814 422 422 I update_engine: [INFO:delta_performer.cc(884)] Verifying using certificates: /system/etc/security/otacerts.zip
03-11 11:18:26.824 422 422 I update_engine: [INFO:payload_verifier.cc(102)] signature blob size = 267
03-11 11:18:26.827 422 422 I update_engine: [INFO:payload_verifier.cc(118)] Truncating the signature to its unpadded size: 256.
03-11 11:18:26.840 422 422 I update_engine: [INFO:payload_verifier.cc(191)] Failed to verify the signature with 1 keys.
03-11 11:18:26.845 422 422 E update_engine: [ERROR:payload_verifier.cc(137)] None of the 1 signatures is correct. Expected hash before padding:
03-11 11:18:26.849 422 422 I update_engine: [INFO:utils.cc(414)] Logging array of length: 32
03-11 11:18:26.851 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000000 : ca d3 dc 62 f8 d6 09 8a c1 99 dc e8 46 b8 5a 7d
03-11 11:18:26.856 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000010 : 62 47 c5 ab 28 64 b1 56 81 8f c0 e0 d9 2b f6 e0
03-11 11:18:26.859 422 422 E update_engine: [ERROR:payload_verifier.cc(140)] But found RSA decrypted hashes:
03-11 11:18:26.863 422 422 I update_engine: [INFO:utils.cc(414)] Logging array of length: 256
03-11 11:18:26.867 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000000 : 2e d3 37 87 ae bd b3 7d 5f fc 7c b2 de 46 d4 6e
03-11 11:18:26.869 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000010 : 55 33 cd d7 cc e9 12 2a 6d 5a 6c 82 0a 12 60 28
03-11 11:18:26.872 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000020 : 31 1f bb ae 29 e0 72 19 d9 f4 29 4a 69 55 4b c2
03-11 11:18:26.874 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000030 : 7a a6 cd 04 63 15 02 64 40 9f a7 3a 67 a9 5f 69
03-11 11:18:26.877 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000040 : 86 db cf ca 19 1f 67 43 7d 21 9f e1 a0 a4 e4 9f
03-11 11:18:26.880 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000050 : c4 b9 7e 13 68 8c f2 a8 40 1e 6d 56 ab ec cf 61
03-11 11:18:26.883 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000060 : 2e 67 f9 3c 76 a9 e7 b2 ee 54 fa e7 00 ed 59 1d
03-11 11:18:26.886 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000070 : 6c ad 8c 27 9d 57 1f d9 f5 79 ff 89 13 dd ac c9
03-11 11:18:26.889 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000080 : 3a 3b 93 3c 37 93 20 b4 4d 37 5f 5e ff a6 31 c6
03-11 11:18:26.893 422 422 I update_engine: [INFO:utils.cc(431)] 0x00000090 : aa b7 5b 1b a6 29 e3 d4 7b 06 84 60 3d 0e 80 68
03-11 11:18:26.895 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000a0 : 14 0e 5a a2 3a fb 21 ef 42 26 ea fc 17 69 64 b3
03-11 11:18:26.898 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000b0 : e1 16 63 36 7a 95 c3 4c fc fd 81 57 8a 33 c2 97
03-11 11:18:26.900 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000c0 : 69 6c 44 d0 f6 fe b2 81 d2 d0 c3 fd c6 1c 5a f9
03-11 11:18:26.902 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000d0 : 6e c7 b5 2c e2 fb bc db 83 34 4a f8 ba e7 90 e9
03-11 11:18:26.905 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000e0 : f3 aa 5a b5 02 e3 0d 3d 3d ee ab 8e 8e 9d c9 2d
03-11 11:18:26.910 422 422 I update_engine: [INFO:utils.cc(431)] 0x000000f0 : 1f 60 69 1b a4 90 fe 69 31 d6 31 5f 22 b2 4f fb
03-11 11:18:26.913 422 422 E update_engine: [ERROR:payload_metadata.cc(214)] Manifest hash verification failed.
03-11 11:18:26.917 422 422 E update_engine: [ERROR:delta_performer.cc(372)] Mandatory metadata signature validation failed
1、问题原因
搜索update_engine,可以发现OTA签名不一致,导致OTA升级失败。固件是非签名的,OTA包是签名的,导致固件和OTA包的签名不匹配,OTA升级失败。
2、解决方案
(1)查看当前机器的固件是否是签名固件。
fingerprint末尾为release‑keys则是签名固件,test‑keys则是非签名固件
getprop | grep fingerprint
release‑keys
签名固件
# getprop |grep fingerprint
[ro.build.fingerprint]: [Allwinner/a523_pro_arm64/a523‑pro:14/UP1A.231105.001.A1/eng.dailyb.20231121.043505:
userdebug/release‑keys]test‑keys
非签名固件
# getprop | grep fingerprint
[ro.build.fingerprint]: [Allwinner/a523_pro_arm64/a523‑pro:13/TQ2A.230405.003.B2/eng.20231117.112010:userdebug/
test‑keys
根据命令输出结果可以得知我们当前机器的固件为非签名固件
getprop |grep fingerprint
[ro.product.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system_dlkm.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system_ext.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.vendor.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath04251013:userdebug/test-keys]
[ro.vendor_dlkm.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
(2)获取不带签名的OTA包
1、pack4dist命令是判断sdk中 vendor/security/app_keys目录是否存在,然后去生成签名的OTA包。
2、Android 11及以上版本,vendor/security/app_keys目录是默认存在的,所以pack4dist命令生成的OTA包都是默认带签名的。
3、如果不想生成签名的OTA包,可以删掉vendor/security/app_keys目录
删掉vendor/security/app_keys目录得到不带签名的OTA包,重新编译后测试
编译内核:
cd longan./build.sh config (根据实际情况选择对应平台)
编译Android
cd ..source ./build/envsetup.shlunch xxxmake
打包
pack
生成OTA包
pack4dist
四、OTA
重新编译后正常