Android架构和特征
原文地址:http://www.cnblogs.com/duguguiyu/archive/2010/01/23/1654559.html
千呼万唤始出来,犹抱琵琶半遮。 -- 《琵琶行》
虽贵为富二代,但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学习入门
不积跬步,无以至千里。 -- 《劝学》
说,万事开头难。想开始Android的开发,最重要的应该是先把马步扎稳,套路摸清楚,后面的事情就顺当多了。打开怀抱,拥抱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,就可以翻看一下。
最后,更多的一切还需要自己在工程和思考中,慢慢总结。相信,好的代码,会垂青一个勤于动手和思考的人。
发表评论
-
深入Android 【六】 —— 界面构造
2010-04-29 14:58 1149界面构造 原文地址:http://www.cnblogs.c ... -
深入Android 【五】 —— 任务和进程
2010-04-29 14:47 1120任务、进程和线程 原文地址:http://www.cnblo ... -
深入Android 【四】 —— 组件调用
2010-04-29 11:05 937原文地址:http://www.cnblo ... -
深入Android 【三】 —— 组件入门
2010-04-29 10:35 1047Android组件 原文地址:http://www.cnbl ... -
android中Message机制的灵活应用
2010-04-27 09:22 1035android中Message机制的灵 ... -
IntentFilter
2010-04-23 14:01 1169转自:http://www.iteye.com/topic/5 ... -
android 2.0读取联系人
2010-04-22 15:11 971转载自:http://wang-peng1.iteye. ... -
(转)android 短信发送
2010-04-22 11:06 1229原文地址:http://lyp2002924.iteye.co ...
相关推荐
Android系统架构分为多个层次,从下至上分别是Linux内核层、系统库和运行时层、框架层以及应用层。 首先,Linux内核层是Android的基础,它是一个专门为移动设备定制的Linux版本,负责管理硬件资源,如处理器、内存...
《解析Google Android SDK——智能手机开发范例手册》是一本深入探讨Android应用开发的书籍,它提供了丰富的实例,帮助开发者理解并掌握Android SDK的各种工具和技术。本文将基于书中的章节命名,如c3、c12等,来...
《Android系统级深入开发——移植与调试》这本书深入探讨了Android系统的底层开发和调试技术,是Android开发者进阶的重要参考资料。以下将从标题和描述中提取出的关键知识点进行详细阐述。 1. **Android系统移植**...
Android架构和特征千呼万唤始出来,犹抱琵琶半遮。--《琵琶行》虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的手机平台竞争中,充其量也就做几个俯卧撑打一桶酱油,然后被落的远远的。说...
这个游戏源码是学习和研究Android游戏开发的理想资源,它能帮助开发者深入理解Android游戏的架构设计、图形渲染、用户交互以及游戏逻辑等方面的知识。 1. **Android游戏开发基础**:Android游戏开发通常使用Java或...
本资料包“安卓Android源码——安卓Android学习——数据存储.zip”(实际应为rar文件)包含了关于安卓数据存储的学习资源,旨在帮助开发者深入理解这一核心概念。 1. **Shared Preferences** Shared Preferences是...
通过学习《Android系统级深入开发——移植与调试》,开发者可以掌握从底层到应用层的全方位技术细节,不仅能够在实际工作中高效地解决各种技术难题,还能够更好地理解和把握Android操作系统的整体架构和发展趋势。...
【标题解析】 "安卓Android源码——android-times-...通过分析这个开源项目,开发者不仅可以学习如何创建自定义的日历控件,还可以深入理解Android应用的架构和组件化开发,以及如何与其他开发者协作和贡献开源项目。
通过学习和分析这个源码项目,开发者不仅可以掌握如何将Android手机转变为IP Camera,还可以深入了解Android平台上的多媒体处理、网络通信和硬件访问等核心技能。这对于那些希望从事Android应用开发,尤其是涉及...
总的来说,通过深入研究"Android源码——高仿人人Android梦想版终极源码",开发者不仅可以学习到如何模仿和重构已有的应用,还能提升对Android系统底层机制的理解,从而提高自己的开发技能。无论是对于初学者还是有...
电子麦克风在Android系统中的实现涉及到硬件抽象层(Hardware Abstraction Layer, HAL),这是Android系统架构中的一个重要组成部分。HAL使得上层软件与底层硬件之间保持松耦合,确保了跨不同设备的兼容性。在...
【标题】"安卓Android源码——FBReader.zip" 指的是一个...总之,"安卓Android源码——FBReader.zip"提供了一个宝贵的教育资源,让开发者能够深入理解Android应用开发,提升个人技能,并可能激发创新的解决方案和功能。
总的来说,通过深入学习《安卓Android源码——应用开发揭秘》中的源码,开发者不仅可以提升自己的编程技能,还能了解到Android系统的架构设计,从而在面对复杂问题时能够更有条理地分析和解决。这份源码资源是...
本文将围绕"Android源码——新浪微博Android客户端.zip"这一主题,详细解析其中的关键知识点,旨在帮助开发者深入理解Android应用的架构设计与实现。 首先,我们要明确,新浪微博作为一款广受欢迎的社交应用,其...
《安卓Android源码——TankWar....总的来说,分析和学习《安卓Android源码——TankWar.zip》不仅能帮助开发者掌握Android游戏开发的基本技能,还能深入理解Android应用的各个层面,对于提高Android开发能力大有裨益。
总之,解压并研究“安卓Android源码——MetroUI.rar”将是一个深入理解Android UI设计和实现过程的好机会,同时也能提高开发者在自定义界面设计上的专业技能。通过这个过程,开发者不仅能掌握如何在Android上构建...
通过分析"安卓Android源码——k9-email.zip",我们可以深入理解Android应用开发的各个方面,包括UI设计(如Action Bar和颜色选择器)、用户体验(如下拉刷新和更新日志)、网络通信(邮件同步)以及应用架构(K-9 ...
在Android平台上,开发一款游戏需要深入理解Android操作系统的工作机制、图形渲染、用户交互以及性能优化等多个方面。"Android源码——游戏源码——忍者快跑.zip" 是一个包含了一个具体游戏项目源代码的压缩包,它为...