Android OTA

一、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

重新編譯后正常

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79377.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Untiy基礎學習(三)Untiy中編寫腳本的基本規則

一、怎么創建腳本 在Project窗口下,右鍵Create C#Script 即可創建腳本 創建腳本的注意事項 : 1)類名和文件名必須一致,不然不能掛載(因為反射機制創建對象,會通過文件名去找Type) 2)沒有特殊需…

VBA宏即根據第一列的內容和第二列的數字,按照數字數量生成對應內容并依次放在第三列、第四列等

打開你的 Excel 工作表。按下 Alt F11 組合鍵,打開 VBA 編輯器。在 VBA 編輯器中,點擊 插入 -> 模塊。在模塊窗口中,輸入以下 VBA 代碼: Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度學習系統學習系列【1】之基本知識

文章目錄 說明基礎知識人工智能、機器學習、深度學習的關系機器學習傳統機器學習的缺陷選擇深度學習的原因深度學習的關鍵問題深度學習的應用深度學習的加速硬件GPU環境搭建主流深度學習框架對比 說明 文章屬于個人學習筆記內容,僅供學習和交流。內容參考深度學習原…

論文筆記-基于多層感知器(MLP)的多變量橋式起重機自適應安全制動與距離預測

《IET Cyber-Systems and Robotics》出版山東大學 Tenglong Zhang 和 Guoliang Liu 團隊的研究成果,文章題為“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 橋式起重機的緊急制動及其制動距離預測是…

DeepSeek實戰--各版本對比

1.對比 版本參數量優勢劣勢使用場景競品DeepSeek-V36710億(MoE架構,激活370億)開源、高效推理(60 TPS)、低成本(API費用低)、中文處理能力突出(90%準確率多模態能力有限通用任務&am…

從0開始建立Github個人博客(hugoPaperMod)

從0開始建立Github個人博客(hugo&PaperMod) github提供給每個用戶一個網址,用戶可以建立自己的靜態網站。 一、Hugo hugo是一個快速搭建網站的工具,由go語言編寫。 1.安裝hugo 到hugo的github標簽頁Tags gohugoio/hugo選擇一個版本&#xff0c…

【AI論文】WebThinker:賦予大型推理模型深度研究能力

摘要:大型推理模型(LRMs),如OpenAI-o1和DeepSeek-R1,展示了令人印象深刻的長期推理能力。 然而,他們對靜態內部知識的依賴限制了他們在復雜的知識密集型任務上的表現,并阻礙了他們生成需要綜合各…

Linux_sudo命令的使用與機制

1、sudo命令的作用 sudo(全稱 superuser do)是 Linux/Unix 系統中權限管理的核心工具。 允許普通用戶在授權下以其他用戶(默認是 root)的權限執行命令,而無需直接登錄賬戶。 2、sudo命令的典型使用場景 sudo 覆蓋了系…

Scrapy框架之 中間件的使用

爬蟲中間件 特點:主要處理蜘蛛(Spider)和下載器(Downloader)之間的請求和響應。可以對蜘蛛生成的請求進行攔截、修改或過濾,也可以對下載器返回給蜘蛛的響應進行處理。適用場景: 請求過濾與修改…

供應鏈算法整理(一)--- 銷量預估

在供應鏈管理領域有較多的預估場景,例如送達時長預估、銷量預估、用電量預估。特別的在智能供應鏈領域,銷量和庫存的管理的智能化也依賴銷量預估,因此在本文我們整理了 銷量預估的算法詳細的技術方案。 時間序列預測在最近兩年內發生了巨大的…

第4篇:服務層抽象與復用邏輯

在業務系統復雜度指數級增長的今天,服務層(Service Layer)的合理設計直接影響著系統的可維護性和擴展性。本文將深入剖析 Egg.js 框架中的服務層架構設計,從基礎實現到高級封裝,全方位講解企業級應用的開發實踐。 一、…

Java學習手冊:Spring 數據訪問

一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 類,它簡化了數據庫操作,提供了豐富的 API 來執行數據庫訪問任務。JdbcTemplate 可以自動處理數據庫連接的獲取、釋放,SQL 語句的執行,結果集的處理等…

遞歸、搜索和回溯算法《遞歸》

在之前的優選算法當中我們已經學習了一些基本的算法,那么接下來我們就要來學習算法當中的一大重要章節——遞歸、搜索和回溯算法,其實也就是大家常常聽到的dfs、bfs;其實本質就是遞歸,在學習搜索、回溯等算法的過程當中我們會先來…

Java進階--設計模式

設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣&#xff0…

如何禁止AutoCAD這類軟件聯網

推薦二、三方法,對其他軟件影響最小 一、修改Hosts文件 Hosts文件是一個存儲域名與IP地址映射關系的文本文件,通過修改Hosts文件可以將AutoCAD的域名指向本地回環地址(127.0.0.1),從而實現禁止聯網的目的。具體步驟如…

深度學習框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目錄 ??????一 Vscode安裝 二、Anaconda安裝 三、更新顯卡驅動 四、安裝CUDA 五、安裝Pytorch 六、Vscode配置 七、出現的問題匯總 ??????一 Vscode安裝 在 Windows 上安裝 訪問 VS Code 官網 https://code.visualstudio.com/,點擊 "Downl…

結構模式識別理論與方法

我們在前文《模式識別的基本概念與理論體系》中就已經提及“模式分類”。 具體內容看我的CSDN文章:模式識別的基本概念與理論體系-CSDN博客 模式的識別方法主要有統計模式識別方法和結構模式識別方法兩大類。統計模式識別方法提出得較早,理論也較成熟…

12.多邊形的三角剖分 (Triangulation) : Fisk‘s proof

目錄 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多邊形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入內對角線&…

面經-計算機網絡——OSI七層模型與TCP/IP四層模型的對比詳解

OSI七層模型與TCP/IP四層模型的對比詳解 一、圖示解析:分層封裝結構 你提供的圖清晰展示了網絡通信中從應用層到物理層的封裝過程,每一層都會對上層的數據加上自己的頭部信息(Header): 應用層: 應用…

React Native本地存儲方案總結

1. AsyncStorage(鍵值對存儲) 適用場景:簡單鍵值對存儲(如用戶配置、Token、緩存數據)。特點:異步、輕量、API 簡單,但性能一般,不推薦存儲大量數據。安裝:npm install …