Inspiration from life

Software Engineer

Bo Cheng is a software engineer. He has been writing code since 2004, and is currently living in Chino Hills, CA. Below are some social links you can use to contact him.


一个轻量级的Android App: Tip Calculator

在外面吃饭,经常为了算小费而头痛,昨天突然想到,应该有这种帮助算小费的App,上Google Play找了一圈,却没有看着顺眼的。

于是着手自己写一个,花了一晚上的时间做了一个非常简单的App,几个月没碰Android,忘了不少东西,不过好歹是弄出来了,发布在Google Play上。

基于自己是一个毫无美术功底的程序猿,所以界面有点简陋:)自己大概测了下,应该还有一些bug。

  • 算小费可以基于税前和税后的金额
  • 可自定义税率
  • 可以把金额分到不同的人头上(方便AA)
  • 安全,不需求任何特殊的权限
  • 完全免费,不含广告
  • 异常轻量,仅仅40k

同时,这个App是开源的,代码放在Github上。

如果你对这个App有任何意见或者建议,欢迎告诉我。


Android Studio:为Android定制的IDE

原文:http://android-developers.blogspot.com/2013/05/android-studio-ide-built-for-android.html

Xavier Ducrohet, Tor Norbye, Katherine Chou发表

今天在Google I/O上,我们发布了一个专为Android开发者准备的新IDE:Android Studio,它可以免费使用,你现在就可以试试它的早期预览版。

我们与最流行的Java IDE之一,IntelliJ IDEA 社区版,的开发公司JetBrains合作,开发了Android Studio。在强大的IntelliJ IDEA 社区版的基础上,我们添加了一系列针对Android开发的功能,可以提高你的工作效率。

可扩展的构建工具

我们知道你需要一个适合项目的构建系统,Android Studio的新构建系统基于Gradle,它不仅提供了灵活、定制化的构建方式,还有依赖管理等更多的特性。

这个新的构建系统不仅可以让你在IDE中构建项目,它同样也支持持续集成服务器。在整个工作流程中,N多杂七杂八的工具旁,你可以更方便的管理你复杂的构建配置项。如想了解更多,请查看预览版文档

强大的代码编辑

Android Studio包括一个强大的代码编辑器,这个编辑器基于IntelliJ IDEA,提供了诸如智能提示,高级代码重构,深度静态代码分析等功能。

智能提示中的查找内嵌资源,可以让你在编辑后台资源的时候,更快速的阅读资源对应的代码。高级代码重构可以让你快速的,放心的优化整个项目中代码。

静态代码分析可以让你更快的定位bug。在由IntelliJ IDEA提供的成千上万inspection的基础上,我们又加了一些定制化的inspection。比如,我们为Android API添加了一些元数据,这些元数据指示哪些方法可以返回null,而哪些方法又不可以;某个方法接受哪些常量值,等等。Android Studio就可以通过它们来分析你的代码,找出潜在的错误。

更平滑、更丰富的图形界面

过去几年,我们为ADT添加了一些拖放控件的UI功能,现在我们正在努力为Android Studio移植它们。这个Android Studio版本,你可以在IDE中预览你的布局文件在不同尺寸,语言和版本的设备中的显示效果。下面会展示XML编辑页面中预览不同的配置。

方便的使用Google services

我们想让你更方便的在IDE中使用Google Service的强大功能。首先,我们可以让你直接在IDE中将诸如Google Cloud Messaging(GCM)的Google Service集成到App中。

我们还添加了一个名为ADT Translation Manager Plugin的插件来帮助你本地化你的App。通过这个插件,你可以把字符串导出到Google Play Developer Console中翻译,然后下载并导入这些翻译好的字符串回项目中。

开源

下周开始我们的所有开发工作就会开源,到时候你就可以下载之,然后向我们提交你的代码。Android Studio的代码放在AOSP中。

试用Android Studio并给我们反馈

开始试用Android Studio 并给我们反馈吧!它是免费的,并且下载包中包括你所需要的一切:IDE,最新的SDK以及最新的Android平台等。

注意:这只是一个早期预览版,只适合喜欢尝鲜,或想决定Android工具未来发展方向的人。如果你的App有大量用户使用的话,现在还不是时候迁移到新工具上。我们还将继续支持Eclipse作为首要的开发平台。

如果你有任何意见或建议,请通过Android Studio issue tracker告诉我们。

Join the discussion on

+Android Developers

本文由Roy最初发表于:http://blog.chengbo.net/2013/05/17/android-studio-ide-built-for-android.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。


使用Gitolite来对Git的repository实现权限控制

我们项目组打算从svn向git迁移,前几天我搭建了git环境,把代码从svn转移过来,然后所有成员都通过server上的git账号来做pull和push,一切都安置妥当,没有问题。但是后来其它项目组也打算使用这个git server,那么问题来了,之前那种授权的方式肯定是不够的,因为只要能连上server,那么他对这个server上所有的repository都有完全的读写权限,这显然是不可接受的。

所以打算使用Gitolite这个组件来做权限控制,搜索了下,找到的文章貌似都是老版本的,所以有了写这篇文章的想法。

Gitolite其实也是一个git repository,首先在server上安装好后,在client上把server上的repository clone下来,在本地做一些更改,再push回server,server端的hooks会根据push上来的配置来更新权限。

接下来,介绍下安装和配置步骤

准备工作

如果你之前是用git账号来做权限控制的话,记得把/etc/passwd里git用户的shell换回/bin/bash,然后把~git/.ssh/authorized_key里不再需要的key移除。

ssh-kengen生成一对key,比如your-name和your-name.pub(下文均以此为例)

拷贝私钥到本用户的.ssh文件夹中

mv your-name ~/.ssh/

拷贝公钥到git server上

scp you-name.pub git@your.server.name.or.ip.address:~

为了以后方便,这里可以做一个server别名,指定连接所需的用户名,server的地址、端口以及私钥

vim ~/.ssh/config

输入以下内容

host githost
user your-name
hostname your.server.name.or.ip.address
port 22
identityfile ~/.ssh/your-name

安装Gitolite

登录git server

ssh git@your.server.name.or.ip.address

下载最新的Gitolite

git clone git://github.com/sitaramc/gitolite

安装,这里说明下,安装方式有3种,区别在与指定生成gitolite可执行文件的路径,这里采用Gitolite作者推荐的第二种,也就是把文件生成到$HOME/bin中,这样可以在接下来的bash中直接执行gitolite命令而不用指定路径(如果你的~/bin目录不存在记得先mkdir ~/bin)

gitolite/install -ln

设置,由于是第一次运行这个命令,所以这里指定的key是拥有Gitolite管理员权限的

gitolite setup -pk your-name.pub

此命令会在你的~/repositories/目录生成两个repository:gitolite-admin.git和testing.git

配置权限

退到你的workstation上

exit

clone刚才生成的gitolite-admin.git

git clone githost:gitolite-admin

注意这里用的是刚才准备好的server别名来连接的,其中最重要的区别是使用your-name.pub这个key,并且没有采用绝对路径来指定想要clone的repository,而是直接使用名称,并且这个名称也没有包括.git这个后缀。这一点很重要,因为这是用Gitolite的机制来clone,如果你跳过它直接使用git来,那么它的一些功能就无法实现了。以后clone, push其它需要受Gitolite权限控制的repository都必须这样做。

clone完后会有个新的目录gitolite-admin,里面有两个文件夹confkeydir,第一个目录中包含的是配置文件,里面就是记录权限配置的地方,第二个目录中则包含所有用户的pub key。

现在我们打开配置文件,按照我们的权限配置需要进行设置

vim gitolite-admin/conf/gitolite.conf

我期望的配置如下,你也可以根据你的需要做更改

@repos_a @proj1 @proj2
@repos_b @proj3 @proj4 @proj5

@team_a @user1 @user2
@team_b @user3 @user4

repo gitolite-admin
RW+ = your-name

repo @repos_a
RW+ = @team_a
R = @all

repo @repos_b
RW+ = @team_b

这个配置很简单,首先定义了两个repository group,再又定义了两个user group,group的好处就是以后添加repository和user的时候,不需要再单独配置,只需加入到对应的group中即可。

  • 添加全新的repository,在上面提到的gitolite.conf文件中配置好对应的名称和权限,再push到server即可,server会自动帮你创建一个empty的bare repository。
  • 如果你已经有一个repository,想把它加进来的话,那就把它拷贝到git server上的~/repositories文件夹里,记得文件夹名要以.git结尾,并且这个repository一定要是bare的,(你可以通过拷贝repository里的.git文件夹,然后运行git config --bool core.bare true,也可以运行git clone --bare your-repository来得到bare repository)。这种方式还有一个额外的操作就是在server上运行一次gitolite setup
  • 移除repository,在配置文件中移除对应的repo,然后push,接着再删除server上对应的文件夹即可。
  • 添加user,把pub key拷贝到keydir文件夹里
  • 删除user,一样,移除keydir里对应的pub key

注意,上面说的操作,都必须在clone的gitolite-admin里做更改,然后push,千万别在server上自己来,那样是没用的,因为这些权限配置、repository管理都有一些额外的操作,gitolite-admin会帮你搞定一切。

把你的更改push回server上,试试clone,pull,push,看看权限是否正确。比如

git clone githost:proj3

更多的内容,可以参考官方文档

本文由Roy最初发表于:http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。


用Debian当路由,来解决BT造成的网络慢的问题

自从@TimothyYe 童鞋介绍偶加入HDC后,为了快点完成新人作业,也为了满足我不折腾不舒服斯基的欲望,哥配了一台凌动小PC,Intel ATOM D525NW的主板,集成了CPU和显卡,加上小机箱总共700元。到手后,插上我Thinkpad拆下来的2根1G内存和另外一台闲置N久的台式机160G SATA硬盘,装了个Debian,就可以用了。

装上transmission后,全速挂BT无压力,比那些直接路由或者1、200的NAS给力多了。哥还继续在上面折腾了Git,emule,动态DNS等,远远没有把2G内存榨干,当然这里都说远了,继续回来。

我家使用的是电信ADSL,一个宽带无线路由,手机,notebook,iPad,PC,xbox等(哥真败家。。。),路由拨号连入Internet,然后通过WIFI把其它设备连入LAN,共享外网连接。这个配置在我挂PT之前一直工作正常,可是当我把BT开着,就算上传和下载速度都为0,LAN中的其它设备访问Internet的速度一样很慢,很慢。

分析了下,估计是我那100元的低端无线路由无法支撑如此多的连接会话造成的,简单直接的办法就是升级路由,于是开始上网查高端路由,不查不知道,一查才知道这东西好贵,便宜的怕是不能解决问题,贵的哥又承受不了。纠结了N久,最后发现,何不把我那台Debian来做路由呢?

马上在淘宝买了根20元的USB有线网卡,收到后插入Debian上,这东西不像Windows和MAC可以自动识别出来然后提示你安装驱动,要自己去折腾,而且附送的光盘上也没有Linux的驱动,看来,要找Google了。

安装配置USB网卡

在Debian上运行

$ lsusb

Bus 005 Device 002: ID 0fe6:9700 Kontron (Industrial Computer Source / ICS Advent) DM9601 Fast Ethernet Adapter

从上得知,USB网卡是DM9601这个型号的

$ /sbin/ifconfig

只有lo和eth0,新加的网卡没有识别

以DM9601为关键字,Google,找到了这里,下载解压好linux的驱动后,编译出错,好像是头文件不对,哥不会写驱动啊,只有继续Google,发现DM9601的驱动已经集成在新版的内核里了,但是我试了下,用不了,不知道什么原因。继续Google,又找到了这里,根据上面的说明,下载了qf9700的驱动,编译,成功,生成文件qf9700.ko。

安装刚才编译好的驱动

# cp qf9700.ko /lib/modules/`uname -r`/kernel/drivers/net/usb
# cd /lib/modules/`uname -r`/kernel/drivers/net/usb
# modprobe usbnet
# insmod qf9700.ko
# ifconfig eth1 up

配置好驱动后再运行

$ /sbin/ifconfig

多了一个eth1了,到现在新网卡已经可以使用了。

安装配置ADSL拨号相关软件

把原先连接无线宽带路由和猫的网线拔掉,接在猫和Debian的USB网卡上 安装拨号软件

# apt-get install pppoe pppoeconf

成功后运行

# pppoeconf

会弹出一个窗口,自动检测连接ADSL的网卡,然后照提示输入你的用户名,密码,其它的可以用默认值。

运行

# pon dsl-provider

就可以拨号了,过后再ifconfig一下,会发现多了个ppp0。poff命令可以关闭ppp0连接。另外,我发现多次拨号可以有多个ppp,比如ppp1,而且IP还不一样,不知道这样是否可以让带宽double,待测试。

此时Debian可以上网了,但是LAN中的其它设备还不行。

设置LAN路由

设置Debian连接LAN的网卡配置

# vim /etc/network/interfaces

allow-hotplug eth0 iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 network 192.168.3.0 broadcast 192.168.3.255 gateway 192.168.3.3

由于所有的无线设备都是有无线宽带路由来DHCP的,所以登录无线宽带路由,把配置改下:

range 192.168.3.100-192.168.3.200 netmask 255.255.255.0 gateway 192.168.3.3 dns 8.8.8.8 or 4.4.4.4

DNS没有用电信分配给我的,是因为不想看电信强行插入的广告

设置NAT

# echo "1" > /proc/sys/net/ipv4/ip_forward
# /sbin/iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.3.0/24 -j MASQUERADE

至此LAN中的其它设备也可以上网了,如果还不行的话,检查下你的配置是否正确,然后再看看路由表,把错误的路由改掉。

最后,我家网络的结构如下图

home network

// TODO: 此文还需添加Debian重启后自动配置USB网卡,拨号,NAT的内容

本文由Roy最初发表于:http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。


更快的,更好的支持硬件的模拟器

原文:http://android-developers.blogspot.com/2012/04/faster-emulator-with-better-hardware.html

[This post is by Xavier Ducrohet and Reto Meier of the Android engineering team. — Tim Bray.]

Android模拟器是开发和测试Android程序的一个关键工具。目前Android设备的功能以及多样性发展的日益迅猛,模拟器要跟上步伐十分的困难。

今天我们激动的宣布,模拟器做了一些十分显著的改进,包括激动人心的性能提升,众多硬件特性,尤其是传感器和多点触控的支持。

加入GPU支持

今天我们发布的系统镜像内置了GPU支持(Android 4.0.3 r2)。Android日益依赖GPU来提高性能,所以新模拟器的差异十分显著。在下面的视频中(需翻墙才能看)模拟器依旧翻译着ARM指令(运行模拟器的宿主系统一般是x86平台,此镜像是ARM平台的,所以中间存在着ARM->x86指令的转换。之前没有GPU支持,运行如此高分辨率的模拟器并不流畅);GPU可以让性能提升不少。

一个额外的红利,我们现在已经支持OpenGL ES 2.0了,所以你的OpenGL游戏可以在模拟器中运行了。

请注意的是,目前有很多种的GPU,我们并没有用所有GPU对这个beta版的模拟器做测试,所以,如果你有什么意见或者遇到了什么问题,请联系我们

模拟更多的硬件特性

移动设备的硬件特性是一个开发平台的重要组成部分,所以我们也高兴的宣布,除了去年加入的摄像头支持,现在还可以使用一个绑定的Android设备来支持传感器和多点触控了。

我们还在为模拟器支持更多的硬件特性,包括蓝牙和NFC(近距离无线通信),而努力。

优化的CPU性能

我们同样也优化了Android模拟器的CPU性能。硬件浮点运算操作在冰淇淋三明治版本(Android 4.0)之上的版本中有效,它让模拟CPU操作大概快了2倍。

上一周,我们发布了包括x86系统镜像和主机驱动程序的Android开发工具r17版本,可以让模拟器使用x86指令执行,大大提高了执行效率。

下面这个视频显示了两个CPU相关的程序,一个有虚化(virtualization),一个没有,在两个运行着相同系统镜像的模拟器上运行的情况。(同样需要翻墙)

构建一个现代化的模拟器

因为Android平台允许应用程序和系统组件之间的深层相互操作,所以我们必须提供一个有着完整系统镜像的模拟器。我们的模拟器虚拟了一个完整的设备:硬件,内核,底层系统库和应用框架。

当然,系统一般被虚拟为ARM CPU的设备;之前,我们用软件来虚拟这些指令,它一直工作的不错,直到包括更多动画和更加复杂的Android 3.0的到来。

我们缺少的是Android x86的支持,和上周r17版本的SDK工具中的GPU支持。把模拟器的OpenGL ES 2.0指令传给宿主操作系统,转换成标准的OpenGL 2.0,然后用宿主GPU来执行,这样模拟器就支持GPU了。

总结

Android生态系统有着很多的来自不同厂商的设备。开发人员需要一个不用买设备就可以测试程序的途径。同时一个快速的,更真实的模拟器有着极大的帮助。

我们希望这些新的优化能够让模拟器在你的开发和测试过程中更加有用,同时期盼能进一步的为你优化它。

本文由Roy最初发表于:http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。


当ListView有Header时,onItemClick里的position不正确

今天在做项目的时候,遇到一个问题,记录下来。

当给ListView加了一个HeaderView后(代码如下),我们发现,onItemClick方法里的position参数的值不是我们所期望的,比如点击ListView的第一行,我们期望的position是0,可是实际上却是1,也就是说,它是从Header而不是从第一行开始计数的。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.home);

    mAdapter = new MyAdapter(this);

    mListView = (ListView) findViewById(R.id.list);
    mListView.addHeaderView(getLayoutInflater().inflate(R.layout.list_header));
    mListView.setAdapter(mAdapter);
    mListView.setOnClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    doSomething(mAdapter.getItem(position));
}

Google了下,发现有个老外issue过一个bug,和我遇到的问题一样,不过这个bug被RomainGuy reject掉了,理由是,你用错了,请用getAdapter。这回答的太简洁了,完全没法理解,所以只好又去仔细研究ListView的代码,终于领会他的意思了。把其中addHeaderViewsetAdapter方法贴下来

/**
 * Add a fixed view to appear at the top of the list. If addHeaderView is
 * called more than once, the views will appear in the order they were
 * added. Views added using this call can take focus if they want.
 * <p>
 * NOTE: Call this before calling setAdapter. This is so ListView can wrap
 * the supplied cursor with one that that will also account for header
 * views.
 *
 * @param v The view to add.
 * @param data Data to associate with this view
 * @param isSelectable whether the item is selectable
 */
public void addHeaderView(View v, Object data, boolean isSelectable) {
    if (mAdapter != null) {
        throw new IllegalStateException(
                "Cannot add header view to list -- setAdapter has already been called.");
    }

    FixedViewInfo info = new FixedViewInfo();
    info.view = v;
    info.data = data;
    info.isSelectable = isSelectable;
    mHeaderViewInfos.add(info);
}

/**
 * Sets the data behind this ListView.
 *
 * The adapter passed to this method may be wrapped by a {@link WrapperListAdapter},
 * depending on the ListView features currently in use. For instance, adding
 * headers and/or footers will cause the adapter to be wrapped.
 *
 * @param adapter The ListAdapter which is responsible for maintaining the
 *        data backing this list and for producing a view to represent an
 *        item in that data set.
 *
 * @see #getAdapter()
 */
@Override
public void setAdapter(ListAdapter adapter) {
    if (null != mAdapter) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();

    if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
        mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
    } else {
        mAdapter = adapter;
    }

    //其它的一些代码这里省略之...
}

从代码和注释里都可以很清楚的得知,addHeaderView一定要在setAdapter之前调用,如果不这样做,addHeaderView会抛出一个异常。Android为什么要这样?这是因为,在setAdapter的时候,会针对我遇到的这种情况(也就是添加Header后position不正确的这种情况)做些特殊的处理。setAdapter在内部判断了当前ListView是否有Header或者Footer,如果没有,就直接使用参数传进来的adapter;如果有,则用一个decorated的HeaderViewListAdapter来替换参数。这个HeaderViewListAdapter的使命,就是排除Header和Footer,让position(当然也包括getItem, getItemId)等方法的position参数)正确返回。

分析到这里,解决方案就出来了:在onItemClick不要直接使用我们声明的adapter,而是用ListView里的那个decorated adapter。获取它的方法就是调用parent.getAdapter()。当然,如果ListView没有Header和Footer,直接使用声明的adapter也没有问题,不过为了避免出错,还是统一使用decorated adapter比较好。

把onItemClick改成下面这样,就可以了

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    doSomething(parent.getAdapter().getItem(position));
}

本文由Roy最初发表于:http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。


如何提升Android手机电池的使用时间

很多朋友抱怨Android手机耗电恐怖,其实我刚入手我的i9003的时候,也被他恐怖的耗电量吓了一跳,睡觉之前还是60%,第二天早上起床却发现手机已经耗尽了所有电量,自动关机了。其实这也不能完全怪Android,它耗电在于几个方面,同样还是和ios做对比:

Android和ios的体制不一样。ios实际上是一个单线程系统,程序只能在前台运行,进入后台后就已经是睡眠状态了,只能通过apple的API来进行推送,这就是iphone qq超级难用的原因。而android就是一个纯粹的多线程操作系统,程序完全可以在后台正常运行,这样的代价自然是会多耗费一些电量了。

Android程序普遍上来说比起ios的质量要差一些。Google为了在数量上尽量追赶Apple AppStore,所以在Android Market的准入审批上不像Apple做的那么严格,再加上Android开发门槛要比ios低的多得多,自然造成了Android程序质量普遍偏低。很多程序未充分考虑以及测试在电量上的消耗,如果你正好安装了这些程序,那么电池电量消耗过快也不足为奇了。

那么有什么办法可以尽量提高电池的使用时间呢,我总结了下面几点:

  • 安装质量高的程序。安装前到网上搜索下别人的经验,或者安装后记得监控程序的耗电量(Settings->About phone->Battery use),太高的话卸载找另外的替代品吧或者采取其它措施,比如我发现Talkbox就非常耗电,我什么都没做,也没运行它,它自己在后台就耗了30%,所以果断卸载,换微信。
  • 关掉平常不用的服务。WIFI,蓝牙,GPS,3G这些肯定不会随时都需要使用的,平常的时候把它们都关掉,等到需要使用的时候再打开。
  • 调节合适的屏幕亮度。屏幕是耗电大户,因此调节一个合适的亮度对于提升电池使用时间非常有帮助,在Settings->Display->Brightness里选择一个对你来说合适的亮度,感觉Automatic brightness偏亮了一点。
  • 保持桌面整洁。Widgets别用太多了,这些东西看起来挺小巧,但是他们还是要耗电滴。
  • 禁用同步。Android可以同步日历,邮件,联系人,相册等信息,关掉这个功能也会提高电池的使用时间。Settings->Accounts and sync
  • 经常杀进程。不用的程序杀掉它,别以为你按了Home键返回了,它就会安安静静的呆在后台,有些程序不会这么乖,他们可能会同步数据,会联网尝试更新,所以,不用了就kill them,很多软件可以方便的让你批量杀进程,比如我用的Advanced Task Killer,感觉还不错,免费软件。
  • 不要用动态墙纸。动态墙纸看起来挺炫,但是肯定要占用CPU资源的,低调点,静态的墙纸还是有很多好看的。
  • 手机放在常温的地方。过冷过热都会影响电池使用时间。炎炎烈日下面暴晒的车车中,太恐怖了,为了你也为了手机,开空调吧。

这里特别说明下,上面有些方法过于极端了点,手机本来就是拿来使用的,如果你把所有功能都关掉,那自然最省电,但是这还叫手机吗?根据自己的情况做下适当的优化,这才是最好的。

另外,如果你还有其他办法补充,欢迎留言分享给大家。


升级我的I9003到2.3.4

忍不住手痒,把我的i9003升级到了Gingerbread(Android 2.3.4),在这里把我的升级过程写下来,希望对大家有点帮助。

  1. 这里下载最新的2.3.4的firmware,压缩包的解压密码是samfirmware.com。
  2. 运行Odin3_v1.83.exe。
  3. 选中Re-Partition,Auto Reboot和F. Reset Time三个复选框。
  4. 点击PIT然后选择latona_20110114.pit文件。
  5. 手机关机,然后依次按音量向下键(按住不放),Home(按住不放),电源(按住不放),过几秒手机会显示一个绿色的机器人在挖东西,这就是传说中的挖煤模式,学名download mode。
  6. 用数据线连接手机和电脑,如果需要装驱动请耐心等待驱动安装完毕。然后odin会识别手机的COM,显示在界面上,我的是COM9。
  7. 点击Start按钮。
  8. 完毕后点击Reset按钮,这时程序会自动取消Re-Partition复选框。
  9. 点击BOOTLOADER按钮选择APBOOT_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar;点击PDA按钮选择CODE_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar.md5;点击PHONE按钮选择MODEM_I9003XXKP7_REV_00_CL1021949.tar.md5;点击CSC选择GT-I9003-CSC-MULTI-OXAKP7.tar.md5。
  10. 扣掉电池,按照第5步的方法再次进入挖煤模式。
  11. 点击Start按钮,然后不要动,直到看到绿色的PASS。
  12. 启动手机,此时就可以正常使用了,但是相机还用不了,黑屏,解决方法是按照上面的步骤再刷一次,就可以了。

升级后的一些感受:

  • 虽说不是稳定版本,但我觉得还是挺稳定的。
  • 界面有所变化,但是区别不大。
  • ROM很干净,没有太多预装的程序。
  • Local setting里没有中国,但是并不是说不支持访问中文网页,安装中文软件,以及发送接收中文短信,只是说手机的界面是英文的,并且某些显示的风格也是按照英文的文化来的,比如说号码的分段方式。
  • VPN依然不能使用,哎。

2011/7/3 Update: I9003XXKP7貌似和微信有点冲突,经常在待机情况下无法唤醒机器,只有拔电池重新开机。目前我已刷至最新的I9003XXKP9,再当一次小白鼠。 2011/8/20 Update: 目前最新版是I9003XXKPH。

经过我的测试,I9003XXKP9已经可以连接VPN了,哇哈哈哈哈!


我的第一个android手机

之前的DOPOD C858用了快3年了,受够了windows mobile的系统,更要命的是还没有WIFI,正好前段时间实在是不想开车,所以一咬牙在京东上买了三星的I9003,好让自己在公交车上有玩具可以打发时间,也终于了了想要一个android的心愿。

现在用了差不多一个多星期了,有点心得,老婆有部iphone 4,我正好做做比较。

  • 外观,I9003就是个山寨iphone,一个大屏幕下面就只有一个Home的物理按键,放一起两个还很真像。
  • 手感,I9003拿在手上,塑料感比较强,轻飘飘的,像玩具;iphone 4有棱有角的,正反面的玻璃加上侧边的金属框,手感要好得多。
  • 操作系统,三星对android做了定制,图标的排列、短消息等和ios非常像。android稳定性不如ios,才用了一周就死过几次机了,ios几乎不死。
  • 程序的数量和质量,ios要好得多得多,安装与更新也比android简便。
  • 屏幕效果,我的I9003是Super clearLCD,感觉和iphone 4的Retina屏差不多,但是仔细对比,显示的细节和层次感还是不如Retina。
  • 电池,都很悲剧,一天一充,玩的多就一天两充。
  • 与Google服务的集成,我是google fans,深度依赖google的很多服务,比如gmail, gtalk, calendar, docs, maps,android作为google自家的产品,兼容性自然不用多说,就这一点,爽
  • 价格,I9003便宜将近2k,性价比还是很高的,苹果的东西,品牌就要值很多钱的
  • 照相,不清楚,没比较过

总体I9003性价比还是挺高的,我很满意,但是有一个致命的问题,悲剧的I9003连不上VPN,我试过PPTP和L2TP IPSec PSK,iphone 4和win7都可以连上,就我的I9003不行,原因不明,悲剧啊悲剧啊


Hello VPS!

又开始整wordpress了,但是这次不同的是,我整了个vps,不像以前的虚拟主机了。Linux很不熟,看来要耍的转,还要多学习呀。