OTA升級常見問題
問題現象:在進行 OTA 升級測試時,下載成功了升級包,在點擊立即更新后,手機一直處於提示“正在更新中”,沒能重啟進行升級。
問題分析:經過分析發現,因為OTA 應用不具備系統權限。導致其無法在目錄/cache/recovery 中創建command 文件並在該文件中寫入命令,從而導致 OTA 應用無法通過這種預定的方式重啟機器並進入recovery 模式,無法實現正常 OTA 升級。
解決方案:通過在 init.rc 文件中增加 mkdircache/recovery 命令,使該目錄默認具備寫權限,確保 OTA應用可以正常進行系統升級。
問題現象: 下載完升級包后,進入 recovery 模式進行升級時, 系統提示升級失敗,手機無法成功升級。
問題分析:通過分析日志,升級失敗系在對系統文件進行校驗時無法通過校驗。跟蹤編譯流程,發現生成的版本文件和用於生成 OTA 升級包的目錄文件不一致。根本原因是在生成版本文件后的編譯目標文件的過程中,許多模塊重新進行了編譯。從而導致版本文件和目標文件中存在有着差異的文件。從而導致升級因校驗失敗而無法正常升級。
解決方案:針對這種情況,在編譯完目標文件后重新打包生成版本文件,就可以解決兩者不一致的問題。
問題現象:差分包簽名校驗失敗,報錯提示:signature verification failed,Installation aborted。
解決方案:(有三種情況):
1. 差分包簽名和版本中簽名不一致。開發流版本使用 google 原生簽名,故差分包也必須使用
google 原生簽名。集成流和發布流版本使用公司簽名,故差分包也必須使用公司簽名。
2. 差分包導入到 sd卡時,有時會出現導入失敗,原因是從命令提示符中看到已經導入成功,實際上差分包的部分數據還在緩存中,沒有完全導入 SD卡,所以會出現 SD卡的數據不完整而校驗失敗,解決方法:將升級包(update.zip包)導入 SD卡后,需要執行 adb shell sync。
3. 在制作差分包過程中,差分包的壓縮文件損壞,CRC 校驗失敗。驗證方法:將差分包解壓,此時會提示解壓失敗,正常的差分包應該是能正常解壓的。
問題現象:升級過程中失敗,報錯提示:assert failed: getprop("ro.product.device")
問題分析:由於升級過程中需要校驗ro.product.device,若新版本中修改了該屬性值,則使用前向版本升級時,由於 ro.product.device 不一致,則將會導致升級認為機器手機類型不同而升級失敗。
解決方案:將assert(getprop("ro.product.device")的腳本語句屏蔽。
問題現象:版本號不對應,報錯提示:assertfailed: file_getprop("/system/build.prop", "ro.build.fingerprint")
問題分析:由於差分包是基於前后兩個版本進行差分后升級,若使用的源版本不對應,便會導致差分包不匹配而升級失敗。
解決方案: 進入系統設置,查看手機版本是否與差分包的ro.build.fingerprint 對應,重新使用正確的版本進行升級。
問題現象:版本的文件被手動修改,報錯提示:script aborted: assert failed: apply_patch_check
問題分析: 可能開發人員或中試人員對源版本獲取了root 權限,對手機中的文件進行了修改,而升級中剛好會升級這些文件,便會出現升級被改動文件失敗的情況。
解決方案: 獲取手機版本中 system 目錄所有文件和用於制作差分包的源版本包中的文件進行比對,找出該文件為何被修改的原因。如果是版本集成問題,需要重新編譯版本。
問題現象:cache 分區空間不足,報錯提示:scriptaborted: assert failed: apply_patch_space
問題分析:由於差分包升級過程中是需要將需差分包的文件放置在 cache分區下,若需差分的最大文件容量大於 cache 分區的最大容量,則會導致無法放置而升級失敗。
解決方案:查看差分包中updater-script 腳本中的以下語句:assert(apply_patch_space(number)),通過計算 cache 分區容量<number>,則是原因版本中某個被修改的文件很大,該大文件一般是版本中的 iso影像,因此在項目中若產品量產后,是不允許修改 iso 影像的。
問題現象:內核升級失敗,報錯提示:scriptaborted: assert failed: apply_patch("EMMC:…
問題分析:多種情況下都可能導致內核升級失敗:
1. 由於版本中若修改了內核的起始地址,將會導致制作出來的差分包在校驗內核時 sha 校驗失敗。
2. 在制作差分包時,若需要升級modem 文件,其正確順序為先做 AP 側的差分包和整包,然后把要升級的 MP 側文件放進去,再簽名。若順序反了:如先放置 MP 側文件,再制作 AP 側的差分包和整包,這種也會導致升級內核失敗。
解決方案:對於第一種情況,則對內核不能使用差分的形式,而要使用整體的形式進行升級,即將對內核的 apply_patch 語句去除,而使用以下方法。emmc 文件系統:package_extract_file("boot.img","/dev/block/mmcblk0p8")或 MTD 文件系統:assert(package_extract_file("boot.img","/tmp/boot.img"),write_raw_image("/tmp/boot.img","boot"),delete("/tmp/boot.img"));
問題現象:升級 boot.img 時,拔電池重啟后,會一直進入 recovery 模式,並且不能正常升級。
問題分析:由於差分包升級過程中是需要校驗的,恢復到一半的時候斷電,會導致差分包與源文件對不上號而導致升級失敗。
解決方案:升級中提示用戶不能拔電池,或者使用整包升級而不是差分升級包。
問題現象:MTP方式不插T卡升級問題(android4.4系統才有此問題)
解決方案:
當MTK_2SDCARD_SWAP == yes
外置sd卡為主卡,插入外置sd卡ota包下載到外置卡上,拔掉sd卡下載到內置sd卡上。
MTP方式的內置T卡其實就是DATA區,所以在重啟之后會提示檢測不到SD card。
需要修改更新包路徑,把/sdcard改為/data/media,recovery.cpp文件main函數
char *inPath = NULL; if (update_package) { inPath = (char*)malloc(strlen(update_package)+sizeof(char) * 5); memset(inPath, 0, strlen(update_package)+sizeof(char) * 5); if (strncmp(update_package, "/sdcard", 7) == 0) { if (ensure_path_mounted(update_package) != 0) { strcat(inPath, "/data/media"); strcat(inPath, update_package + sizeof(char) * 7); if (ensure_path_mounted(inPath) == 0) { update_package = inPath; } LOGI("Change mount path to:%s\n", update_package); } } }
2.2當MTK_2SDCARD_SWAP == no
內置sd卡為主卡,插不插外置sd卡ota包都下載到內置sd卡上。
內置sd卡的路徑不再是/data/media,具體通過adb shell查看后確定,例如:/data/media/0。
strcat(inPath, "/data/media");改為——〉strcat(inPath, "/data/media/0");
問題現象:OTA升級之后部分apk丟失
問題描述:
在當前版本恢復出廠設置,通過OTA升級到下一版本,開機查看有些應用桌面快捷方式無法打開,主菜單中找不到該應用。
在當前版本不做恢復出廠設置,通過OTA升級到下一版本,開機查看應用運行正常。
問題分析:
分析丟失的這些應用為兩個版本之間更新的第三方apk,因為這些apk的名字變更了,名字中大都有版本號日期等信息,更新的方式是刪除舊的apk,重新添加新的apk。問題出在當前版本是否恢復出廠設置,那么我們看看恢復出廠設置對這些apk有什么影響?
可見,恢復出廠設置之后data/app下的apk只是一個鏈接,指向system/appjar下面備份的apk,也就是說恢復出廠設置的時候擦data區之后並沒有像我們預期的那樣把system/apppjar下的apk拷貝到data/app下,而只是創建了一個鏈接。為了確定apk被刪除可以查看一下恢復出廠設置前后data區的已用空間有什么變化,你會發現下載完版本直接恢復出廠設置data區已用空間少了幾百兆。讓我們把思路理一下,在當前版本恢復出廠設置,把data/app下apk刪除,創建鏈接指向system,升級到新版本,system下面的apk更新,升級不會擦除data區,所以鏈接不變,因為它名字變了,那么顯然找不到新的apk。至於恢復出廠設置為什么不拷貝apk,而創建鏈接,這是MTK的一個data區優化方案。如果平台上沒有這個優化方案也就不存在這樣的問題。
解決方案:
針對apk丟失的情況,我們如何解決?
1、 向MTK申請關閉data區優化方案;
2、 在恢復出廠設置只保存鏈接的情況下,集成apk的時候始終保持apk的名字不變。
四、包不完整導致升級失敗
SD卡升級經常會遇到升級失敗,log如下:
-- Install /sdcard ... I:Finding update package... I:Update location: /sdcard/huaqin82_tb_b2b_tdd-ota.zip I:Opening update package... I:read key e=3 I:1 key(s) loaded from /res/keys I:Verifying update package... I:comment is 1682 bytes; signature 1664 bytes from end E:failed to verify whole-file signature I:verify_file returned 1 E:signature verification failed Installation aborted.
導致包不全的原因可能是拷貝之后沒有安全退出,如果出現這種情況,首先把包刪掉,重新拷貝完成之后稍等片刻安全退出,如果還是不行,那就要把sd卡格式化后再拷貝一般可以解決此問題。
原文鏈接:https://blog.csdn.net/nwpushuai/article/details/79706722