Android实例仿真之一

目录

零 开局三问

第一问:为什么要有这一章?

第二问:Android算不算是一个嵌入式系统?

第三问:用什么方法来分析Android这个大系统?

一 讨论Android的流行

二 深入浅出Android


零 开局三问

在正式开始这一部分之前,我们有三问需要回答。

第一问:为什么要有这一章?

因为Android有许多优点(其实我觉得最大的优点是可玩性),还有一定的复杂性和难度(从它的目标出发,可知这是必然的),并且是开源的(这是最关键的一点),所以是一个很好的学习例子,学习架构设计和软件开发的例子,值得分析。

第二问:Android算不算是一个嵌入式系统?

我认为答案是肯定的。嵌入式系统整体上看,可以分为三类(https://blog.csdn.net/wwwyue1985/article/details/119428234?spm=1001.2014.3001.5502):一类是基础级的。主要特点是不使用操作系统(纯裸机程序跑)或者只使用简单的带任务调度的操作系统,无通用驱动、网络及图形界面支持。这类系统承载的业务大多是专用的,或者说是专门为某一特定用途或功能或用户群体而定制设计的。第二类是中等级的。主要特点是使用像Linux这类通用操作系统,有图形界面支持,具备一定的通用性,但主要还是为某些复杂功能或通用类用途而设计,包含实时系统和非实时系统。这一类系统对第三方扩展开发的支持有限。第三类是高等级的。主要特点是采用比较完善的通用操作系统,支持各类应用开发,被称为智能系统。像Android就属于这一类。显然,第三类是最庞杂(注意,博主这里用了庞杂,而非复杂)、最通用的,所以其架构灵活度也是最大的,值得学习。

第三问:用什么方法来分析Android这个大系统?

这里可以仿照《深入浅出MFC》一书(侯捷著),对Android框架也做个抽丝剥茧的手术,去掉各种外包装,留下主要骨架(就像龙门客栈里展示的庖丁解牛术),并仿照其骨架进行一个仿真。如此,则能去其繁杂,学其精髓,值得尝试。

  

一 讨论Android的流行

   不知读者有没有思考过,当我们准备开发一款应用时,需要考虑哪些基本的东西?

   现思考也来得及,至少能想出来如下三点吧:

   1 语言选择:选项很多,但是,用C++还是JAVA亦或其他语言,这是个不小的问题,需要综合考虑。有时候,选项太多,也会是个麻烦事。

   2 平台选择:基于操作系统,目前主流的有Linux、Windows、Android、iOS。这块根据目标用户,业务场景等,相对好选择一些。对于移动端的开发,其实Android和iOS都是需要的。

   3 开发环境:1和2选好了,这块也基本就能够确定了。采用成熟流行的IDE,还是能够提升不少开发效率的。至少像拼写这种低级错误,能够避免不少。

   俗话说,工欲善其事必先利其器。除了上面三个大问题外,编辑、设计、编译、调试、配置管理等等工具,也是必须要准备好的。专业的事不仅要交给专业的人,还需要交给专业的工具。在软件开发中,尤其如此。

   当然,我们可以把问题再拓展一下。比如这样问,假设你是一个平台供应商(比如是Google和Apple),如何为开发者提供应用开发的一条龙服务?此时考虑的东西就多了,我们在之前关于Android技术生态构成的讨论中提到过这些内容(https://blog.csdn.net/wwwyue1985/article/details/128759826)。平台搭建就好比是盖楼,要完成大部分看不见的工作,像是地基、管线等,然后留给开发者所见即所得的房屋装饰和配置工作。这有点像SaaS,通用的事情都由平台完成了。回到问题本身,具体来说,除了前面提到的工具外,至少还要包括了基础库、编译器、连接器、SDK、文档、示例、模拟器、开发模型及规范、构建工具、发布平台等等。

   我们的生活已经离不开各种各样的软件和工具,也就是大家俗称的各种应用。苹果公司的产品之所以畅销,不仅仅是他优秀的软硬件一体化融合设计,更是各种丰富的应用,吸引了开发者、投资者,最终也吸引了用户。Windows当年打天下,正是依赖其上的应用越来越丰富,用户已经形成了一种依赖,对平台的依赖。

   在一个系统中,应用可以看做是一个具有一定功能的模块,可以完成一个具体的任务,为用户使用系统资源提供便利。

   我们前面说了,平台搭建好比是盖楼,那开发一款应用,就类似于装修一个房子。首先要有目标用途,是商铺还是自住。如果是商铺,那饭店和修理店的装修需求显然是不一样的,这就需要收集需求,做设计,画图纸,进行完善的规划。前期工作准备充分了,再开始具体施工。开发一款应用也是类似,同样也需要有图纸,进行前期的架构设计,进度计划等。之后才由IT民工将设计转换成代码。只不过软件应用的开发,很多工作都是思维逻辑性的,不需要水泥、沙子、石灰,且复制成本极低。

   还有一点,你会发现二者在基础依赖这方面也很像。对于房屋装修来讲,如果开发商没有提供部分管道,装修时想要实现,那就比较麻烦了。比如早期的楼,没有考虑到网络入口,后续就只能在走廊过道等地方拉线。同样,如果软件平台没有提供某些基础功能支持,想在应用里实现,同样很难。比如,应用想要一个1毫秒的定时器,而底层只能提供精度为10毫秒的定时器,那这个1毫秒定时器就无法实现了。

   前面提到了,软件的复制成本极低,这是软件不同于其他行业的一个最明显特点。所以,我们开发的应用,就需要运行在流行的平台上,这样应用才能为更多的用户所接触和使用,产生最大的价值。这就产生了一个新的问题,如何提供流行的平台?

   Android从出生开始,就迅速流行了起来,所以Android的流行值得我们思考。这里我提几点供大家参考:一是Google使用了Java作为应用的开发语言,降低了开发者的学习成本;二是Google开源了系统,迅速吸引了硬件和设备厂商;三是Google大量使用了开源软件,在最短的时间内完成并推出了基本系统,使得用户得以尽早利用这个平台。俗话说“一步先步步先”,先人一步,在软件领域的重要性不需要多言,微信就是最好的例子。

   之后,Google在不影响整个应用生态基础的前提下,不断优化系统底层。可见,Google在最开始把好钢用在了刀刃上,先提供并优先保证应用API的可用性。后期在迭代过程中保持稳定性,最终在整个智能手机浪潮中占得最重要的领域:操作系统;并在操作系统领域占得最重要的元素:先机。现在我们可以看到,Google已经优化或者替换了大量底层的开源组件。如果Google一开始就从底向上自己从头设计系统,那么在移动平台这个赛道的竞争中不见得能够取胜。现在Google不仅在替换许多开源基础组件,甚至要替换Linux内核,并已经替换了上层的Java语言,这些都是利用垄断优势才可以做到的。

   先有再优,Google正是凭借这一点,让Android流行并壮大起来。关于有优的思想原则,另一个典型的例子就是Windows NT之父大卫卡特勒。在NT开发期间,其也是坚持先开发功能再优化性能。这世界上本就没有多少最佳方案,更多的是合适不合适。

二 深入浅出Android

   前面提到,可以参考侯捷的《深入浅出MFC》来分析Android大系统。那具体怎么做呢?可以从最简单的进程间通信开始,搭建一个基础模型,一步一步丰富功能,到接近一个Android系统。这就有点类似核心主干的仿真了。可以在丰富内容的过程中,添加嵌入式系统领域积累的知识,比如背后的本质东西等。像进程间通信、消息队列、消息循环等。通过深入浅出的了解,最终当作一个标准组件。这就如理解计算机工作的过程,最后就是概念不断积累,细节不断隐藏,认识不断升华的过程。比如组成原理中的CPU、内存、磁盘、网络等,深入的话,有一堆细节;浅出的话,就是一个一个的模块;放在一起的话,就成了一个拥有特异功能的神奇机器。

   还有一种方式,就是按照从上到下的方式进行分析,从应用到硬件,逐层递进。这是我们常规的学习方法。具体展开时,可以灵活把握,比如采用发散的树形方式,总的Android系统,到大的模块,再到小的模块,再到细节。这也是一种方法。

   关于Android的框架,不是简单介绍有哪些类,画个类图,然后介绍到进程通信就完了。关键是要介绍背后工作的机理原理,而非简单的接口罗列,这些才是重点。通过进程通信,获取服务,启动Activity,暂停Activity等等,这些方面的介绍已经很多了,但是服务怎么启动,怎么暂停的,怎么涉及到底层的,这些核心的东西并没有挖掘出来,特别是有哪些进程,负责了哪些服务,如果能够通过图示将这些展示出来,这样才算是更完整的剖析了设计者的思想。

   要完成这部分的工作,或者说达到通透的目的,就必须进行真正的仿真,并记录过程。不过,这是一个庞大的工作,一下子搞定是有点难度的。下面几节我们围绕这个目的,先尝试按这种思路,开个头,做一部分分析工作。

猜你喜欢

转载自blog.csdn.net/wwwyue1985/article/details/129114753