主题 : Win10 Mobile离线更新包的起源和实现原理详解
千山同一月 万户尽皆春 千江有水千江月 万里无云万里天
级别: 总版主

UID: 998
精华: 0
发帖: 605026
威望: 529007 点
无痕币: 14 WHB
贡献值: 0 点
在线时间: 62143(时)
注册时间: 2008-12-25
最后登录: 2024-04-24

0 Win10 Mobile离线更新包的起源和实现原理详解

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离线更新包的起源、实现原理以及一些机型不可更新的原因的介绍。同时非常感谢您能耐心将这篇文章读完。
Total 0.044355(s) query 3, Time now is:04-24 09:11, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛