Android是一个好的选择么?

出处:自己的blog http://www.evan129.com/2009/03/01/android-是一个好的选择么/

还是草稿版本,可能不少bug,待修改完善

前两天在Cnbeta上看到一篇文章 《Symbian:Google Android开源只是幌子》,我是有同感的。前阵子给一家国外运营商做关于定制Android的咨询,顺便就仔细想了下这个问题,加上在水木 MobileDev版的讨论,打算总结一下问题。不过这个坑比较大,估计会有很多拍砖的。

首先从用户角度看,Android有什么优势呢?Google的业务吧,好用的GMail客户端,和Google帐户同步联系人,日历。但是Google 最近发布了其它几个手机平台的软件,也支持了类似的功能。从硬件角度来看,我觉得至少目前仅有的一款G1体验是不如iPhone的,屏幕表现,操作手感都是不如的。优势是多了一个实体键盘。作为Palm Treo的fans,我是不太喜欢侧推键盘的。对于普通用户来说,虽然有了实体键盘,可是至今的官方升级中还不包括软键盘,输入操作都必须推开键盘才可以,这点很不方便。而对于中国用户来说,字体只支持到GB2312,很多字显示成方块。没有中文输入法,即使复制中文字进短信程序,发送后对方也显示不正常。所以不得不用第三方的短信程序。再说价格,标榜为免费的开源的操作系统,android的手机真的便宜么?德国刚上的G1非签约价是499欧。价格上面并没有体现出什么优势来。

从开发者角度来看。如果你只是一个开源爱好者,喜欢研究研究这种大型项目,看看代码,这个长处我是不否认的。如果你是靠写代码过活的,那我们来看看。我觉得一个很大的优势是,Google学习Apple推出了Google Market。这无疑将可能是一个赚钱的好途径。不过收费项目才上来两周,不好说情况怎么样。但是我个人预期,它是远不如iPhone平台的。

首先,用户群不同。Apple从来都有较好的用户群,相对来说更愿意花钱。就好像Mac上程序一般都体积很大,但它的用户不像windows用户会去抱怨开发者,而是会考虑是不是该升级成更大的硬盘。简单的说,Apple fans更偏向于怎么从非技术角度考虑,让事情尽快解决,那么,花钱能解决的问题大约就不是大问题了。何况升级点小硬件,买个小软件也不是什么大钱。相反的,Google fans大多比较geek。对技术有追求,哪天发现Google搜索不如百度好用了,这个例子可能不好,或者说出了个什么更先进点的搜索,立马会换过去,还会作为一个新发现介绍给朋友。就好像曾经Google搜索本身就是口口相传推广开的。Apple则看重品牌些。对于新出的apple产品,甚至没见过,就会想买。就是说,google本身的用户粘性不太好,只是gmail一类应用,由于用户数据在上面,是用户自己的数据把自己缠上了而已。另外,这个用户群,都多少有些技术,或者说IT方面的知识背景。于是,这些用户可以更容易的去获得盗版,破解。iPhone限制相对比较死,还得先破解下机器才能装破解的软件。Android是支持从电脑上直接装的。

说完用户群,再讲竞争关系。这其实是我第一反应想到的。Google吸引了更大一批编程爱好者,Android有更容易上手的开发环境以及需要更少的基础知识。Objective-C再简单,对大多数人来讲,也是一门新语言,Java是很多学校的基础课,Java开发者满大街都是。新手写软件,一般都是免费的。所以Android上会有大量的免费软件。曾经我做Palm上的开发,入门时也写了不少免费软件,渐渐的,有了基础后,开始做一些收费软件。这个圈子里,能做这个的不算多,所以开发出的软件能够有市场。作为新手,学写软件其实有个目标最重要,我建议,并且相信不少人的想法也是,找个现有的软件,做个一样的出来。人家要是也是免费的,可能你会觉得做的意义就不大了,所以不如找个收费软件,学着做个免费的出来,这样至少有不少人捧捧场,鼓励下,就更有动力继续了。可是Android上,会有源源不断的新手加入进来,它的门槛实在太低,至少它没要求你必须先买台苹果电脑才能做开发一样。而且吧,Google吸引的开发者中,本身就很多喜欢开源精神的,我不能说这不好,但我个人不喜欢的。培养整个群体对软件应当收费的认识,作为一个开发者,你自己做的软件去收费才心安理得。其实这对用户也不好。比如出现了一大堆练手的做的理财软件,功能都不是非常完善,但都凑和能用。不少用户会退而选择免费软件。于是,真正做好的软件的开发商相对来说收益就有减少,可能继续开发动力也不大。这是一个恶性循环啦。

有人说,平台完全开源,于是不会像微软和Apple那样,保留很多内部API不对外开放。我要说,你一定是不够了解Android。Android有大量内部包和内部类,打了@hide标签,于是不在最终SDK中出现。这些API你当然可以看到,因为它是开源的,可是你又用不了。不信你去看看 com.android.internal开头的包。内嵌的程序有用这些API,你用SDK时是不能使用的。人家的理由也很正当,这些API可能随时会变,你去使用这些是不稳定的,所以干脆不让你用好了。说到这里,顺便说下,这个平台的更新过于频繁,G1上市也谈不上很久,RC15, RC29, RC30, RC33一堆升级包出来了。确实每次都可能伴随着内部类的变化,让你也不敢去使用。还不如WM每个版本稳定好一阵子,那些偷偷发现的未公开类也可以放心地使用好一阵子。有些未公开类,M$知道大家用了,为了兼容性,不得不在以后版本也保持兼容,而不去改动接口。Google冠冕堂皇地说,这些API本来就公开了,也说明将来会变的,早说你们不该用。理由看起来还更充分一些。

那么,平台开源了,API实现都能看到了,至少对开发更有帮助吧?不见得。你是更愿意有好的文档和示例清清楚楚写明用法呢,还是打算自己去看源代码自己了解下怎么使用呢?Google的文档远比不上MSDN的。光看TextView的文档,看setText的API说明,你能猜到这个东西竟然是支持文字着色,字体改变,加链接,甚至能在TextView中嵌入图片的么?而且,不是谁都有时间去研究那一大堆代码的。很多情况下,大家不过也是打打工混口饭吃,老板给个活,按要求完成就行了。本来不外乎看看文档,调用下API,能跑了就交差了。这下好了,文档看不明白,只能去看看怎么实现的了。Android还真是个大项目,不说底层和native c lib部分,光Java framework要有个了解,也得先研究两天。不是说程序员就得是技术爱好者的。

然后,说说Android平台本身。开源不等于开放。就我感觉来看,智能平台上,除了blackberry,估计就android限制最多了,可能用词不准确,因为人家不是故意限制,就是没有设计能让你去做到而已,反正意思就是你能做的事情被限制住了。iPhone虽然提供的接口也限制很大,但至少在越狱后,用第三方的头文件,还是可以做到的,并且确实也有不少用户是越狱过的。比如说中文输入法就一度(我不确定现在行不行)在原生iPhone上是安装不了的。举例来说吧,如果是一个非当前前台的程序,你没有能力去得到整个屏幕的句柄。于是很常见的来电归属地功能就不太好实现。Palm, Symbian, WM上人家都可以直接获得系统的Window,直接绘制个字符串上去,android上说,这有安全问题,从来没有打算让你这么做。再比如,WM和 Symbian的Idle screen,就是桌面啦,WM上叫Today的那一屏,都是支持plugin。Android的Launcher就不支持,也不支持html widget应用,现有的那个虽然有添加widget,但那都是内置写死的小控件。这点上来说,应该不是故意不让你实现,估计是人家自己都没想到好的解决方案吧。虽然Intent机制可以实现大多plugin功能,但是这种需要自己处理绘制,用户操作事件的,就是想内嵌一个View进另一个程序的,目前好像还没看到解决方案。更不用说,我一直很喜欢的Palm上的“开放性”,你可以处理全局所有的用户事件,拦截处理掉本该给其它程序的事件,这样可以做出很多扩展功能来,像DA一类增强性的,都有点像hack了系统一样。Android有它的安全性考虑。安全性和扩展性大概是有点矛盾的吧。只是,限制得这么死,我觉得开发者的乐趣就少了很多。一般印象中,开源的产品,你觉得不满意,当然可以自己改。作为开发者,你拥有所有代码,你当然可以改,把上面说到的功能点都按自己期望的给做出来,改完后编译出新的ROM烧到自己机器上。可是这只能是给自己玩的而已。难道想发布一个绘制屏幕的来电归属地,就需要让用户自己刷一次机器?

前面说了,对于Java开发者来说,Android入门的门槛很低。但会是一回事儿,做好是另一回事儿。如果你已经熟练使用Java,并且深谙OO(面向对象)之道,那么,你需要好好改改习惯,看看android performance best practice,很多优化是反OO的。比如说,建议你最好直接访问对象的值,而不是用getXXX, setXXX这种方式。那么,如果你熟练了android开发,但按它的思路做,找新的非android开发的java职位时,也得重新准备准备,不然可能过不了笔试面试的基础知识关。

Google的SDK是Java sdk,虽然完全开源了,但仍然没有提供方便的写jni,以及native code lib工具。Google说,那是不需要的,你用Java写应用程序就好了。事实上呢?听说前阵子内部开发分支上的英文输入法,原来是纯Java的,最近一次更新,也改用jni实现了。还有据说,Google打算出个编辑txt文件的记事本工具,也打算用jni实现。说明android里的java效率也不是那么好的。当然,如果你只是一个很普通的应用,应该是可以接受的。曾经android刚出来的时候,有个Quake游戏运行的demo也很有名,事实上,那东西里主要还是c代码。

再来看看运营商和制造商。一般的,运营商要求也不是很多,改个主题显示下品牌,加点自有的服务进去就行了。不幸的,android连主题都不能支持,WM, Symbian一直以来都是支持的。为了改变android的主题,还需要改framework,缺点后面讲。加点应用程序一般不是什么问题。但像HTC 做WM,把很多内置程序也换了,像电话本甚至浏览器。不得不说,android这点也是不如WM的。Google07年刚发布Android时,介绍就说,你可以替换任何程序,电话本,桌面,等等。事实上,对于手机制造商和运营商也确实是有这个能力。但是Android老是升级,变化又大,这些内置的程序和系统关联大。每次系统升级,都很有可能会伴随着这些程序的变化。如果厂商自己做了更改,就需要不停地有人去维护这些代码,保持和最新android的兼容。即使merge code的工作量谈不上很大。但是作为一个大量发布的产品,是需要严格的测试的。那么,有的厂商用原生的android出的系统,比如G1,如果你改了很多程序,虽然google新的代码有可能会同时提供给所有厂商,但是你就多了merge code和测试这部分工作,少说也要一两周。那么,你的新rom的发布就会比其它厂商慢。而前面也说过,android的用户是比较geek的,有追新软件一类的癖好,久而久之,用户就可能不喜欢你这种方式,转而用原生的android系统去。前面说的,运营商想改个主题要改framework也是一个道理,这种改动,是需要经常的和google merge code,紧跟发布的。还有点不是很相关的是,因为android开源,所以大佬们都会以为是自己的好机会,目前知道的,个别运营商和制造商都有打算在自己发布的android机器上放上自己的app store。那么,作为开发者来说,你们有得忙了,乐观点看,只是要在不同的平台上发布自己的软件,更糟的情况是,可能各家的SDK都有点变化,你还需要为各款机器做兼容性测试,就像非业内人士都误信j2me可以很好跨手机平台,事实上,几乎要为各款机器做点改动,适应不同分辨率一类的问题。

还有点,android至今仍不是很成熟。一月的新代码里,短信程序才支持发送中文字符,至今官方升级还没有软键盘,更没有输入法框架,做不了输入法。 CDMA分支也在开发中。作为厂商,比如你想出款CDMA机器,或想出款适合中国人用的机器,那么你就需要对系统内部做不少改动。那么你将来有长期地维护工作,merge code,以便和android保持兼容。更糟糕的情况可能是,比如你自己费了半年时间,加进了CDMA支持,后来google也终于完成它的cdma支持了,那你打算直接用它的代码,还是维护自己旧的呢?目前看起来,甚至连OHA成员提交的代码merge进主分支都很困难,这也是说android开源不开放的一个原因。

讨论部分完毕。那么android开源了,怎么去利用这个好处呢?而且它的授权协议很好,是Apache license,你改了也不用必须再开源。曾经,大家都认为这是山寨厂商的好机会。现在想来,其实不是。Android怎么说也是智能平台,对硬件配置要求不低,一般来说,成本不可能低于一千。那么,这就和传统的山寨厂商的目标群体的接受度不同。大家觉得android对山寨厂商利好,无非是觉得这个平台免费,成本可以压低。事实上,国内的山寨厂做Windows Mobile的机器时,也是不交钱的~而真对于大厂商的好机器来说,对最终用户手上,一款三四千的机器,相差这么两百块钱授权费用,用户又不知道是哪里省出来的,也不是非常在意的。大厂商为了保持和android官方版本兼容性,也不敢大改动。我曾经有个想法就是,反正山寨厂商也从来不在意什么协议。拿android改个好用点平台出来,多加些内置软件,就算不发布SDK,不再支持第三方程序,也会受欢迎。比如说,android上有好的浏览器。山寨厂商可以完全把界面改得和iPhone一模一样,现有的仿iPhone机器大多基于MTK一类,由于平台本身比较弱,也学不得很像,比如那个浏览器就学不来。Android自身又由于苹果专利,没有在G1上打开多点触摸支持,山寨厂可以不管这些。不过现在看来,可惜受限于前面提及的成本问题,估计用户也没兴趣了,何必花一千多买个没扩展性的机器呢。

总的来讲,我是唱衰android的。

更多讨论,移步http://bbs.ifanr.com/viewthread.php?tid=1138&extra=page%3D1