android framework学习(知乎-作者van Bruce)

转载 2016年08月31日 11:08:45
 首先放个地图炮,任何光讲源码的书都是耍流氓,无一例外。作者或许是大神,或许对于每一个地方的每一处源码都烂熟于心,但并不代表他们可以写出一部好书。原因很多时候在于,Android的功夫,在Android之外。这是理解Android源码的“道”,也是我近几年来愈发强烈的感受。

至于“术”,我只想说大神博客也好,书也好,90%的讲述方式都是错误的——作者展示出Android源码,然后告诉你这段是干嘛的,然后下一段……这样的书或博客,我个人看得非常痛苦,一开始我不明白为什么,工作了第三年,猛然明白,读起来痛苦的原因是倒转了因果。


几乎所有代码or模块or系统的开发初衷,都是为了解决某一问题。如果你光看源码,哦这个是干嘛的,那里调用了哪个API,这样看毫无意义,这样的所谓“讲解”书也毫无意义。大把的《深入XXX》实际上都没有深入,因为他们并没有搞清或说清,这里有个什么样的问题,而这个部分模块or源码怎样解决了这个问题,以及曾经其余的系统上如何解决这个问题——更有甚者,他们讲完解决方案,然后再编个问题出来,且说的好像这个问题只有这唯一一种方案可解一样……


就比如题主和很多答主提到的Binder机制,所有人都能说出来它是跨进程通信用的,可是你依然会看得想要吐血。包括很多blog讲起这部分,都有一种先有答案后编个问题出来的嫌疑,理解并不深入(尤其是上来就将Media部分的,大部分根本只讲了“怎么用”,完全没有“为什么”的部分,这也好意思起名字叫“深入理解XXX”)。

你想搞明白,首先要忘了Binder。然后想想看,有什么样的方案实现一个跨进程通信的方式?最容易想到的,一个是“共享内存”的方式或是“共享磁盘文件”的方式。其余的方式呢?

想不到去看看旧有的Linux系统上的演变过程,当你看到管道(Pipe)方式的实现,就会开始恍然大悟——原来还可以通过这样。然后你会更加理解UDS(Unix Domain Socket,非TCP/IP里面的那个socket,很多人会困惑与此)的出现,此刻你心里对于Server-Client端互相建立起IPC链接的过程才将变得明朗,甚至可以推出RPC(Remote Procedure Calls)的实现模型。

到这里,你再去看Binder的实现,从宏观的模型开始,一切都变得异常清晰起来。对于Binder Client和Binder Service各自的角色有了理解,Binder驱动与ServiceManager的联动,就变得更加清楚——和UDS或者RPC是不是很类似?甚至更容易理解一些,如果更加抽象的形容,ServiceManager就像DNS一样,负责Client查询到BinderService的IP地址(这也就理解了为何ServiceManager的通信标志恒为0),而Binder驱动则是路由器的角色。

然后细化下去,针对每一个模块本身的职责,询问更细节的实现,永远记住,先有的问题,之后才有的代码——这样才能理解为何Parcel是必要的(跨进程通信的高效序列化数据载体),为何IBinder或BpBinder是必须的,AIDL又是什么用——代码实现是新鲜的,但是有了之前的铺垫和对问题的预期,它们的出现才是可理解的。这是理解Android源码之“术”。

当然,说起来容易,做起来难。

整套模块看下来,抛开信息检索能力不谈,你需要补一些C++的基础,需要补计算机系统的基础,甚至需要理解设计模式——但不是说你成为任何一方的专家才能理解,只是随着一点点深入问题,随时去补课罢了。所以说跳着看书的能力是必须的,不是你想不想或者喜不喜欢的问题,它就是必须的——你唯一的问题就是愿不愿意让自己适应它,还是找个借口绕路。

所以这个问题又回到了最初提出的观点——Android的功夫,在Android之外。你要想“理解”而非单纯的“知道”,想“学习”而非单纯的“记诵”,我觉得没有他路可走。

总结起来就是:
先理解模块对应的要解决的“问题”是什么,再去给问题找解决方案的思路去理解源码。
理解源码的功夫不止在Android本身,也要提高Android之外的姿势水平。

最后,继续鄙视那些玩了几个app、听说Android开发语言用Java就对Android嗤之以鼻的自大狂们——对于Android这个庞大的知识库来说,90%的人离入门都还差得远呢。 

Android Framework概述

转发请注明转自:http://blog.csdn.net/zcxwww/article/category/6139115             这里写一些关于Android Framework比较重...
  • zcxwww
  • zcxwww
  • 2016年04月17日 17:20
  • 2576

我眼中的Android Framework

我眼中的Android Framework在开发中我们会遇到各种各样的非常奇怪的问题,有些问题是百思不得骑姐。其实这些问题大都是因为我们不了解安卓内部运行原理,知其所以然才是我们的目的。—前言任何控制...

在android framework中添加自定义系统服务

添加系统服务需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl 下面举例进行说明,主要添加一个服务,用于获取系统时间和...
  • sgzy001
  • sgzy001
  • 2017年01月11日 16:20
  • 1850

Android: Framework层理解(一)

不管你是做手机系统开发还是APP开发,Framework层你肯定会碰到。除非你所做的事情只是UI的优化。    那么Framework具体的工作是做什么呢? 简单一句话:提供Android开发人员一系...
  • lyjIT
  • lyjIT
  • 2016年09月08日 16:13
  • 6402

Android Framework的启动方法及原理详解

安卓系统中运行的第一个Dalvik虚拟机叫做zygote,意思是“卵”。这“卵”还是挺有用的,因为接下来所有的Dalvik虚拟机进程都是这个“卵”孵化出来的。zygote进程中包含两个主要模块,分别如...

Android Framework学习(三)之SyetemServer进程启动解析

从上篇博客中,我们知道了Zygote进程启动了SyetemServer进程,本篇博客我们就一起来学习SyetemServer进程。SystemServer的作用整个系统的android framewo...

android framework学习回忆

好久没来这里了,这2天开发板不够用,所以暂时闲下来学习东西。顺便回忆一下学到的会用的东西。     刚踏入Android Framework大门,是从电源管理开始的。记得当时拼命的google搜索相关...
  • dnfchan
  • dnfchan
  • 2011年07月27日 10:47
  • 17681

android framework层 学习笔记(一)

最近在研究android framework层的开发。  先来一张frame work的源码结构图
  • zmobs
  • zmobs
  • 2014年11月26日 17:23
  • 2455

Android Framework学习——如何加入并编译自定义的模块

研究AndroidFramework源码免不了要加入自己的模块进行调试学习。这里将会介绍如何加入自己的模块,并将相应的模块push到真机上进行调试 编写Android.mk具体在哪里编写呢?这里先解...

Android Framework学习(四)之Launcher启动流程解析

在之前的博客中,我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,我们知道SystemServer进程主要用于启动系统的各种服务,二者其中就包含了负责启动Launche...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android framework学习(知乎-作者van Bruce)
举报原因:
原因补充:

(最多只允许输入30个字)