Android系统源码学习步骤

  Android系统是基于Linux内核来开发的,在分析它在运行时库层的源代码时,咱们会常常碰到诸如管道(pipe)、套接字(socket)和虚拟文件系统(VFS)等知识。html

  此外,Android系统还在Linux内核中增长了一些专用的驱动程序,例如用于日志系统的Logger驱动程序、用于进程间通讯的Binder驱动程序和用于辅助内存管理的匿名共享内存Ashmem驱动程序。在分析这些Android专用驱动程序的时候,也会碰到Linux内核中与进程、内存管理相关的数据结构。android

  所以,咱们有必要掌握一些Linux内核的基础知识,下面就介绍四本典经的Linux内核书籍。算法

  • Linux Kernel Development.

    做者是Robert Love。这本书对Linux内核的设计和实现提供了一个总览视图,从概念上对Linux内核的各个子系统的设计目标和实现思路进行了清晰的描述,很是适合初学者阅读。若是从软件工程的角度来看,这本书至关于Linux内核的概要设计文档。编程

  • Understanding the Linux Kernel.

    做者是Daniel P. Bovet和Marco Cesati。这本书对Linux内核的实现提供了更多的细节,详细地描述了内核开发中用到的重要数据结构、算法以及编程技巧,很是适合中高级读者阅读。若是从软件工程的角度来看,这本书至关于Linux内核的详细设计文档。ubuntu

  • Linux Device Drivers.

    做者是Jonathan Corbet, Alessandro Rubini和Greg Kroah-Hartman。这本书更加注重实际操做,它详细地讲解了Linux内核驱动程序的实现原理和实现方法,读者能够跟着它来实际地编写出本身的Linux驱动程序。阅读了这本书以后,对咱们后续去分析Android的专用驱动程序是有很是大的帮助的。数据结构

  • Linux内核源代码情景分析

    做者是毛德操和胡希明,是中国人本身编写的一本经典的Linux内核书籍。这本书最大的特色是从使用情景出发,对Linux内核的源代码做了详细的分析,帮助读者把枯燥无味的源代码给理顺了。架构

  掌握了Linux内核的基础知识以后,还不宜立刻就去分析Android系统的源代码,由于这样作是漫无目的的,咱们应该带着问题或者目标去分析Android系统的源代码。要把问题或者目标挖掘出来,最好的方法就莫过因而在Android平台上编写本身的应用程序了。经过编写应用程序,咱们能够知道Android平台都提供了哪些功能,进而咱们就会想去了解这些功能是怎么实现的,这样就能够达到带着问题或者目标去分析Android系统的源代码了。这里介绍两个Android应用程序开发教程的书籍:框架

  1. Professional Android 2 Application Development.
  2. Google Android SDK开发范例大全.

  这两本书都使用了大量的例子来讲明如何使用Android SDK来开发Android应用程序。读者能够根据实际状况来练习一下,主要掌握Android应用程序四大组件(Activity、Service、Broadcast Receiver和Content Provider)的用法,由于Android系统的整个架构和实现就是为了向开发者提供这四大组件来实现各类各样的应用程序的。在学习的过程当中,若是遇到其它问题,还能够参考官方文档,其网址为:http://developer.android.com/index.htmlless

 

系统架构

  Android系统是按层次、分模块来设计的。在咱们着手对Android系统的源代码进行分析前,须要对Android系统的架构有一个整体的认识,这样咱们就可以快速地知道哪些代码位于哪一个层次上的哪一个模块中,节省搜索代码的时间,把更多的精力投入在源代码的分析上去。socket

  整个系统划分内核空间用户空间两部分。内核空间包含了进程管理、内存管理以及设备驱动程序模块等,其中Android专用驱动Binder、Logger和Ashmem就是在内核空间实现的。用户空间包含了硬件抽象层(HAL)、外部库和运行时库层(External Libraries & Android Runtime)、应用程序框架层(Application Framework)和应用程序层(Applications)四个层次。咱们应该如何去掌握这个层次结构呢?最好的方法就是从学习Android的硬件抽象层做为切入点了。

  可能读者会以为比较奇怪,为何要把Android系统的硬件抽象层做为学习Android系统架构的切入点呢?这个层次由于涉及到硬件,看起来这是一个比较复杂和深奥的知识点。其实否则,Android系统的硬件抽象层在实现和使用上,层次都是很是清晰的,它从上到下涵盖了Android系统的用户空间和内核空间。内核空间主要就是涉及到硬件驱动程序,而用户空间就涉及到了Android系统应用程序层、应用程序框架层和系统运行时库层的相关知识。所以,学习Android系统的硬件抽象层,可使读者快速地认识整个Android系统,从而对Android系统获得一个感性的认识,为后面深刻分析Android系统的源代码打下良好的基础。

Android硬件抽象层的学习能够参考下面的一系列文章:

  学会了编写基本的Android应用程序而且对Android系统的总体架构有一个大概的了解以后,咱们就能够去分析Android系统的源代码了。

  在分析Android源代码的过程当中,咱们常常进入到应用程序框架层去分析它的源代码,而在应用程序框架层中,有一部分代码是使用C++来实现的,这时候就会常常碰到智能指针,所以,咱们把Android系统中的智能指针也做为一个基础知识点来学习。相信使用过C++语言来作开发的读者对智能指针不会感到陌生。用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则形成内存泄漏,重则形成系统崩溃,所以,系统为咱们提供了智能指针,避免出现上述问题。

  在Android系统中,提供了三种类型的智能指针,分别是轻量级指针、强指针和弱指针,它们都是基于对象引用计数技术来实现的。轻量级指针的计数技术比较简单,只要对象的引用计数值为0,它就会被释放。强指针和弱指针的计数技术相对比较复杂,一个对象能够同时被强指针和弱指针引用,可是这个对象的生命周期通常只受强指针的控制,即当这个对象的强引用计数为0的时候,这个对象就被释放了,即便这时候这个对象的弱引用计数不为0。引进强指针和弱指针这种复杂的引用计数技术是为了解决垃圾收集(Garbage Collection)问题而提出的。考虑这样的一个场景,系统中有两个对象A和B,在对象A的内部引用了对象B,而在对象B的内部也引用了对象A。当两个对象A和B都再也不使用时,垃圾收集系统会发现没法回收这两个对象的所占据的内存的,由于系统一次只能收集一个对象,而不管系统决定要收回对象A仍是要收回对象B时,都会发现这个对象被其它的对象所引用,于是就都回收不了,这样就形成了内存泄漏。若是采用强指针和弱指针技术,这个问题就迎刃而解了,即A和B都用弱指针来引用对方。Android智能指针的学习,能够参考下面这篇文章: Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

掌握了本文所介绍的这些基础知识后,咱们就能够正式开始分析Android系统的源代码了。

 

环境搭建

  开发Android应用程序能够在两种环境下进行,一是在Android SDK环境下进行,通常是集成在Eclipse里面进行开发,二是在Android源代码工程环境下进行,在这种环境进行开发的好处是可使用一些在SDK中不公开的接口。可是若是咱们要修改Android系统的源代码,或者为Android系统增长新的功能接口,那么就只能在Android源代码工程环境下进行了。因为咱们的目的是对Android系统源代码进行分析,所以,咱们在开发Android应用程序时,也在Android源代码环境下进行。这样,咱们就须要搭建一套Android源代码工程环境了。

  目前,Android源代码工程环境只能在Linux平台上使用,而Linux系统的发行版本比较多,这里咱们推荐Ubuntu系统。Ubuntu系统是免费的,并且很是易于使用,安装和更新应用程序也很是方便,它的官方下载地址为:http://www.ubuntu.com/

  安装好Ubuntu系统以后,咱们就能够在上面下载、编译和安装Android源代码了,具体方法和步骤能够参考下面这篇文章:在Ubuntu上下载、编译和安装Android最新源代码

  Android系统的源代码工程默认是不包含Linux内核源代码的,若是咱们须要修改Android系统的内核或者在里面增长新的模块,那么就要把Android内核源代码一块儿下载、编译和安装了,具体方法和步骤能够参考下面这篇文章:在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)

  Android源代码工程环境搭建好了以后,咱们就能够在里面开发新的应用程序或者修改系统代码了。增长了新的应用程序或者修改了系统的代码以后,不须要从新编译整个源代码工程,只要单独编译有改动的模块就能够了,具体方法能够参考下面这篇文章:如何单独编译Android源代码中的模块

  对于已经开发好的应用程序或者系统功能,若是想把看成Demo展现给客户来体验时,咱们既能够在真机上面运行,也能够在模拟器(Android源代码工程环境或者Android SDK环境都集成了模拟器)上面运行。当咱们手头上没有真机,并且咱们又不想把整个Android源代码工程环境或者Android SDK环境带去展现咱们的Demo时,就能够考虑把模拟器这两个环境中独立出来了,具体方法能够参考下面这篇文章:制做可独立分发的Android模拟器

 

 

转自: http://www.cnblogs.com/xiaoran1129/archive/2012/11/02/2751446.html 

相关文章
相关标签/搜索