Android架构和特征
千呼万唤始出来,犹抱琵琶半遮。 — 《琵琶行》
虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的手机平台竞争中,充其量也就做几个俯卧撑打一桶酱油,然后被落的远远的。说到底,出来混,靠的还是技术。
架构
从SDK文档中,偷来一幅Android平台的架构图,如上。在整个架构最底层红彤彤的部分,是Linux Kernel在移动平台的一个移植,它隐藏了硬件、网络等相关的细节,为上层提供了一个相对纯洁的统一接口。除非要做的是Android到不同设备的移植工作,否则对于大部分普通开发者而言,基本上是远观而不必亵玩的。Google一直强调,Android的底层实现异常NB,可移植性超强,暂没有功夫研读,实属遗憾。
靠上一层,是一些核心的和扩展的类库,它们都是原生的C++实现。在这一层,你可以看到很多熟悉的面孔,一如SQLite、WebKit、OpenGL,开源的力量与贡献由此可见。如果,该层类库需要被上层函数调用,就必须要通过JNI的导出相应的接口函数,否则就只能在层次内部自个把玩。
也是在这一层次上,还有为上层Java程序服务的运行时。Dalvik虚拟机,是Android的Java虚拟机,之所以不采用J2ME的虚拟机,一方面是因为J2ME的设计是为了低端机器而优化,而Dalvik则是为了高端一些的机器进行优化,提供更好的性能。另一方面,从商业角度来看,必须绕开J2ME虚拟机,Android才能彻底解放,想怎么开源就怎么开源,不再需要考虑License的问题。
再往上,终于有Java出没了。首先是框架层,这里包含所有开发所用的SDK类库,另外还有一些未公开接口的类库和实现,它们是整个Android平台核心机制的体现。
而在最上面,就是应用层了,系统的一些应用和第三方开发的所有应用都是位于这个层次上,也许要纠结两者的差别,就是系统应用会用一些隐藏的类,而第三方的应用,总是基于SDK提供的东西来搞。
一般来说,Android开发,就是在SDK的基础上,吭哧吭哧用Java写应用。但自从有了NDK,一切有了写小变化。NDK的出现意味着,最上面应用层的内容,可以穿越Java部署的框架层,直接和底层暴露出来的,或者自行开发的C++库直接对话,当然在这些库中需要包含JNI的接口。
人说,这就不是Android也可以用C++开发应用么,但其实,这样的说法不够确切,纯C++应用,是无法被接受的。因为在Android中,大量的核心机制部署在框架层,它们都是用Java实现的,比如控件库,Activity的调度之类的。因此,没了界面,没了调度,还是只用C++做类库比较合适,否则一切都乱了套了。
特征
基于这样的架构,Android有很多的设计显得很有意思。纵览整个SDK和核心机制的设计,工整漂亮,是Android给人的第一感觉。为了说明这一点,找一个反面教材是很有必要的,Symbian同学毫无悬念的担当这个伟岸的角色。
写Symbian程序,感觉就像是在玩一个猜谜游戏。哪怕你是一个Symbian老手,当需要用到Symbian中某块陌生功能的时候,你可能依然束手无策。你往往需要猜并反复找寻,在这里我需要使用哪一种奇巧淫技呢,是该臆想某些事件,还是应该用一个神秘的UID寻找某个特定应用,诸如此类。
而做Android应用的时候,就像是做高考模拟试题,题看上去不一样,解答模式摸清楚,就一通百通,一了百了。监听某个系统事件,查一下SDK就好;访问某个应用的数据,看看它有没有提供Content Provider就可以。所有的一切,都是按套路出牌,只要你了解了套路,再陌生的牌也可以看得懂,出的顺。人说武林高手,都应该是无招胜有招,而一个好的应用框架,也应该做到举重若轻,可触类旁通。
而Android框架最文采飞扬的一点,就是引入了Mash-Up的思想。所谓Mash-Up,就是把写应用搞成搭积木,要出效果的时候,东家一块西家一块现场拼起来就好。这里面关键有两点,一个是模块化,另一个就是动态性。所谓模块化,就是一个应用的功能要明确的被封成一个个边界清晰的功能点,每一个功能点都像是一个黑盒,由预先定义的规则描述出其交互方式;而动态性,就是这些独立的模块能够在运行的时候,按照需求描述,连接在一起,共同完成某项更大的功能。在这两点上,Android都做得非常出色。
站在可Mash-Up构造应用这一点去看其他的一些Android中的核心功能设计,就显得很有章可循了。比如为什么要把文件私有化,为什么要让进程被托管,等等(当然也可以站在别的角度看出不同的效果,视角不同,视野自然不同…)。
在UI机制方面,Android也有很不错的表现。它采取xml格式的资源文件,描述所有界面相关的内容。资源文件不是什么新东西了,xml格式也是老调重弹,但可贵的是Android做的更为的丰富和彻底,基本把界面相关的逻辑,全部从代码中剥离到了资源文件中,和Symbian那四不像的资源文件相比,真是强大了不知多少倍了。
Android学习入门
不积跬步,无以至千里。 — 《劝学》
开发环境
辣手摧花成性的GFW,无情的把Android开发者官网关在了墙外。不过没关系,猛击这里,同样可以殊途同归(Shit,一直在用代理,刚试了下,发现竟然也被盾了,如果不行,那就只能翻墙了…)。
如果旅途顺利,你可以在路径sdk/index.html下找到安装说明,成功配置好Android的开发环境(【注】:在以后,如果要给开发者页面上的链接,都会给一个像sdk/index.html这样的相对路径,你可以在前面加上官网地址,或者本地SDK的doc地址拼凑成完整的路径,在一个盾牌横行的朝代,只能用这样委屈求全的方法保证能更好的使用…)。
在2.0之前,每一次版本更新,你都要自己去下个全新的SDK,然后按照说明,小心翼翼的一步步修改eclipse的设置,甚是麻烦。在2.0后,这个模式有所改善,你会先下到一个类似于下载器的插件,通过它可以来管理和升级SDK,不仅简化了整个升级模式,还使得你可以更好的在各个不同的SDK版本间游走,利国利民。
Eclipse + ADT(Android Development Tool),是正牌的Android开发环境。你可以在Windows,Linux,Mac下做开发,甚为自由。比之Symbian的开发环境,ADT显得尤为强大,它对SDK提供的一堆优秀的命令行工具进行了UI上的封装,提供了图形界面(命令行控当然同样幸福,具体参见:guide/developing/tools/index.html)。通过ADT,你可以用运行和管理模拟器,使用调试器进行调试,过滤和查看Log,浏览模拟器上的文件信息,模拟拨号、短信等手机才有的事件,等等。
文档
我知道,有很多人在学习一个新平台开发的时候,都习惯去买一些《xxx 21天精通》之类的书籍。但其实,最好的入门学习资料,就是SDK文档。因为只有做平台的自己,才能最了解平台中的各个玄机,各方面的轻重缓急,从而能够更好的对症下药药到病除。
在Android的SDK中,guide/index.html是由浅入深的教学文档,reference/packages.html是标准的API文档。对于教学文档,我的意见是,一字不拉的通读一遍甚至多遍,至少做到能对Android摸着头脑,并且碰到问题的时候,能够快速想起在哪里可以找到,回来深刻阅读。
而API文档方面,Android做的算是还不错了。基本上每个类,每个接口,都有标准而详尽的说明,在一些尤为重要的类中,还具有大量的学习性的内容,不和Symbian似的,有太多的太监类,只有光秃秃的一个函数,一行文档说明都没有。整个文档结构是按照Java包来组织的,本身Java包命名的结构性和可读性很强,找起来也颇为方便。
很多人对SDK文档有抵触情绪,我想,有两方面的原因。一则是SDK文档普遍缺少文学性,麻木不仁的八股文,难以下咽。Android在这方面做得算是乏善可陈,虽然算不上文采华丽,但还是挺适合阅读的。另一则,就会是语言方面的原因了。SDK文档多为英语,偶尔像MSDN这样有中文的,也停留在机器翻译的水平上,阅读起来颇为难受。特地在网上搜了下,找到一些翻译SDK的中文文档,比如这里。虽然是基于1.5 r1版本SDK所著,稍显过时,但翻译的还是有小用心的,作为辅助,也不失为一份好资料,特代表广大看官向这些为人民福利着想的同志致敬。
Tutorials
光说不练假把式,除了读,在入门阶段,写也是一项不能少的运动。同样是在SDK中,Android提供了一组Tutorials和一些列的Samples,详见:resources/index.html。
Tutorials很简单,Hello World只是在教你如何在eclipse中,在ADT的帮助下,创建一个Android项目。相比之下,Hello Views复杂了些,它集中展示了几种标准的Android Layout 样式是如何构建的,很多时候,你都是在这些样式下扩展所需的UI。
Hello Localization,是教你如何使用资源的,做完这个,就可以了解Android的资源有多杀~。最后收官的是一个更为完整的Notepad Tutorial,它展示了很多Android的核心机制,比如基于Intent的Activity整合,Activity的生命周期等。迈过这个Tutorial,欢迎你,进入Android的大门。
当然,做完Tutorials,对于Android而言,只是管中窥豹略见一斑。在SDK中,还提供了一系列的Samples。可以根据自己的需求,挑选合适的Sample编译运行和学习。但其中,有一个是不论你做什么,都需要必看必读必熟悉的,就是API Demos。在这个Sample中,集中展示了Android重点功能的API使用,把这个Sample用熟悉,需要做什么的时候过去找一下就可以很快的入手了。
源码
到这里,很多看官一定很不屑,前面所谓的学习入门介绍,只不过是围着SDK打转。其实,事实也是如此,SDK中包含的内容是真的非常重要,我只是期望通过一些简短的介绍,激起一些初学者的重视,如是而已。
当然,SDK每一个平台都有,没什么稀罕的。但Android有另一个非常稀罕而值钱的看家法宝,就是源代码。从Android Source的主站上:http://source.android.com/,你可以获得整个平台的源码以及相关介绍。非常苦口婆心的期望大家都去down一份源码放在机器上,哪怕你不需要进行修改编译,放在机器上当百科全书也是远胜于任何一本Android教学书籍的。本系列文章后续很多内容,都是从源码中学习到的一些浅薄见识。
对于大部分开发者都有学习价值的源码,主要在源码的frameworks和packages目录下。前者包含的是平台核心的一些实现,比如你需要自定义一个控件,也许你就可以翻到一个系统控件的实现中去,看看它是怎么来做的。后者包含一些系统的应用实现,比如你想做个播放器,也许你可以先去参考参考系统自带的是具体怎么做的。这样的实现,即便不算是最华美,至少也是最标准,其价值不容小视。
另外,你也可以把它当个代码库来使,不会使用某个类,grep一把,也许就能获得一份最漂亮的Sample。当然,如果你有时候对某些系统机制表示费解,抑或有一些bug不知道源头在哪,都可以跟着源码顺藤摸瓜的搞清楚。这样的好东西,可不是每个平台都能够享用的。
其他
论坛,其实对于开发和学习都是很重要的资源。毕竟,所有的资料都是死的,只有人是活得,能够最大限度的因地制宜解决问题。
只不过,标准的官方论坛,放在Google Group上,已经惆怅的被盾了。中文论坛方面,没有特别优秀和活跃的,这一方面是由于Android的发展现状还不算很磅礴,另一方面是由于Android的开发相对于Symbian而言,奇技淫巧少了很多,没有那么多好问的。也许你可以去去csdn这样的传统论坛,或者eoe这样专门的论坛。有的时候,还是多少能获得一些帮助的。
书籍方面,真没有什么推荐,豆瓣上搜索一下,你可以看到,目前的书籍,基本上还是集中在SDK使用层面上,很少有解析的很透彻,做的很深入的。而SDK的使用,看SDK的文档就足够了,如果实在对e文不感冒,买一两本评价不太差的中文书籍,放着翻翻也还是挺好。
更进一步,也许可以读读一些经验性的文档,去Google Code上搜索一些代码回来看看。比如,SDK文档中,有个经验性文档的集合:resources/articles/index.html,就可以翻看一下。
最后,更多的一切还需要自己在工程和思考中,慢慢总结。相信,好的代码,会垂青一个勤于动手和思考的人。