1. 程式人生 > >OTA升級常見問題

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卡格式化後再拷貝一般可以解決此問題。