现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

邓凡平:深入理解Android

2015-08-15 06:17 工业·编程 ⁄ 共 4953字 ⁄ 字号 暂无评论

邓凡平毕业于中科院研究生院,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有深刻的认识和理解。曾任Tieto信息技术有限公司高级软件架构师,主要负责Android系统方面的研发工作。《深入理解Android 卷I/II》作者,华章公司《深入理解Android》系列书籍总策划。此外,他对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究。

此外,他的新书《深入理解Android Wi-Fi, NFC和GPS》即将发售。

CSDN:请和大家介绍下你及目前所从事的工作。

邓凡平:大家好,我叫邓凡平,来自湖南。2000年进入华中科技大学水电系,所学专业是水利水电与自动化。2004年进入中科院电工研究所读硕士,研究方向是超导磁体。2007年毕业后,进入中科大洋公司。从此跨入软件开发行业,至今已经7年。曾担任Tieto公司高级软件架构师职位。目前负责Android系统方面的研发工作。

CSDN:你是一名资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有深刻的认识和理解,请谈谈你对Android系统的认识?

邓凡平:Android分为几个层次,首先是Kernel层,它用得是Linux Kernel。然后是用户空间中的Framework层。最后是Application层。Android的核心内容大部分集中在Framework层,我个人又把它划分成两个层次:

以 Native语言编写的模块,包括负责显示的SurfaceFlinger、负责音频I/O的AudioFlinger、负责媒体播放的 MediaPlayerService、负责Wi-Fi的wpa_supplicant、负责蓝牙的Bluez。我称之为
以Java编写的模块,包括和App紧密交互的ActivityManagerService、WindowManagerService等。我称之为Java Framework
从App角度来看,Android内核就是Framework。而从Framework角度来看,Linux Kernel是内核。

对App来说,Android尽力向应用层避免其他OS上的进程及进程间交互手段,取而代之的是四大组件及把它们相互连接起来的Intent。这是一种内涵远高于其技术实现的设计理念。所以,我觉得把APP层以下的内容称之为Android内核更能体现Android的特点。注意,官方并未有这种划分,所以读者也大可有自己的划分方法。

CSDN:Android应用开发者和系统开发者怎么高效的学习Framework呢?

邓凡平:Android Framework各个模块之间以及Framework各模块和上层APP之间基本上都是基于C/S方式来交互的,交互手段有Binder、Socket、Pipe、共享内存等。这是Android Framework的核心工作机制。

Android Framework包括Java层和Native层。

毫无异议的一点是:Java层最终会运行在一个或多个Java虚拟机上。当然,这个Java虚拟机最终会以进程的形态运行在Linux之中。
现在问题就出来了:Google花了大量心血用Java语言编写的ActivityManagerService、 WindowManagerService、PackageManagerService等模块,不光能运行在云OS的虚拟机上,也能跑在dalvik自 己实现的虚拟上。在这种情况下,java虚拟机的作用就好比PC机中的CPU。当你把CPU从Intel的换成了AMD后,就把运行在上面的Linux叫 做自主OS。个人认为这种说法有夸大之嫌。
另外还有一个关键点:除了Java模块,Framework还包括Native模块,这些东西和虚拟机几乎没有关系。它们也属于云OS中的重要一部分。
Android Framework包含的知识点非常多,读者应根据需要进行广度和深度的拓展,例如:

如果工作中涉及到播放器开发,则可以深入研究Framework中MultiMedia模块,包括播放引擎、编解码、OMX等。
如果工作和Wi-Fi相关,则可以研究wpa_supplicant、802.11协议等。
如果对Activity切换、Provider工作原理感兴趣,可以研究Java Framework。
我个人感觉在工作中很少能学到系统性知识,所以在此也鼓励读者一定要抽出整段时间来学习系统性知识。一个基本原则是:由点及面,努力构造完整的知识结构。

另外,学习过程一定要总结,现在云笔记是一个好东西。在工作时记下的东西,回家可以接着做。大家可以看我用Wiz做笔记时的示意图。上图是2年下来的积累。
Android是开源世界的集大成者,是一个完整的系统。我相信大家只要在这个系统中钻研1-2年一定会受益匪浅。

CSDN:你从事Android Fwk开发的方向是什么?

邓凡平:当你看完《深入理解Android》卷1,卷2或者其他类似书籍后,内心一个很明显的感觉就是看代码能力提高了。随之而来就是另外一个困惑或者新的追求:看代码能力是基本功啊,有没有更深入,更高级一点的方向让我们能沉浸进去学习,去发挥我们的能力?

实际上,《深入理解Android》系列书籍在12年规划时,就充分考虑到读者后续的需求了。当时有一个Roadmap,  将本系列书籍划分为基础卷和专题卷。读者掌握了基础知识后,随着个人兴趣爱好,公司需求就逐渐需要往更专业化的方向走。笔者结合自己的实际经验,为读者划分了好几个方向:

多媒体专题:涵盖MultiMedia相关的模块,包括Stagefright、OMX,流媒体播放。涉及到基础的编解码知识,视音频知识。
webkit专题:该专题难度非常大,但其重要性却不言而喻。目前这本书正在编写,但难度太大,可参考资料非常少,所以什么时候能出来还是个未知数。
Android系统安全专题:该专题的目标是,分析Android系统上提供的安全方面的控制机制。另外,Linux平台上的一些常用安全机制(例如,文件系统加密等)也是本书所要考虑的。
LC:目前已经涵盖了Wi-Fi、NFC和GPS。希望有能力,有热情的读者分享关于BT的知识。
专业化程度决定个人的价值,所以:

基础功力要稍微迅速得掌握,更重要的价值还是体现在专业化上。
不要沉迷于技术本身和工具,要时常思考自己要做什么,做哪些东西更有价值。软件领域可学的东西太多了,但是切记要结合需求选择最合适的内容。这年头我们不缺乏做事的勇气和努力奋斗的精神,缺的是知道自己要做什么的思考以及抵御外界诱惑的定力。
CSDN:你认为现在及将来Android的大体方向是什么?

邓凡平:Android在Google及其它合作伙伴的齐心协力下应该会保持稳健发展的势头。而更多、更先进的硬件(如更多传感器、更强劲的电池)、软件技术(例如Miracast也会通过Android手机和其他智能设备让千家万户真真切切体会到技术改变世界的力量)。

未来Android的发展重点一定是在企业级方面。譬如,Android引入了SELinux这一非常重要的安全保护机制。另外,配备Android的移动设备如何与Windows企业环境相融合也是Google需要重点考虑的。据说Android L系列将在企业级feature上有所建树,到时候我将再研究它并和各位读者分享相关内容。

CSDN:继《深入理解Android 卷I/II》的成功后,你的新书《深入理解Android Wi-Fi, NFC和GPS》即将发售,写这本书的缘由是什么?

邓凡平:Wi-Fi部分的内容还有很多,比如hostapd等。根据我自己的研究,只要真正掌握本书所涉及到的Wi-Fi部分(最好努力把本书列的参考文献研究一遍),hostapd等Wi-Fi(包括Wi-Fi Direct,TDLS等等)其他内容就和玩似的(具体的物理层通信知识除外)。

我有一个同事在从未搞过Wi-Fi基础上,研究了本书样章,结果去Nokia面试通过。虽然TA没有实际经验,但人家觉得理论功底比较扎实,是可以培养的好苗子。

多扯几句,为什么我会写LC(Local Connectivity)的书?因为Tieto的波兰同事在LC这一块的实力享誉世界,高通都买了我们的蓝牙解决方案。但是,毕竟是教会徒弟饿死师傅,拿手绝技也不会随随随便交给你,尤其是在没有建立mutual trust情况下。你要参与LC的工作,怎么着也得能入人家的法眼吧?

当然,我一直纳闷的事情是,凭什么老外能学会咱们就学不会呢?资料受限制了吗?和我们当年搞超导陀螺仪来说,现在这个世界简直就是天堂。当时我们找陀螺仪的文献,国外到60年代后,所有相关资料全部保密。还不是一样搞出来了。人家不教,我们就自己学吧。所以,就看各种文献,各种资料,慢慢搞,一步一个脚印,现在至少是入了法眼了。

CSDN:另外,这本书有哪些特点或不同呢?

邓凡平:这本书非常难写,比《深入理解Android 卷1》多了一百多页的内容。当然,它的难度不在页数上,而是在它所涉及的专业知识上。

以卷1和卷2以及市面上其他讲解Android Framework的书为例,这些书籍所涉及的内容几乎都是偏重代码解析。是的,对于这些书的读者而言,大家要努力掌握的是看代码的能力,以及提升代码分析的功力。但是对于我们这本书,角度就完全不同了:在这本书中,代码是专业知识或者简单点说,协议的反应和实现。如果不了解这些专业知识,即使一个写过大型程序的人也不一定能看懂wpa_supplicant,NFC和GPS的实现代码。本书所涉及的代码的架构都非常简单,难就难在每一个变量定义,每一个函数的定义可能背后都有一个小知识点。

从上,读者可以发现,纯粹的代码分析并不能帮助读者真真正正掌握Wi-Fi、NFC和GPS的知识。所以,本书每一章都会先介绍相关的专业知识。这些专业知识是笔者从众多参考资料中学习,吸收,精挑细选,重新组织并编写出来的,对应那些还未入门,或者刚入门的读者来说极具价值。从内心来说,笔者有时候极端得认为“如果读者真正掌握了这些专业知识,懂不懂代码实现其实都无关紧要了!”

另外,本书每一章都有参考文献以及笔者对它们的点评,方便想深入学习的读者参考。

CSDN:你从事开发多年了,这一路走来,最大的感悟是什么?

邓凡平:求知欲是人的本能,很高兴自己一直保持了这种本能。另外,做好时间管理、明确自己的目标也非常重要。对于一些初学者我有一些以及和我一样仍在努力的人,有几点建议:

在工作初期,先求广度,再求深度;只有见识面广,才有可能融会贯通;要努力接触新事物;Be Active。
工作三年后,要选择适合自己的。这个时候,知道自己要做什么,比知道怎么做更重要。
要有团队精神。覆巢之下无完卵。团队不好,个人也不会好到哪里去。大家要齐心协力把事情做好,不要过多考虑个人得失。
要有定力和钻研精神。在知识学习上,高投入才可能有好产出。
注意身体健康。活得越久,才能学得更多嘛。这是硬件,没有它,任何软件都跑不动。身体健康与否作为一个人最重要的风险因素,相信软件工程师们一定会重视并加强控制的。
随着Android智能手机越来越普及,从技术角度来看,其门槛也越来越低。这一方面是好事,因为更多技术人能加入并带来新的力量。同时也是一件值得警惕的事情,因为如果不快速跟上技术发展的潮流,提升自己的专业化技能,自身价值很快就会贬值。国外的技术人员能干到50多岁,其本质原因还在于他们在一个专业化方向上积累了数十年深厚的知识和经验,以至于自己变得不可替代,从而掌握了真正的铁饭碗。我是从其他行业转过来的,从技术人员的技术生命周期来看,软件行业和其他行业没有什么不同。只不过软件行业更新换代相比其他行业快,所以,软件工程师如果不加快专业化的步骤的话,就会出现人们常说的"IT工程师30岁以后就掉价的情况"(其他行业可能到退休年龄才出现这种情况)。

在这个即是最好,又是最坏的时代里,我们其实只要有乔布斯”stay foolish, stay hungry“的心态就可以了。

给我留言

留言无头像?