解决HTC Sense天气无法更新的方法
2011-03-22 22:32 by hackerzhou鉴于有朋友反映看不懂,我打包了一些放上来(注意看清楚环境),下载好后改名替换/system/app/中的同名文件,由于自制的ROM品种繁多,因此我做出来的apk不一定适用,大家最好还是按照我的教程自己打包。
HTC Desire Z / T-Mobile G2(Android 2.2)http://s.hackerzhou.me/1w
HTC Desire(Android 2.1)http://s.hackerzhou.me/1x,改名成WeatherSyncProvider.apk
HTC Desire(Android 2.2)http://s.hackerzhou.me/1z
HTC G2(不是T-Mobile G2)/G4(Android 2.1)http://s.hackerzhou.me/1y
最近买了HTC Desire Z,比较喜欢原生的Sense界面,刷了一个带Sense的ROM了之后发现用移动的GPRS网络无法更新天气,显示“下载天气数据时发生连接中断”这样的错误信息,而用wifi更新则正常。网上一搜,同病相怜的还真不少,不过解答都不给力,没有一个切中要害的,还有的说是htc服务器的问题(其实Sense的天气用的是accuweather的数据)。
本着爱折腾的原则,开始了一番折腾。连接中断这样的异常有点像是中国移动在网关层面上做的一个规则,或者是学功夫网的间歇性丢包,不过为啥移动这么做就不得而知了,毕竟电信和联通都没屏蔽,说明不太可能是功夫网下手的,我倾向于认为是移动自己的问题或者是功夫网正在中国移动做调试。
所需要的条件:
1. 需要一个能够自由访问htc.accuweather.com的站点(我用的是我自己的VPS)以及域名一个(没有域名的可以去申请tk免费顶级域名)
2. 如果是虚拟主机的话需要你会写php之类的服务器页面用于转发(我偷懒了,直接用Apache的Proxy Mod)
3. 本文所需工具我已打包放到GoogleCode上,链接:http://code.google.com/p/hackerzhou/downloads/detail?name=Modify_HTC_Weather.rar
思路:
通过改变客户端(com.htc.sync.provider.weather.apk)请求的地址,让其请求我们自己服务器,服务器则负责转发请求到真正的服务器并返回结果。(试验过通过修改hosts文件,但发现效果不理想,间歇性成功,怀疑移动做的是url匹配的过滤机制)
步骤:
1.改造客户端
1)找到/system/app/目录下的com.htc.sync.provider.weather.apk,有些ROM是WeatherSyncProvider.apk文件,拷贝回电脑。
2)使用apktools解包apk文件
注意,会提示少framework,故先运行“apktool if com.htc.resources.apk”将需要的htc framework导入进来(com.htc.resources.apk在ROM的/system/framework/文件夹下,可以顺便把framework-res.apk也一起导进来)
再执行“apktool.bat d -f com.htc.sync.provider.weather.apk com.htc.sync.provider.weather\”
3)查找包含htc.accuweather.com的smali文件,可以使用find命令(用法find “htc.accuweather.com” ./*,就是在当前目录下查找,可以用find /?查看详细用法)
4)定位到com.htc.sync.provider.weather\smali\com\htc\sync\provider\weather\,打开SyncService$Sync.smali,是用文本编辑器(推荐UltraEdit或者Notepad++之类的,不会破坏文件原有信息),查找“http://htc.accuweather.com”,替换成你自己搭建的服务器地址。
5)执行“apktool b com.htc.sync.provider.weather\ com.htc.sync.provider.weather.apk”打包成apk
6)用signapk.jar进行签名”java -jar signapk.jar testkey.x509.pem testkey.pk8 com.htc.sync.provider.weather.apk com.htc.sync.provider.weather.signed.apk”进行签名(我第一次尝试时忘记签名,但是也不会报任何错,就是不能成功更新)
7)将修改过的文件重命名为com.htc.sync.provider.weather.apk,并用adb执行“adb push com.htc.sync.provider.weather.apk /system/app/”写入手机文件系统中。
2. 搭建服务器端支持
由于我有服务器的root权限,因此就直接用apache提供的Proxy_Mod来完成请求的转发(相当于一个反向代理)
增加一个VirtualHost,在配置文件里做如下修改
<VirtualHost *:80>
ServerName xxxx.hackerzhou.me(此处为你客户端请求的域名)
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://htc.accuweather.com/
ProxyPassReverse / http://htc.accuweather.com/
</VirtualHost>
如果大家没有主机root权限,只有虚拟主机的话,也可以自己动手,用php的curl写一个转发请求的脚本,应该也很容易的。
服务器和客户端都搞定了之后大家重启手机后就会发现,天气的同步又回来了。
【如需转载,请注明出处。】
2011-06-16 10:12
我有个QNAP家用多媒体服务器一直联网,DESIRE S和G3手机,可就是不会弄啊,对没有编程基础的小白来说太复杂了
2011-06-09 23:36
lz,您好,实在不太会做,我是G2,使用的是Joysense 4.0,替换没用,想尝试自己做一下,可是失败了,想问一下直接替换你发布的apk的内容到Joysense 4.0相关apk的内容可以么
我看楼上有人请你帮忙做过一个Joysense 4.0的文件,您可以抽空发一下么,或传我邮箱,谢谢了,麻烦您百忙中看一下~万分感谢
2011-06-08 16:18
我的也是DZ,下载了你的com.htc.sync.provider.weather.apk,改名为weathersyncprovider,在2.3 的官方测试ROM里也一样支持,非常感谢!
冒昧问下:是不是我们能不能更新天气完全取决于你的服务器?你哪天不高兴了,我们不就惨了? :-)
2011-06-08 17:25
原则上说是这样。。。取决于我服务器的访问压力,大家也可以自己建服务器。
2011-06-09 13:39
建服务器貌似难度太大,那我们只有祈祷咯。
2011-06-06 11:49
能否 告诉一下,怎么样导入Framwork?
2011-06-06 16:27
apktool if xxx.apk
2011-06-06 10:20
大侠,帮我做个好吗,你的方法太复杂,小弟实在不会呢,APK已发给你。谢谢了。
2011-06-06 10:46
最近比较忙,本文的用意也仅仅在抛砖引玉。方法也不难,仔细看看就会。
2011-06-01 20:40
能力越大 责任越大,帮忙做个G6的吧 多谢了 估计希望也不大 但还是求你帮个忙
2011-06-02 07:40
自己做,所谓自己动手丰衣足食。如果想着样样靠别人,那你不适合用android,给教主捐点钱买iphone去。。。
2011-05-30 23:13
太膜拜大侠了~
本人用的是DESIRE S,也就是G12~
刷的时候港版精简~
不知大侠能否帮忙做个~不知要提供哪些系统文件?
盼您的回复~谢谢
2011-06-01 10:15
工作比较忙,没有时间一一做了,大家按照我的教程来的话应该不难。
2011-06-01 16:36
小弟才疏学浅,看了半天没弄明白…所以请大侠出手相助!
2011-05-29 19:01
周大侠 有没有试过添加别的天气源
2011-05-29 21:32
没有,最近忙的都快冒烟了= =b。可行的,就是转换上需要费很多时间,毕竟别的天气源跟sense官方的数据格式不一样,比如国内的源的天气有阴天,sense只有cloudy,almost cloudy这样的,具体怎么对应不知道。反正我现在觉得accuweather的预报比中央台的靠谱,至少就上海来说。
2011-05-29 11:14
麻烦大神,我的机器是G7,2.2。下了WeatherSyncProvider.apk,然后这个文件怎么推回到手机里面去啊?
2011-05-29 13:01
adb或者用rootexplorer
2011-05-13 18:35
大神 我的G6 APK已经给你发过去了 [email protected] 希望你百忙之中 一点时间给做下G6的 我万分感谢 真的跪求了
2011-05-13 19:39
现在不给人专门做了,最近事情也很多,我只是提出一种可行的思路,大家follow我的思路去做就可以了。