一、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
重新編譯后正常