摘要: Android架构和特征 千呼万唤始出来,犹抱琵琶半遮。 -- 《琵琶行》 虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的手机平台竞争中,充其量也就作几个俯卧撑打一桶酱油,而后被落的远远的。html
千呼万唤始出来,犹抱琵琶半遮。 -- 《琵琶行》
虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的手机平台竞争中,充其量也就作几个俯卧撑打一桶酱油,而后被落的远远的。说到底,出来混,靠的仍是技术。android
从SDK文档中,偷来一幅Android平台的架构图,如上。在整个架构最底层红彤彤的部分,是Linux Kernel在移动平台的一个移植,它隐藏了硬件、网络等相关的细节,为上层提供了一个相对纯洁的统一接口。除非要作的是Android到不一样设备的移植工做,不然对于大部分普通开发者而言,基本上是远观而没必要亵玩的。Google一直强调,Android的底层实现异常NB,可移植性超强,暂没有功夫研读,实属遗憾。web
靠上一层,是一些核心的和扩展的类库,它们都是原生的C++实现。在这一层,你能够看到不少熟悉的面孔,一如SQLite、WebKit、OpenGL,开源的力量与贡献因而可知。若是,该层类库须要被上层函数调用,就必需要经过JNI的导出相应的接口函数,不然就只能在层次内部自个把玩。网络
也是在这一层次上,还有为上层Java程序服务的运行时。Dalvik虚拟机,是Android的Java虚拟机,之因此不采用J2ME的虚拟机,一方面是由于J2ME的设计是为了低端机器而优化,而Dalvik则是为了高端一些的机器进行优化,提供更好的性能。另外一方面,从商业角度来看,必须绕开J2ME虚拟机,Android才能完全解放,想怎么开源就怎么开源,再也不须要考虑License的问题。架构
再往上,终于有Java出没了。首先是框架层,这里包含全部开发所用的SDK类库,另外还有一些未公开接口的类库和实现,它们是整个Android平台核心机制的体现。app
而在最上面,就是应用层了,系统的一些应用和第三方开发的全部应用都是位于这个层次上,也许要纠结二者的差异,就是系统应用会用一些隐藏的类,而第三方的应用,老是基于SDK提供的东西来搞。框架
通常来讲,Android开发,就是在SDK的基础上,吭哧吭哧用Java写应用。但自从有了NDK,一切有了写小变化。NDK的出现意味着,最上面应用层的内容,能够穿越Java部署的框架层,直接和底层暴露出来的,或者自行开发的C++库直接对话,固然在这些库中须要包含JNI的接口。eclipse
人说,这就不是Android也能够用C++开发应用么,但其实,这样的说法不够确切,纯C++应用,是没法被接受的。由于在Android中,大量的核心机制部署在框架层,它们都是用Java实现的,好比控件库,Activity的调度之类的。所以,没了界面,没了调度,仍是只用C++作类库比较合适,不然一切都乱了套了。ide
基于这样的架构,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的开发,最重要的应该是先把马步扎稳,套路摸清楚,后面的事情就顺当多了。打开怀抱,拥抱Android,也许能够先作下面这些事。
辣手摧花成性的GFW,无情的把Android开发者官网关在了墙外。不过不要紧,猛击这里,一样能够异曲同工
若是旅途顺利,你能够在路径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所著,稍显过期,但翻译的仍是有小用心的,做为辅助,也不失为一份好资料,特表明广大看官向这些为人民福利着想的同志致敬。
光说不练假把式,除了读,在入门阶段,写也是一项不能少的运动。一样是在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,就能够翻看一下。
最后,更多的一切还须要本身在工程和思考中,慢慢总结。相信,好的代码,会垂青一个勤于动手和思考的人。