安卓架构.有什么清晰的方式

作系统获得了70%.1的关注比例,ios和阿里云的“山寨安

卓“分别为15.9%和2.9%对于这款刚刚推出就深受广大开发者喜爱的产品。一般的一个Android应用在开发到了一定阶段以后,功能模塊将会越来越多APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块此时可能就需要考虑如何分拆整個应用了,因此android插件开发的需求也不断的增大   有人可能会想到,是否可以像其他平台那样下载一个类似于dll文件,或者jar包就能自動识别并且加载该功能?可惜的是,在Android平台上是不允许直接动态加载jar包的作者也没有想到类似办法。所以想实现这种功能,还是要以独竝APK的方式来加载和第一种方式不同的是,从设计的角度具体的插件是没有独立运行的入口的,也不允许有桌面图标存在必须从主应鼡中打开,关闭后回到主应用从用户的角度看,可以在应用中加载需要的功能并且使用也就类似于其他平台插件的方式了。   为了實现这种方式从插件开发的角度,就需要考虑清楚哪些功能作为独立的插件提供给用户这里不再详述。下面从开发的角度说明大致需偠做的工作   1、主应用中需要开发的框架功能:   识别具体的插件是否已经安装(根据插件的package名)   如果已经安装要判断是否需要升級(服务器端获取最新的版本和本地的比较)   下载并且安装(或者升级)插件   卸载该插件   2、插件APK开发中需要注意的事项:   Manifest文件中鈈要提供启动的入口。   3、主应用和插件之间交互的提示:   最好是使用相同的android:sharedUserId插件可以方便的获取主应用的资源、数据库等等。   主应用可以以Intent方式启动具体的插件同时带入Map类型参数或者json串参数,在android插件开发APK中解析具体参数实现业务逻辑。

经过两年的时间终于完成对Android系統的研究了。Android是一个博大精深的系统老罗不敢说自己精通了(事实上最讨厌的就是说自己精通神马神马的了,或者说企业说要招聘精通鉮马神马的人才)但是至少可以说打通了整个Android系统,从最上面的应用层一直到最下面的Linux内核,炼就的是一种内功修养这篇文章和大镓一起分享这两年研究Android系统的历程,以此感谢大家一直以来的支持和鼓励

        它们涵盖了老罗这两年一直想要和大家分享的内容。好了不說废话了,直入主题

        这里说的理念是说应该带什么样的心态去研究一个系统。古人说书中自的颜如玉书中自有黄金屋,我想说代码里吔有颜如玉和黄金屋所以老罗希望大家都能“Read The Fucking Source Code”。再者对于优秀的开源项目来说,不去读一下它的源代码简直就是暴殄天物啊。那麼读代码有什么好处呢?太多了除了可以学到别人的优秀代码、架构之外,最重要的是我们能从中找到答案,从而可以解决自己项目上的燃眉之急

我们在项目中碰到问题的时候,通常第一反应都是到网上去搜索答案但是有时候有些问题,网络并不能给出满意的答案这时候就千万不要忘了你所拥有的一个大招——从代码中找答案!当然,从代码中找答案说起来是轻松但是等到直正去找时,可能僦会发现云里雾里根本不知道那些代码在说什么东东,甚至连自己想要看的源代码文件都不知道在哪里这就要求平时就要养成读代码嘚习惯,不要临时抱佛脚有时候临时抱佛脚是能解决问题,但是千万不能抱着这种侥幸心里掌握一门技术还是需要踏踏实实地一步一步走。

胡克其实在牛顿之前就发现了万有引力定律,并且推导出了正确的公式但由于数学不好,他只能勉强解释行星绕日的圆周运动而没有认识到支配天体运行的力量是“万有”的。后来数学狂人牛顿用微积分圆满地解决了胡克的问题并且把他提出的力学三条基本萣律推广到了星系空间,改变了自从亚里士多德以来公认的天地不一的旧观点被科学界奉为伟大的发现。胡克大怒指责牛顿剽窃了他嘚成果。牛顿尖酸刻薄的回敬:是啊我他妈还真是站在巨人的肩膀上呢!

我们有理由相信像牛顿、乔布斯之类的狂人,不用站在巨人的肩膀上也能取得瞩目的成就但是,我们不是牛顿也不是乔布斯,所以在看代码之前还是找一些前人总结的资料来看看吧。拿Android系统来說你在至少得懂点Linux内核基础吧!所以在看Android源代码之前,先找些Linux内核的经典书籍来看看吧骚年!后面老罗会推荐一些书籍给大家。

另外我们知道,现在的互联网产品讲究的是快速迭代。Android系统自第一个版本发布以来到现在已经经历了很多版本呢?那么我们应该如何去選择版本来阅读呢一般来说,就是选择最新的版本来阅读了不过随着又有新版本的源代码的发布,我们所看的源代码就会变成旧版本这时候心里就会比较纠结:是应该继续看旧的代码,还是去追新版本的代码呢就当是看连续剧,一下子跳到前面去可能就不知道讲什么了。其实版本就算更新得再快基础的东西也是不会轻易变化的。我们看代码时要抱着的一个目的就是弄懂它的骨架和脉络。毕竟對于一个系统来说它是有很多细节的,我们无法在短时间把它们都完全吃透但是主要我们掌握了它的骨架和脉络,以后无论是要了解咜的什么细节都可以很轻轻地找到相关的源文件,并且可以很容易进入主题

坦白说,对于Android系统很多细节我也不了解。所以有时候你們可以看到在博客文章后面的评论上,有些同学问的一些比较具体的问题我是没有回复的。一来是我不懂二来是我也没有时间去帮這些同学去扒代码来看。这也是在文章一开头我就说自己没有精通Android系统的原因。但是请相信主要你熟悉Android系统的代码,并且有出现问题嘚现场顺藤摸瓜跟着代码走下去,并且多一点耐心和细心是可以解决问题的!

关于Android版本的问题,相信大家都知道我现在的文章都是基於2.3来写的很多同学都说我out了,现在都4.2了甚至4.3或者5.0都要出来了,还在看2.3我想说的是,主要你掌握了它的骨架和脉络无论版本上怎么變化,原理都是一样的这就是以不变应万变之道。因此我就一直坚持研究2.3,这样可以使得前前后后研究的东西更连贯一致避免分散叻自己的精力。如果还有疑问的话后面我讲到Android的UI架构时,就会简单对比一下4.2和2.3的不同其实就会发现,基本原理还是一样的!

        说到Android系统嘚骨架和脉络也有同学抱怨我的文章里面太多代码细节了,他们希望我可以抽象一下用高度概括的语言或者图像来勾勒出每一个模块嘚轮廓。我想说的是如果你不看代码,不了解细节即使我能够用概括的语言或者图像来勾勒出这样的轮廓出来,也许这个轮廓只有我財能看得懂

我在真正开始看Android系统的源代码之前,也是有这样的想法希望能有一张图来清楚地告诉我Android系统的轮廓,例如HAL为什么要将驱動划分成用户空间和内核空间两部分,为什么说Binder是所有IPC机制效率最高的我确实是从网上得到抽象的资料来解释这两个问题,但是这些资料对我来说还是太抽象了,以至于我有似懂非懂的感觉实际上就是不懂!就是因为这样,激发了我要从代码中找答案的念头!现在当峩回过头来这些所谓抽象的轮廓时我就清楚地知道它讲的是什么了。

        所以古人云“天将降大任于斯人也必先苦其心志,劳其筋骨饿其体肤”是有道理的,因为只有亲身经历过一些磨难后得到的东西才是真实的!


2.3的研究一共是差不多两年的时间,一个从无到有的过程其中,最痛苦的莫过于是2011年12月下旬到2012年06月12日这6个多月的时间里面整理了2011年12月下旬前的所有博客文章,形成了《Android系统源代码情景分析》┅书并且最终在2012年10月下旬正式上市。

        以上产出除了能帮助到广大的网友之外也让自己理清了Android系统的骨架和脉络。这些骨架和脉络接下來再总结2013年06月03日之后,将何去何从接下来老罗也会简单说明。

        在2011年06月21日开始写博客之前其实已经看过不少的书。在2011年06月21日之后也┅边写博客一边看过不少的书。这个书单很长下面我主要分类列出一些主要的和经典的。

        上面介绍的这些书都是属于进阶级别的,所鉯要求要有一定的语言基础以及操作系统基础此外,对于看书老罗有一些观点,供大家参考:

        整个博客的内容看似松散实际上都是囿组织有计划的,目标是打通整个Android系统从最上面的应用层,到最下面的Linux内核层简单来说,博客的所有文章可以划分为“三横三纵”洳图2所示:


图2 Android系统研究之“三横三纵”

        接下来,老罗就分别描述这三条横线和纵线并且给出对应的博客文章链接。

        大家对老罗现在还在寫Android 2.3的UI架构意见最大认为已经过时了。老罗认为持有这种观点的人都是没有经过认真思考的。老罗承认从Android 4.0开始,UI部分发生了比较大的變化但是请注意,这些变化都是在Android  2.3的UI架构基础之上进行的也就是说,Android


第(1)和第(2)两个点在2.3和4.2之间有变化主要是因为增加了GPU的支歭,具体就表现为Window的Surface在渲染的时候使用了GPU而SurfaceFlinger在合成每一个Window的Surface的时候,也使用了GPU或者Overlay和Blitter这些硬件加速但是主体流程都没有变,也就是说Window的Surface渲染好之后,最终依然是交给SurfaceFlinger来合成此外,虽然我还没有开始看4.2的代码但是可以看得出,4.2里面的HWComposer只不过是封装和抽象了2.3就有的Overlay囷Blitter,而SurfaceTexture的作用与2.3的SurfaceComposerClient、SurfaceControl也是类似的第(3)点基本上就没有什么变化,除非以后要支持多窗口

        通过上述对比,只想强调一点:Android 2.3的UI架构并没囿过时是值得去研究的,并且在2.3的基础上去研究4.2的UI架构会更有帮助。

        仁者见仁智者见智,Android 2.3的UI架构的说明就到此为止接下来它的分析路线,都是围绕上述三个点来进行的

        SurfaceFlinger负责合成各个应用程序窗口的UI,也就是将各个窗口的UI合成并且通过FB显示在屏幕上。在对SurfaceFlinger进行分析之前我们首先了解应用程序是如何使用的它的:

        上述内容都研究清楚之后,Android系统的UI架构的骨架就清晰了但是前面所研究的应用程序窗口还是太抽象了,我们有必要研究一下那些组成应用程序窗口内容的UI控件是怎么实现的以TextView和SurfaceView为代表:

        Android系统的应用程序及部分应用程序框架是使用Java语言开发的,它们运行在Dalvik虚拟机之上还有另外一部分应用唾弃框架在使用C/C++语言开发的。使用Java语言开发的应用程序框架老罗称の为Java Runtime Framework而使用C/C++语言开发的应用程序框架老罗称之为C/C++ Runtime

        学习完成“三横三纵”这六条主线之后,我们就可以自豪地说从上到下地把Android系统打通,并且将它的骨架和脉络也理清了!

  对于“准备”、“专用驱动”、“HAL”、“应用程序组件”这四条主线老罗极力推荐大家看《Android系统源玳码情况分析》一书,内容比博客文章要系统、详细很多不说其它的,就单单是讲Binder进程间通信机制的那一章就物超所值。在《Android系统源玳码情景分析》一书中老罗最引以为豪的就是讲Binder进程间通信机制的第5章,网上或者其它书上绝对是找不到这么详尽的分析资料

I/O会发布Android 4.3戓者5.0,然后老罗就以最新发布的版本为蓝本来进行研究既然没有发布新版本,那么就只有以现在的最新发布版本4.2为蓝本进行研究了如湔所述,4.2与2.3相比最大的不同之处是默认增加了GPU支持,因此老罗在接下来的一段时间里,将着重研究4.2的GPU支持

这两年投入在博客上的精仂太多了,博客上的文章基本上熬夜熬出来的大多数时候,一个话题要花一个星期左右的时间来看代码然后再花四个星期左右的时间將文章写出来。本来是这样计划的依靠《Android系统源代码情景分析》一书的销量,可以在经济上得到一定的回报然后可以继续在博客上投叺,直至把4.x版本的GPU支持写完最后再整理出一本关于Android系统UI架构的书。但是最近询问了一下书的销量差强人意,达不到预期目标由于没囿形成良性循环,因此没有办法只好停止博客更新。老罗需要把精力投入在其它事情上希望大家谅解!

主要是一些随笔分享,这些分享主要会发布在微博或者QQ群上面那里也方便一些和大家进行讨论。此外老罗也乐意和大家进行一些线下分享,主要针对企业或者单位組织的沙龙、活动和会议等同时也可以单独地针对企业内部进行分享。不过前提当然是举办方对《老罗的Android之旅》专栏或者《Android系统源代码凊景分析》一书的内容感兴趣并且邀请老罗去参加。

        如果需要邀请老罗去参加分享可以通过微博或者邮箱和老罗联系,非常感谢大家兩年以来的支持!

 三层体系结构即用户层、应用層和数据库服务器。用户层主要指用户界面它要求尽可能的简单,使最终用户不需要进行任何培训就能方便地访问信息;第二层就是应鼡服务器也就是常说的中间件,所有的应用系统、应用逻辑、控制都在这一层系统的复杂性也主要体现在应用层;最后的数据库服务器存储大量的数据信息和数据逻辑,所有与数据有关的安全、完整性控制、数据的一致性、并发操作等都是在第三层完成
采用J2EE的三(N)層结构的特点 1.能有效降低建设和维护成本,简化管理 多层应用结构在各层次上的组件能单独更新、替换或增加、拆除因此,系统维护哽方便代价相对低得多。而且因各组件互相独立,更换组件就好比更换组合音响的一个部件对系统其它部分并无影响,所以更新维護更加安全可靠
客户端采用瘦客户机。因为客户机不必进行大量的计算或数据处理,它的硬件配置就不需要太高 通过将业务逻辑集Φ到中间层,系统获得了对业务逻辑的独立性即当用户的需求改变时,开发人员可以迅速地在中间层(应用服务器)上更新业务逻辑洏无需将更新后的应用提交到众多的PC终端系统上去,即客户端无需任何改动(改动众多的客户端并不是件轻松的事)
2.适应大规模和复雜的应用需求 如果说结构化方法使软件开发从一门手工艺术走向科学的工程方法,考试,大提示组件技术则使软件工程从个体作坊走向大规模工业虽然,结构化方法对中小型系统开发能够行之有效但对大型系统,结构化分析的结果往往是错综复杂的网状结构而不是结构清晰的层次结构。
这也正是面向对象方法学诞生的原因组件技术能使复杂系统的设计变得简单可行,具有良好的伸缩性 三层或多层结構,可以将数据处理从客户端转移到应用服务器和数据库服务器上这样,尽管客户端与应用服务器之间可能存在着多个甚至数百个的连接但是应用服务器与数据库服务器之间的连接却只有少数几个,从而达到减少通信线路上传递的数据量的目标
这样的功能分配提供了佷强的系统可伸缩性,使得在用户数量急剧增加时还能保持系统性能的稳定使用传统的客户机/服务器模式根本无法胜任上千个客户机同時运行同时需要访问数据库的工作。即使在用户数量很大的情况下数据库仍能保持良好的工作负载,保持系统的快速的响应速度
3.可適应不断的变化和新的业务需求 任何应用系统实施的重点不在于需求确定以后能否实现这些需求,而是在系统实施后如何适应变化的需求J2EE系统结构和组件式系统的开发和维护过程中,技术人员可以按照新的需求通过在不同系统层次上调度更新的组件或新加入的组件来调整旧的系统,以适应新的与不断变化的要求
以往的系统只能靠专业维护人员或系统开发商的再次开发或修改原有系统,才能满足新的需求代价往往很大,无法保证时间上的要求 多层结构的中间层即应用服务器能够提供广泛的异构数据库访问和复制能力。传统的客户机/垺务器结构则需要在客户端安装许多访问异构数据库的驱动程序而三层/多层结构只要在中间层有相应的驱动程序就可以访问异构数据源。
5.能有效提高系统并发处理能力 传统的一体化集中式系统或客户服务器架构在处理大信息量业务时,都可能形成瓶颈而多层体系架構的组件式系统将界面、界面发布、业务应用逻辑及数据存储分为多个层次分散管理,逻辑或物理地将它们分开可减轻系统压力,提高整体性能
并且中间层可以采取多机并行的方式,相互备份的方式保证系统的高可用性。 一般情况下进行数据分析时每次查询可能涉忣到大量的数据,往往需要较长的响应时间特别在分布式数据环境下,响应时间有时长得令人难以忍受三层(多)层结构提供了客户端与服务器之间的异步通信,使得客户不必等待提交的分析处理结果而可以继续执行其他处理任务
6.能有效提高系统安全性 多层体系结構将数据与程序、数据控制与应用逻辑分层独立管理,能更严格地控制信息访问;信息传递中采用数据加密技术可进一步减低信息失密嘚风险。应用服务器内建安全控制数据库实现应用服务器与数据服务器的双重权限控制,对权限的划分更准确、灵活、严格
新系统在信息访问、传递和存储三个环节上均有严格的安全措施。
全部

我要回帖

 

随机推荐