原网址:http://jingyan.baidu.com/article/574c5219ca78ed6c8d9dc12a.html
在Android系统上工作了一段时间,经常会遇到题目中的问题,下面说说我的看法:
1、需要先找一个开头,和UI有直接关系的就是最常见的Activity了吧,我就从它开始解剖。从Activity的创建入手,寻找Activity真正的创建位置,setContentview这个方法很明显和UI有关,这两方面一结合,我发现了ViewRoot和WindowManager的身影,沿着WM和WMS我发现了Surface,以及draw的函数,它居然在Activity 创建时出现的DeCorView上画东西。借助Source Insight我总结了UI Java层的横向静态图。完成这个静态UML,我觉得我可以开始功能实现上追踪了,这部分主要是C++的代码,我沿着draw函数,看到了各个层级的关系,SurfaceSession的控制和事务处理,SharedBuffer读写控制,彪悍的SurfaceFlinger主宰一切,OpenGL ES的神笔马良。FrameBuffer和FrameBufferDevice的图像输出。一气呵成的完成了。
2、Eclipse不是阅读Android源码的好工具,不流畅,搜索低效,继承性关系/调用关系都无法有效查看。推荐Source Insight,在这个工具帮助下,你才可以驾驭巨大数量的Android 源码,你可以从容在Java,C++,C代码间遨游,你可以很快找到你需要的继承关系。我一直是Windows+Linux+Samba的工作模式。
3、Android源码分为功能实现上的纵向,和功能拓展上的横向。在阅读源码时需要把握好着两个思路。
譬如你需要研究音频系统的实现原理,纵向:你需要从一个音乐的开始播放追踪,一路下来,你发现Jni调用解码库,共享内存的创建和使用,路由的切换,音频输入设备的开启,音频流的开始。你要看音频系统包括哪些内容,横向:从Framework的接口,你会发现,音频系统主要包括:放音,录音,路由切换,音效处理等。
4、Android的功能模块绝大部分是C/S架构,你心里一定需要有这个层级关系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城。然后你才能发现HAL和Kernel一层层地剥离。