解决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写一个转发请求的脚本,应该也很容易的。

服务器和客户端都搞定了之后大家重启手机后就会发现,天气的同步又回来了。
【如需转载,请注明出处。】

本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 hackerzhou 并包含 原文链接
发表评论

本文有 98 条评论

  1. 旋律
    2012-03-11 15:39

    你好,我的是G12 安卓2.3.5 sense 3.5照你的方法改后2G网还是不能更新

  2. 追月
    2012-02-19 23:38

    楼主大侠,我之前刷别人定制的rom,然后用了你的补丁,天气可以更新了,现在变的官方控,下载了官方的ruu ,刷的系统,无法使用你的补丁,不知道如何解决?

  3. KANGZI
    2011-11-20 09:13

    HTC Desire(Android 2.2)http://s.hackerzhou.me/1z
    为什么我用了你的这个不行,更新还是错误

  4. Neo
    2011-11-18 08:57

    为毛twitter,facebook,G+这种网站改了host都能上,一个天气更新不了啊
    是不是功夫网在搞什么新式武器啊…..

  5. will
    2011-08-11 20:22

    你好,这位高手,请问能不能搞成国内的天气源呢?国外的毕竟太不准了!

    • hackerzhou
      2011-08-11 20:43

      没时间,而且我不觉得国外的不准。。。

  6. htc desire
    2011-08-11 15:37

    大神 看完还有一些不明白 对自己建服务器这方面不是很懂,现在免费主机(VlexoFree) 和域名(.tk)都申请了,往下就不知道怎么弄了,请指点一下 [email protected]

  7. result
    2011-06-28 08:54

    我的2.2ROM weathersyncprovider.apk文件解包之后为什么只有res文件夹和AndroidManifest.xml apktool.yml 两个文件??进行不下去了。。。。

    • result
      2011-06-28 10:19

      估计是因为我的rom是apk+odex的。。。。正在研究怎么修改odex

      • result
        2011-06-28 11:38

        终于搞定了,对于apk+odex的系统,apk文件不用改,需改weathersyncprovider.odex文件。
        从手机system/app目录里面把weathersyncprovider.odex和weathersyncprovider.apk文件拷出来备用。
        1.先用http://www.hiapk.com/bbs/thread-554593-1-1.html (下文称附文1)这里的工具把odex反编译,得到一个文件夹A(反编译的时候最好把手机system/framework整个文件夹的文件都copy到tools所在文件夹),得到的文件夹就有本文提到的SyncService$Sync.smali。
        2.按照本文的方法建立服务器,并修改好这个文件。
        3.使用附文1的工具把文件夹A重新编译为classes.dex。
        4使用winrar把classes.dex放进刚拷出来备用的weathersyncprovider.apk(并不是要修改apk,只是用来生成odex)并命名为tmp.apk,放进手机sd卡
        5.按照http://bbs.gfan.com/android-1222182-1-1.html(下文称附文2)的方法,连接手机和电脑,利用adb和dexopt-wrapper从tmp.apk生成新的weathersyncprovider.odex。
        6.把新的weathersyncprovider.odex拷回去system/app目录,一切搞定

        需要注意的是,weathersyncprovider.apk不用改,但是需要利用他重新生成odex文件。

        • hackerzhou
          2011-06-28 17:01

          赞,我抛这个砖就是引你这样的玉的~

          • wq7882
            2011-08-07 08:46

            问题是我刚开始没注意,就从你提供的那里直接下载了APK文件给替换了,原来的文件也没有保存,我现在就是想按照你交的方法去做,也没有源文件啊!所以看看怎么能帮我解决一下!谢谢了!

          • hackerzhou
            2011-08-07 19:07

            那也得拿你刷机时候用的ROM……

        • wq7882
          2011-08-05 21:37

          能把你改的apk+odex两个文件给我发一份吗?我的g7按照刚开始的办法把apk文件给替换了,原文件没留备份,现在怎么也更新不了了,没办法解决。谢谢了!我的邮箱:[email protected]

          • hackerzhou
            2011-08-06 15:59

            不同系统不一样的,我只能授你与渔

  8. week
    2011-06-24 15:07

    用这个方法的原理修改google地图成功!
    问一下,5.x的谷歌地图都有对缓存大小进行限制,有办法解除或修改这个限制吗?

    • hackerzhou
      2011-06-24 16:30

      不好意思,没有研究过,不太清楚的说

  9. Hintay
    2011-06-17 13:41

    我没有ROOT权限,求php进行转发的脚本!!

  10. beanie
    2011-06-16 10:42

    我的QNAP上有个php.ini Maintenance 的文件可以修改,不是apache,请问怎么改?需要插入些什么代码呢?您能抽空告知吗?不胜感激,我的邮箱是shanghainese#163.com 先谢了

    • hackerzhou
      2011-06-17 20:14

      php.ini改了没用,你用curl写一个转发请求的就好了

发表评论