淘新聞

Win10 Mobile離線更新包的起源和實現原理詳解

感謝IT之家網友

洛克人EXE後援團光卡

的投稿

Win10 Mobile離線更新包的第一個階段(直升10586.107)就此告一段落。

首先,致所有HTC 8X的用戶,讓你們失望了。本次仍然未能解決HTC 8X的更新問題,而且這次更新嘗試還毀掉了我的一台HTC 8X。

至於沒能實現的原因,我會在文章中做詳細解釋。

在開始之前,先說明一下不被微軟支持的機型有這些:

Lumia 52X、530、62X、630、720/T、810、820、822、920、925、928、1020、1320,以及截至目前這些廠商全部的WP手機:三星、HTC、華為、LG。

在Build 14393即將發佈的時候,就得知微軟即將不再給不受支援的老機型提供Win10 Mobile更新。已經通過Windows Insider更新上去的這些老機型回滾之後就不能再升級了。

確實,一些主流的不受支持老機型運行Win10 Mobile表現十分感人——相機變得很慢,而且拍照素質大幅下降,整體體驗也沒有以前的WP8.X來的流暢了。

不過也不排除幾個不被微軟支持的機型升級上去仍然能獲得很好的運行體驗,像Lumia 810/820/822。

我知道,有些用戶可能寧願忍受手機運行緩慢或是有少數BUG,也想升級Win10 Mobile。

在離線更新包項目開始之前,就我瞭解的強行升級方法,主要就是SD卡越獄,利用CustomPFD這個登錄編輯程式,將手機的機型改成受支持的型號,再來利用一些特定工具獲取更新。

這個方法確實可行,但是有兩個問題:

如果這個手機不支持插SD卡,那就無法使用SD卡越獄改機型;

SD卡越獄需要利用Windows Phone SDK進行開發者解鎖,但不是所有人都能順利使用Windows Phone SDK解鎖。

而不支持插SD卡的手機,很多都是大家耳熟能詳的手機,比如說Lumia 920、925、1020。

雖然有Windows Phone Internals這樣的工具為不支援升級的二代老機型解鎖Mass Storage模式以便修改註冊表,但是真正用起來並不是很方便,如果操作不當,手機容易變磚。

而且,我也不推薦大家使用此工具解鎖手機。

那麼有沒有一種方法能將Win10 Mobile升級包重新弄進手機來升級?

當然有。

MSDN有相關文檔(點此連結瞭解)指出,廠商可以使用Windows Phone Development Kit內置的IUTool程式將即將推送給使用者的更新包本地推送進內部手機進行測試。

理論上講,廠商測試推送進去的更新包和通過手機更新獲取到的更新包是一樣的。這些更新包具備微軟強簽名校驗,和WP7不同,不帶這個強簽名的更新包是無法被推送進去的,而且目前也無法偽造此簽名來篡改更新包。

然而,iutool有一個問題,就是不可把更新包推送進SD卡。因此,4GB ROM的機型不受到支持,尤其是Lumia 530,這個還是只能老實使用SD卡越獄改機型升級。

而手機更新本身的機制和Windows PC類似,都是通過Windows Update向更新伺服器遞交資料,這些資料包括您的手機型號、廠商名稱、固件版本號、以及是否是量產機固件,最後更新伺服器回傳這個手機能用的更新包檔下載連結供手機下載並安裝更新。

如果手機不是量產機固件,即便改了機型也無法更新到後續版本,這也就是我為什麼一直不能把650XL工程機推送成正式版系統的原因。工程機固件的烙印在哪裡我毫無頭緒。不過Interop Tools的開發者gus33000在Twitter上宣稱將McLaren工程機推送到了Win10 Mobile,但沒有看到任何證據顯示更新到了Win10 Mobile,我也沒有條件進行測試,且無法保證能更新到Win10 Mobile。如果您持有McLaren工程機想嘗試動手,請在動手之前務必做好備份。

離線更新包專案,就是基於以上兩點而開始的一個專案。繞過更新伺服器的校驗,直接向手機推送更新到Win10 Mobile的更新包,可以有效提高更新成功率,避免更新下載中斷。

這個設想提出來了,那麼如何實現呢?

為了證明我的猜想,離線更新包的第一個版本先為搭載驍龍S4 CPU的機型測試使用。離線更新包V1位於舊版本存檔。

這個時候,微軟已經不再向S4老機型推送更新了,因此我也無法獲取這些更新包的下載連結。不過幸運的是,XDA-Developers那邊早已預見到了這個問題,就開始在站內發起了抓取更新包下載連結表的專案,並介紹了抓包方法。

裡面就有一些機型獲取到的更新包下載連結清單。

目前老機型更新Win10 Mobile,首先是在至少8.10.14219.341的系統版本下更新到10586.107,然後在此基礎上再更新到後面的版本。在Win10 Mobile下,修改註冊表來改機型獲取後續更新什麼的比在WP8.1下SD卡越獄部署註冊表修改工具要容易得多。

如果手機的系統版本低於8.10.14219.341,可通過Windows預覽體驗強行獲取到此版本的更新包。

不過我還要跟大家建立一個概念,WP手機代數,也就是第幾代的WP手機。

這個代數是以Lumia手機為基準的,其它品牌的WP手機則是將同時期配置的手機分類進去。

目前我將WP手機分為五代:

第一代,也就是所有搭載WP7系統的手機。對於Lumia手機,型號的倒數第二位數是0或1的機型(Lumia 810除外)就是一代機。

第二代,也就是所有搭載驍龍S4 CPU的WP手機。對Lumia來講,型號的倒數第二位數是2(Lumia Icon、1520除外)以及Lumia 810算是二代機。Lumia 2520由於是平板就談不上WP手機代數了。

第三代,也就是所有使用下一代驍龍200/400/800 CPU的WP手機。對Lumia來講,型號的倒數第二位數是3以及Lumia 1520算是三代機。不過要注意的是,雖然1520被我算作三代機,但為了避免大家和前面混淆,Lumia 1520也可算作二代機。如果有2.5代的話,那麼Lumia 1520和Lumia Icon就可以算進去了。

第四代,也就是所有搭載WP8.1GDR2的驍龍200/400/410的WP手機。對Lumia來講,型號的倒數第二位數是4即為四代機。至於驍龍410的WP手機,你們可能沒聽說過,比如說LG Lancet就是搭載驍龍410的WP手機。

第五代,就是驍龍210、212、617、808、810和更往後CPU的預裝了Win10 Mobile的WP手機。由於Lumia系列從第五代就結束了,而且微軟長時間內似乎也沒有新SoC支持的打算,所以暫時沒有分第六代。

我試製的Win10 Mobile離線更新包的第一個版本最初準備支持所有的第二代WP手機。第二代WP手機的SoC版本可能會有這些:8227、8927、8230、8630、8930、8260A、8660、8960。我有點擔心可能無法適用於所有的二代老機型。

但當我下載到Lumia 620、Lumia 920、Lumia 1320獲取到的Win10 Mobile更新包之後,才發現我的擔心是多餘的。

WP手機的這些更新包大體上講可以分為這些部分:

SoC特徵包(帶qc8xxx字樣的包)、基礎系統包、解析度資源包、地區功能包(比如說國際騷擾攔截)、虛擬導航條特徵包(可能沒有)、輸入法包、語音包。

Lumia 620、920、1320的SoC特徵包均為qc8960,這下就明白了,幾乎所有的二代WP機型均使用qc8960的SoC特徵包,區別僅在於解析度。

而當時搭載驍龍S4 CPU的WP手機僅有三種解析度:480x800(代表機型有Lumia 820、華為W2)、720x1280(代表機型有HTC 8X、三星ATIV S)、768x1280(代表機型有Lumia 920、Lumia 925、Lumia 1020)。

所以,二代的部分我只按照解析度來分類。

我將第一個版本發佈在國內各個討論WP的論壇,獲得了一定程度的回應。當我見到第一個更新成功回饋之後,我就得知我的這個理論是正確的。

初步解決完了二代機型的問題,現在來看看三代和四代。

已知第三代WP手機中,這些手機不受到支持:

Lumia 530、Lumia 630、Lumia 635(512MB RAM)、三星ATIV SE、HTC One M8 for Windows。

從第三代起,SoC特徵包就不能互相通用了,而且一組更新包必須要符合一定的組合才能正確推送進手機。從這裡開始,更新包是由SoC特徵包、解析度、是否有虛擬導航條來進行分類決定機型的。

這裡要跟大家說明一下,三/四代機使用的SoC特徵包有:

qc8x12:代表機型Lumia 430、435、530、532

qc8x12_16k:代表機型Lumia 535、540

qc8x26:暫時沒發現,目前也不包含帶這個特徵包的機型

qc8x26_16k:代表機型Lumia 630、635、636、638、640、640XL、730、735、830

qc8974:代表機型Lumia Icon、930、1520,三星ATIV SE,HTC One M8 for Windows

而三/四代機一共有這些解析度:

480x800:代表機型Lumia 430、435、532

480x854:代表機型Lumia 530、630、635、636、638,實際上和上面的480x800用的是同一套解析度資源包

540x960:代表機型Lumia 535

720x1280:代表機型Lumia 640、640XL、730、735、830

1080x1920:代表機型Lumia Icon、930、1520,三星ATIV SE,HTC One M8 for Windows

至於帶虛擬導航條的機型,我也有了分類,這裡就不做列舉了。

在第三代WP手機制作的時候,我採取了一些技巧:

對於qc8x26_16k的兩種不同解析度的機型,將解析度包替換一下就可以變成其它機型所使用的更新包,並且對於一些不帶虛擬導航條的機型刪除虛擬導航條特徵包,反過來同理。

如果把虛擬導航條特徵包推進本來不帶虛擬導航條的機型上,會給手機加上虛擬導航條且實體導航鍵可能會失效,具體參考我前面的【Win10 Mobile教程:為手機添加虛擬導航條】

離線更新包第二版的時候,就加入了這些機型。

不過一些人跟我回饋,離線更新包V2解壓出現問題。

你們應該注意到了,我用的是WIM這個格式。

我並不習慣使用RAR,用7Z也不是很方便,而且ZIP也很難大字典壓縮,我就選擇了WIM這個格式,反正也能用7-Zip打開。

WIM格式的包我使用了DISM命令來製作,您也可以使用ImageX。

如果掛載後進行修改了再反掛載,WIM包結構就會不規範,因此就會出現用7-Zip解壓出錯的問題。如果重新封包就不會出現這個問題。

我刪除掉了更新包內的輸入法包,很多人跟我回饋,更新上去之後無法使用輸入法以及輸入PIN碼解鎖。

對於輸入法包這個問題,其實我是比較頭疼的。因為不同地區的固件預設內置的輸入法包並不一樣,有些手機可能是英版固件,有些可能是美版固件,內置的輸入法可能是美國英語或是英國英語,兩者的輸入法包互不通用。如果更新包裡缺少對應的輸入法包,推送上去之後這些輸入法就會無法調用,因此就需要另外單獨推送一份輸入法解決問題。

這一部分的應用,參考【Win10 Mobile教程:單獨離線安裝或修復輸入法、語音包】

第三版的時候,使用驍龍800機型的用戶和三星ATIV S用戶、華為W2用戶跟我回饋,推送完10586.107之後進行後續更新直接苦臉。我拿到機器之後進行了重複操作,確實如此。猜測是更新包結構缺少了某些東西導致不適用於這些機型。

並且我委託Lumia刷機助手的開發者替我開發了一套圖形化離線推送工具,配合離線更新包項目一併發出。雖然有的時候用著不是很可靠……

但後來我又發現LG Lancet用戶在論壇回饋不能更新Win10 Mobile,所以我決定更新第四版,並順帶解決了使用驍龍800機型的用戶和三星ATIV S用戶、華為W2用戶回饋的後續更新苦臉問題(在4.1版本真正解決)。

上圖就是搭載驍龍410的WP手機之一——LG Lancet。

由於在中國,搭載驍龍410的WP手機十分稀少,我便委託我一個在美國的朋友購買了一台LG Lancet用於抓包研究。本來他準備5月回國給我完成抓包的,但是他問了一下我的離線更新包項目做法,就在那邊幫我完成了抓包工作。

結果,離線更新包V4就這麼提前發佈了。

驍龍410的機型的SoC特徵包就是qc8916。其它驍龍410的機型像BLU WIN HD LTE,只需要按照其特徵將更新包的部分內容作下改動,替換掉SoC特徵包、解析度資源包就可以適配了。通過後來在BLU WIN HD LTE的推送測試來看很成功。

此外,還記得我前面的離線安裝輸入法提到的Windows Update Catalog嗎?

雖然那裡面的更新包是不被WP8.1所支持的cbs/cbsu/cbsr格式,但裡面列出了很多SoC特徵包,目前來看被遺漏的目的機型還有qc8960_alt.alt的,而這就是HTC 8S/8X/8XT所使用的,實際上並不是所有的HTC 8X用的都是此特徵包。

HTC 8X有很多種定制版本,國行定製版、V版、ATT版、澳大利亞版、亞太版、歐版……五花八門。

HTC 8X/8S的老用戶應該也還記得曾經WP8.1推送出無限重啟問題的陰霾。這就是因為HTC的機型特徵包特殊化導致的。

對於HTC 8X的離線更新包,我選擇借助一台HTC 8S來進行抓包。

好不容易抓來包之後,我得到了我想要的qc8960_alt.alt的SoC特徵包,開始交給HTC 8X用戶測試,並且我自己也測試了一下。

於是悲劇發生……我拿到的HTC 8X離線更新失敗,直接無限齒輪、苦臉、重啟,無法回滾。Verizon版用戶回饋手機報錯80188306。

光有錯誤報告是不夠的,我還要知道在哪裡出了問題。

我要求這些報錯的使用者,使用getdulogs程式(在MSDN的技術文章也有提到此程式,我的離線更新包的iutool命令列套裝程式也有附帶)將更新日誌匯出來上傳供分析。

執行命令是

getdulogs -o 123.cab

這個更新日誌包是cab格式的,裡面有很多用於問題診斷的資料。這裡我們主要看ImgUpd.log這個檔。

將這個日誌翻到後面,問題就出來了。

裡面提到了最關鍵的一個檔:microsoft.8960.devicelayout_prod_alt,和我提供的從HTC 8S抓來的包的特徵包不匹配。而Windows Update Catalog裡也沒有收錄這個特徵包檔,說明HTC也沒有積極地跟微軟提供適配檔。

刪除這些不匹配的SoC特徵包,可以推送進去,但是會因為無法適配導致五分鐘一重啟。

除了Verizon版HTC 8X以外,其它版本的HTC 8X/8S普遍存在一個問題,就是系統磁片基本被填滿了,系統檔無法被新的更新包更新,這也就是苦臉的原因。

系統磁碟分割(Sys)佔用多少,在Windows預覽體驗的關於裡可以看到。

所以,8X/8XT不可升級的鍋,得讓HTC來背。

WP8.1到Win10 Mobile的更新包屬於全量更新(spkg格式),所以可以做到幾乎所有機型適配。但是,微軟所提供的WP8.1 GDR2更新包均屬於增量更新,要求升級前的版本必須是特定版本。這個工作量很大,我無法完成,我也拿不到所有的全量更新包,因此也無法進行WP8.1 GDR2離線更新包項目。

而我提供的替代方案,就是給特定的一些難獲得WP8.10.14219.341或以上版本系統的機型(比如三星ATIV S)的到WP8.1 GDR1或GDR2的離線推送包。這個方法挺有效,而且這也離不開XDA-Developers的大佬的幫助。

以上,就是Win10 Mobile離線更新包的起源、實現原理以及一些機型不可更新的原因的介紹。同時非常感謝您能耐心將這篇文章讀完。