魔改Sony Headphone Connect强制升级国行WH-1000XM2
前一阵子京东入了个大法的WH-1000XM2,感觉程序有一些小毛病,而且那中文的语音实在是…作为一个不折腾会死星人,拿到手之后不久就研究能否刷机更新固件。上网谷歌了一圈,貌似已经发布了2.0.1的固件,但配套程序并没有更新提示,于是就怀疑是国行的问题。上网再查了一圈貌似并没有人折腾这玩意的固件,也没有人搞强制刷机,那只能自己动手丰衣足食了。
更新:WH-1000XM3(但不是XM2)的国行4.1.3版本带有语音语言切换功能。如果您WH-1000XM3的使用者并且仅对本功能有需求,我建议您不要看本教程,通过正规渠道升级到4.1.3即可。
更新2:这种修改逻辑不适用于2.0.1(国际版)更新到4.1.3(国内版),根据贴吧大佬的分析,原因在此。如果你按照本贴教程升级到了2.0.1但后悔了,想回滚到国内版本的4.1.3,或许你可以尝试这大佬的解决方案(我本人对刷回国行没有需求所以没有试过,请尝试的人仔细阅读他所提及的注意事项)。
提醒及警告
这篇博文讲的任何内容并不受Sony官方支持,本人也并不对此造成的保修作废、耳机变砖、耳机电池爆炸等等等等的任何问题负责。尝试本博文的方法带来的任何后果自负。本文所提供的内容仅适用于WH-1000XM2,其余型号请自行研究。本文所提供的内容仅针对Sony Headphone Connect 3.2.0版本。
根据LvWind的博客的文章,Headphone Connect 4.0+版本已经改掉了这些检测逻辑,需要修改的位置可能跟本教程不同。如果你需要WI-1000X或者WH-1000XM3的各版本MDRID,你也可以参考LvWind的文章。
准备工具
- Apktool (旧版的可能有问题,建议最新的2.3.3)
- 一个靠谱的文本编辑器
我的研究过程
提醒:你用别的方法反编译后类、方法、命名空间等的命名不一定与我的相同,建议善用文本搜索
TL,DR:如果你不想看我的研究过程只想看教程或者下载我打包的文件,请跳至页尾
首先上网找了个在线反编译的网站反编译了一遍,下到本地。用IJ尝试重新编译成APK,发现失败,于是放弃用在线的反编译工具,仅把这反编译的代码作为参考。然后用Apktool拆包了一下,看到一堆smali指令码,也没什么头绪从何入手。
然后我在手机那抓了个包,发现软件启动的时候请求http://info.update.sony.net/HP001/MDRID289202/info/info.xml
,居然返回的是404。不负责任的猜测了一下MDRID289202是机身的内部型号(包括版本号)。全局搜索了一下源码发现info.update.sony.net
在com.sony.songpal.mdr.automagic.AutoMagicManager
里面。
private URL m9721d(String str, String str2) { String str3 = "info.update.sony.net"; if (str == null) { throw new IllegalStateException(String.format(Locale.getDefault(), "%s:code=%d", new Object[]{"AutoMagicManagerErrorDomain", Integer.valueOf(AutoMagicError.NoCategoryID.ordinal())})); } else if (str2 == null) { throw new IllegalStateException(String.format(Locale.getDefault(), "%s:code=%d", new Object[]{"AutoMagicManagerErrorDomain", Integer.valueOf(AutoMagicError.NoServiceID.ordinal())})); } else { try { return new URL(String.format(Locale.getDefault(), "http://%s/%s/%s/info/%s", new Object[]{str3, str, str2, "info.xml"})); } catch (Throwable e) { SpLog.m12039a(f5487a, e); return null; } } }
这玩意用了两个字符串类的参数,然后在URL里面就是HP001和MDRID289202,于是猜测假如我篡改这个参数的获取程序使其获取成国外行货的代码,大概就能强制更新了(前提是硬件完全一样)。顺藤摸瓜检查m9271d这方法的调用,查到了保存这个参数的类com.sony.songpal.mdr.application.p061b.C1702a
。
void m7942a(C2503b c2503b) { if (Command.fromByteCode(c2503b.m11224a()) == Command.UPDT_RET_PARAM) { cm cmVar = (cm) c2503b; if (cmVar.m11579e() != this.f4438n) { SpLog.m12040b(f4425a, this.f4438n + " expected, but received " + cmVar.m11579e()); return; } af f = cmVar.m11580f(); switch (cmVar.m11579e()) { case CATEGORY_ID: this.f4429e = ((ag) f).m11716a(); break; case SERVICE_ID: this.f4430f = ((ag) f).m11716a(); break; case NATION_CODE: this.f4431g = ((ag) f).m11716a(); break; case LANGUAGE: this.f4432h = ((ag) f).m11716a(); break; case SERIAL_NUMBER: this.f4433i = ((ag) f).m11716a(); break; case BATTERY_POWER_THRESHOLD: this.f4434j = ((ae) f).m11711a(); break; default: throw new IllegalStateException("Invalid inquired type " + cmVar.m11579e() + " was expected"); } if (this.f4437m != null) { this.f4437m.countDown(); } } }
SMALI指令码对应如下(com.sony.songpal.mdr.application.b.a
)
.line 156 :pswitch_1 check-cast v0, Lcom/sony/songpal/tandemfamily/message/mdr/param/ag; invoke-virtual {v0}, Lcom/sony/songpal/tandemfamily/message/mdr/param/ag;->a()Ljava/lang/String; move-result-object v0 iput-object v0, p0, Lcom/sony/songpal/mdr/application/b/a;->f:Ljava/lang/String; goto :goto_1
把这玩意的SERVICE_ID那改成外国行货的ID就好了。比如
case SERVICE_ID: this.f4430f = "MDRID123456"; break;
但问题来了,不知道外国行货的ID是多少,于是@Lucifer提出了可能ID是连着的,于是我试了试MDRID289200,确认有这个型号。于是修改Apktool解包的SMALI为
.line 156 :pswitch_1 #check-cast v0, Lcom/sony/songpal/tandemfamily/message/mdr/param/ag; #invoke-virtual {v0}, Lcom/sony/songpal/tandemfamily/message/mdr/param/ag;->a()Ljava/lang/String; #move-result-object v0 const-string v0, "MDRID289200" iput-object v0, p0, Lcom/sony/songpal/mdr/application/b/a;->f:Ljava/lang/String; goto :goto_1
重新用Apktool打包,然后用自己的证书签名。传到手机那,成功检测到更新。然后发给勇士@Lucifer来试了一下(我有点怂不敢试,毕竟如果变砖了我寄回国内可是相当麻烦)。实测貌似没啥毛病,更新成了国外版本的2.0.1固件并且语音变成了英文。于是自己也试了一下,更新后貌似确实没啥毛病。
装回原版程序后再次用抓包抓了一下,发现请求的service id已经变成了MDRID289200。大概不用担心以后又变回国行固件的问题。
简要教程
- 用Apktool解包:
apktool d a.apk
(我为了方便文件名改成了a.apk),这一步会创建一个名为a的文件夹 - 进入文件夹,全局搜索
invoke-virtual {v0}, Lcom/sony/songpal/tandemfamily/message/mdr/param/ag;->a()Ljava/lang/String;
,打开包含这一行的文件。 - 跳至
.line 156
,把里面的内容修改成我上面所述的内容 - 重新打包:
apktool b a -o b.apk
,这会生成b.apk - 给b.apk签名,这个网上都有教程我就不写了
- 把原本的App卸掉,安装这个APK,然后连接耳机,如果没毛病的话应该会见到底部的更新提示,按部就班更新就行
- 更新完后卸掉这个魔改的App,安装回原版的App,enjoy
我打包的程序
我知道肯定有人会懒得自己动手,于是就把自己打包的给发上来了。警告:仅适用于WH-1000XM2。
百度网盘:https://pan.baidu.com/s/1KrbW6yb0fJho4u7VjtGr0A,密码:5qgc。
Akariiin
路子好野啊.webp
试了一下成功了 感谢
alextai
太棒了!测试成功!!感谢分享~~~
雪乃℃
请问怎么查内部版本号对应地区?
想改成香港的固件
Howard
这是个好问题,如果你发现了方法请务必告诉我。当前想知道的话只能拿一个港版的机子来抓包调试。
(所以正如我文章说的,我这个编号纯粹靠猜)
Kouga
我是港版的,但是提示语音也是英文喵~
雪乃℃
请问在使用时有发现有存在什么问题吗?谢谢
Howard
我自己那个暂时没有出什么问题,一切正常。
但我上面描述了:“尝试本博文的方法带来的任何后果自负”,如果你对此操作的带来可能的后果表示担忧,建议别尝试。
雪乃℃
好的,谢谢提醒
wanruixin
英语提示音比国行大妈音比起来怎样?谢谢
Howard
老实说,舒服多了。当然这也是个人看法而已,并没有说英文的有多好听,但国行大妈音实在是太感人了
qooo
大佬牛逼! 当时就去是实体店被英文语音迷上的 结果买上之后国行大妈这声
Sharuru
最近在折腾 WI-1000X 的更新,正好看到了这篇文章…感谢提供解决思路。
小一 (@xream)
hi 请问你折腾成功了吗…
Howard
WI-1000X前几天我好像在贴吧见到了教程….至于是哪个帖子哪个吧我就记不大清楚了
licia
找到啦 http://tieba.baidu.com/p/5845777671
澟
爽炸,我找五百年才找到的
coder
大佬,点升级之后,手机和耳机蓝牙自动断开,停在0%,然后提示失败是为什么
Howard
不知道…我没碰上这个问题
你确定你没操作错那一步么?或许你去贴吧问一下能找到答案
HeaGaa
請問SP700n適用嗎?
Howard
至少我提供的安装包不适用。
或许你可以照着这思路自己搞一个用于SP700N的安装包?
zzzy
京东自营国行试了下,成功了
shigella
……重新打包好麻烦 我试了用Fiddler强行修改请求的URL 似乎并没有用/(ㄒoㄒ)/~~
Garan
想给我的wh 900n更新。。。然而想到耳机是某限量版(看看能不能,等别人做出来吧
zz
感谢,新固件似乎还修复了一些小bug
zz
一个小疑问,请问有没有可能降级回去呢?
Howard
我觉得没戏,毕竟你没法选择你要刷哪个版本,只能在有更新时使用更新功能刷新固件。
当然,如果你能下载到旧版固件,或许进一步魔改这个App能实现回滚,但这就在我知(乱)识(蒙)范围外了,或许你可以去贴吧之类的地方求助大神。
flyers
求助国际刷国行的程序,2333国行按照这个方法已经刷了国际版的xm3…
Howard
Hmmm….国行的MDRID的链接是404,我猜它根本就没有任何升级包提供。所以我觉得刷回国行基本没戏。
xiexin
你好,1000xm3 国行版已经推出4.1.3固件更新,由于之前在贴吧下了升级国际版包,导致现在不能升级国行版,目前还没有看到有刷回国行版魔改版APK,想自己动手做一个,但是完全是行外人,想问下大佬,是否可以考虑将id固定输入为国行id升级1000xm3?为了弄清楚怎么改,下载了大佬你的包,昨天弄了一天,解包之后,用的vs2017文件夹全局搜索搜索不到大佬上面提供的代码,请指教。
Howard
你解了我的包之后搜索不到
MDRID289200
?那你试试从头开始(就是从原版开始改)呢?jack
xm3 刷入后序列号是空的。。。
Howard
这我就不知道是什么情况了…说起来,怎么看序列号?
Pureblue
dalao您认为国行xm2会像国行xm3一样更新 来在Headphones Connect内原生支持提示语言切换吗 主要不想刷 但是也实在受不了大妈音
Howard
可能吧,那自然是最好的解决方案了。
实际上我认为语音语言切换是个蛮鸡肋的功能…需求量不大的话,可能不会增加这个功能(假如硬件比如FLASH空间一开始就没有这么设计的话)
Enma
wi1000x 新版本发布了。4.1.1。 更新后需要apk是4.0版本。大神有空倒腾一个?
Howard
我只是个萌新我懒得搞了,况且手上也没有WI-1000X。贴吧上面有现成的旧版1000X的魔改Headphones Connect,刷成外国固件之后再装回原版的4.0 apk再刷一遍就行,因为刷成外国固件后系统的识别号应该会变成外国行货,再更新的时候就会自动下外国的最新版。cy
国际版wi1000x 更新了4.1.1固件后音量不正常了
Holy
老哥,现在1000xm2国行推送了4.1.3的固件,怎么刷回国行4.1.3固件呀,我下载了官方4.1.0的Headphones Connect,改编号为MDRID289202,还是检测不到升级,不知道是不是我改的有问题,老哥有时间可以看下嘛
Howard
这就很有意思了。我访问了一下
https://info.update.sony.net/HP001/MDRID289202/info/info.xml
还是404。国行推送如果也是通过这个Headphones Connect推送的话应该会有更新信息才对。我猜测是新版Headphones Connect针对国行设备有一套不同的更新逻辑。这个有待研究。
因为我自己并没有这种需求也没空去弄,就交给别的大佬们了。
Holy
额,404的原因是因为索尼的更新没有使用SSL,使用http://info.update.sony.net/HP001/MDRID289202/info/info.xml是可以访问的,也能抓到固件、
索尼APP本身请求的也是HTTP
Howard
噢,原来如此,多谢纠正。digest不是校验设备编码而是校验下载的固件的完整性吧,既然国行能刷外行的,外行刷不了国行就很奇怪了。
Howard
我自己也搞了一下,发现确实不行,抓包发现是下载了国行的更新描述文件,但并没有提示更新。有待研究
Holy
https://s2.ax1x.com/2019/02/13/k0A0h9.png
如上图,我看了下,左边的是外行,右边的是国行,Get到的包里有一个digest这个东西,会不会是这个在校验设备编码之类的?刷了外行固件以后digest可能成了外行的,所以APP自己改请求国行的因为digest不一致,所以无法更新?
lee0228
wh-1000xm2发布了4.1.3,大神有空倒腾下魔改国际版回归国行固件吗
Howard
因为我自己并没有这种需求也没空去弄,就交给别的大佬们了。(看上一条回复)
Nan IsMe
进去之后一直提示要更新最新版本怎么办
Howard
不是很懂你的意思?魔改的目的就是为了更新啊,还是说你更新之后还是提醒更新?
Mikado
我刷了,为啥使用Google Assistant声音听不清,呜哇呜哇的,就是没有一个单词是完整发音的。听歌又是正常的。这是为啥
Howard
这个我真不清楚,因为我弄的时候测试过GA是可以清晰的听到的,你有试过完全重置耳机么?
Mikado
试过,是按关机和NC键 7秒是吧,我按过了,不知道是不是GA的问题,我安卓版本是7.1.1的,手机是一加3。GA版本是0.1.187945513…
Jacob Li
安装了大佬给的软件之后,打开应用说要从google play中下载最新的版本才能使用,进不了软件诶
Howard
那就是已经失效了,去贴吧找一下帖子,强刷新版就好了
po
请问一下,可以从国行4.1.3降级到这个版本吗,这种降级是否是直接失败的?
Howard
降级需要强刷,用我打包的这个Headphone Connect没法降级的,你需要找一下贴吧的帖子。
dasiweida
大神950N1可以改成英文提升音吗?
Howard
按我帖子这思路来搞就行
但根据贴吧大神的研究,如果没有对应版本的升级逻辑的话我这种改法是不可用的。或许你可以参考一下那些强刷的方案(参见贴吧)
lesir
大佬可否研究下1000xm2刷回国行的方法,最近感觉降噪变差了可能需要售后,想着刷回去TAT
Louis
我用apktool拆5.3.0版已經找不到MDR289200的參數,請問有人成功嗎?