Monday, February 15, 2010

让Android手机通过USB数据线共享电脑网络 (Linux版)

中国移不动的流量费向来是奇贵无比 (还有极大的地域差别, 浙江移动10元是200M, 而四川只有70M), Android手机更是用起流量来刷刷刷的, 要是一直保持网络连接, 一会儿就同步点联系人、Calendar、Gmail, 一会儿又检查下有没有软件更新, 我也曾经有过因此而超支到100多元的惨痛经历. 虽说现在每个月有100M的流量可以使用, 但还是有点不够用, 我觉得最理想的是能够借助电脑的网络上网. 也许有人会觉得这样有点多余, 既然有电脑, 干嘛还非得用手机上网, 其实这也因人而异, 有些时候确实会很有帮助. 试想你一边使用电脑, 再一边用手机听着豆瓣电台是怎样的感觉.

现在手机借助有线网络上网一般有以下几种方法:

  • 通过无线路由器+Wi-Fi上网, 这是最方便的一种方法, 但也是经济成本最高的一种.
  • 通过笔记本电脑的无线网卡建立ad hoc网络, 再使用Wi-Fi连接上网. 这种方法我曾经在Window$ XP里试过, 有点复杂, 且最终以失败告终... 不过据@coolwdp同学说在Win7下很方便.
  • 通过USB数据线将手机与电脑相连, 再分别在电脑和手机上虚拟出一个网络接口用于网络通信, 这很类似于VPN与虚拟机上网的原理. 今天将要介绍的就是这种方法, 好处是不论台式还是笔记本都适用, 只要有USB接口. 机锋网上有一篇针对Window$系统的介绍帖, 使用Window$的同学可以参考参考, 这里的介绍仅仅面向使用Linux的同学.

下面是详细步骤, 初看会有点复杂, 但只要理解了原理还是很简单的.

  1. 按照我以前的文章[在Ubuntu中配置可供Windows主机共享上网的VPN服务器]中介绍的方法设置电脑的IP转发及NAT.

  2. 用USB数据线连接手机与电脑, 上一篇文章介绍的CM ROM提供了"Internet tethering" (tethering是使电脑通过手机上网的意思, 和我们今天介绍的目的刚刚相反) 功能, 在"Settings->Wireless controls"中. 如果你的手机提供有"Internet tethering"功能, 将它开启. 为什么需要这么一步呢? 我们并不是想要借助手机网络来让电脑上网, 仅仅是为了利用它来建立虚拟的网络接口. 当开启"Internet tethering"后, 分别在电脑和手机上输入"ifconfig"与"busybox ifconfig", 你会发现两边都有一个叫做"usb0"的网络接口, 且IP地址都是一个网段, 如"192.168.77.X", 两边也可以互相ping通. 这就是"Internet tethering"虚拟出来的网络接口, 我们后面全部需要靠这个接口来与电脑通信.

  3. 虽然现在手机和电脑已经可以互相ping通, 但手机还无法访问外网, 这就需要设置一下手机上的路由表. 方法很简单, 只需要将默认路由的网关设置为电脑上"usb0"接口的IP地址就可以了, 比如这个IP地址为"192.168.77.100", 则在手机终端中输入以下命令:
    # busybox route add default gw 192.168.77.100 dev usb0
    
    现在再试试ping一下"g.cn"的IP地址: 203.208.39.104, 通了的话就证明已经可以访问外网.
  4. 光能通过IP地址访问外网还不够, 需要再将DNS设置好, 同样在手机终端中输入命令:
    # setprop net.dns1 8.8.8.8
    
    感谢万能的Google大神提供了这个万能地址, 现在应该可以直接ping通"g.cn"这个网址.
  5. 其实到现在为止, 基本的配置已经完成, 你已经能够享受电脑网络而丝毫不用考虑流量这回事了. 但当你关闭"Internet tetering"之后, 刚才所有的配置又会还原, 也就是说下次还需要输入以上两行命令, 这样就太麻烦了一点. 这里推荐使用GScript软件将以上命令保存为脚本文件, 当需要设置的时候就直接运行脚本, 脚本配置如下图:

    GScript

    这样每次的步骤就变成了开启"Internet tetering", 然后运行脚本. 可能是GScript本身软件的问题, 有时脚本需要多运行几次才行.

  6. 最后需要注意的一点就是某些Google服务 (如Google Talk) 必须在打开手机网络的情况下才能使用, 即使你已经可以通过电脑访问外网. 并不用担心打开手机网络会消耗流量, 那只是一个假象, 真正的网络通信全部都是通过电脑网络来实现的, 你可以仔细观察状态栏上的手机网络图标的箭头并不会闪动.

参考资料: 【更新】让G1通过usb共享电脑的网络,更新简单详细教程, [android-freerunner] Share internet connection through USB.

Sunday, February 14, 2010

HTC Magic (G2) 简明刷机指南

刷机可以理解为重装系统, 如果一个智能手机买来都没有刷过一次机, 在我看来那是极大的浪费. 作为一个智能手机的初级用户, 在经历了足够长的适应期与心理准备期之后, 我决定尝试着弄一次. 刚开始还一直担心会不会刷完后机子就直接变砖块了, 后来才知道, 如果不刷SPL (bootloader的一部分) 的话, 普通刷机是没有风险的.

刷机最重要的就是选择合适的ROM, Android系统从版本来分有1.5、1.6、2.0、2.1, 每个版本又有官方与非官方数种ROM. 就中文用户来说, 适用的有国内两大阵营: 机锋网 (这是@coolwdp同学推荐给我的) 和安卓网制作的各种ROM. 我选择的是机锋网基于CyanogenMod (CM) 编译的ROM, 最新的稳定版为4.2.14.1, 是Android 1.6的ROM.

下面是在G2上刷机的详细步骤:

  1. 从上面的论坛地址中下载相应的ROM, 重命名为"update.zip", 复制到SD卡的根目录.

  2. 关闭手机, 同时按住Home (小房子) 和Power键一段时间, 直到进入recovery mode. 这时需要按"Alt+W"键来清空内存, 但由于G2没有硬键盘, 也就没法直接完成. 但有人对recovery mode进行了修改, 加入了几个可以用轨迹球选择的菜单, 如果你的手机的recovery mode里没有这样的菜单, 就需要安装修改版的recovery image, 如果已经有了, 请跳到下一步.

    一开始我使用的是CyanogenMod官方制作的"cm-recovery-1.4.img", 结果进入recovery mode的时候一直卡在HTC的画面上, 只能把电池取下来, 强行重启. 后来才发现G2不能使用1.4的image, 于是在xda-developers上下载了专门针对G2 32A制作的1.4 image (也有32B的image). 下载相应的recovery image到SD卡的根目录, 然后在手机的终端里执行以下命令即可安装:
    # flash_image recovery /sdcard/cm-recovery-1.4-32A.img
    
  3. 现在已经进入了recovery mode, 选择"Alt+W"开始清空内存, 这里强烈建议在清空之前使用AppManager将所有的软件都备份到SD卡上, 以免重新下载 (这年头流量可不便宜).

  4. 清空完毕之后选择"Alt+S"安装ROM, 这步时间会稍微长点, 成功之后即可重启手机开始享受全新的ROM吧.