Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究。这里从芯片及硬件模块->linux内核驱动->hal层->jni->android framework层->android app做个简单的介绍。
1、芯片及硬件模块
就像人脑,电脑的cpu一样,android手机也需要一个中央处理器,那便是主控芯片。一般电脑的cpu是intel或者amd的,但是android手机不需要电脑那样的cpu,浪费了,而且还要考虑耗电量,所以android手机一般用的是高通的芯片,或者很多山寨机用的mtk的芯片。平板电脑用的比较多的有全志的芯片,基本是都是基于arm的,所以智能设备很多都是arm的天下,而电脑则是intel的天下。下图就是高通的骁龙:
有了主控芯片之后呢还需要一些外围设备才可以运行起来,简单来说就像电脑需要硬盘,内存啊之类的。一般android手机呢需要如下外围硬件模块
内存DDR:用于存放运行中的程序,一般4g的内存还是需要的,以前是256M和512M对于现在的应用来说远远不够了;
内部存储EMMC:用于存放app和需要存储的一些资源信息,像我的iphone只有16g,感觉就有点不够用。
电源管理和锂电池:主要用于电量的控制,低功耗,提供电量等。
液晶屏和触摸屏:很多手机是两块合二为一的,液晶屏当然是显示图像的,触摸屏呢主要是用于人机交互用的。
wifi模块:现在都需要wifi模块来连接入网了,现在的人到哪里都要问wifi密码,哈哈。
蓝牙模块:用来实现蓝牙的功能。
nfc模块:近场通信芯片。
rtc时钟芯片:系统时间,闹铃等都需要这个。
gsm模块:用来打电话啊,发短信啊之类的。
gps模块:定位用的。
小喇叭/麦克风:用来播放音乐和录音。
摄像头:用来录像和拍照。
接近传感器/加速度传感器/磁传感器等各类传感器:用来获取一些信息,比如重力用来屏幕的横屏之类,磁力计用来指南针等等。
还有很多的电阻,电容,电感啊,二极管,三极管等等。
以上基本是手机里的所有的模块了,然后加上画一个电路板,把这些元器件都安装上,接着再工业设计个外壳把电路板和元器件都装在里面,那么一个手机基本是就成型了。
既然手机成型了,那么怎么才能运行出android系统呢?怎么才能使用起这些硬件模块呢?先看一张android的架构图
2、linux驱动
从android架构图可知android最底层跑的是linux操作系统,众所周知,像windows一样,linux操作系统主要是实现了对于最底层的硬件的驱动能力,以及提供一些简单的应用供上层来调用。linux是门大学问,这里肯定也不太展开讲解了,不过对于linux中的一些架构我会在博客专栏“初探linux子系统集”里面与大家分享。言归正转,首先我们来研究下android手机启动的第一步吧,要让芯片工作,那么必须得有启动代码,类似windows有bios,linux系统也有专门的启动代码ubootloader,uboot主要是boot和loader的功能,细节可以参考嵌入式linux那点东东之整体框架,
所谓boot指的是搬代码,引导,主要就是芯片有boot的功能,会自动从flash搬启动代码到内存并执行处理。这里的代码其实就是bootloader的第一个阶段,一般这个阶段会用到EMMC。loarder就是加载各个需要的驱动,像EMMC驱动就是必要的,需要从EMMC把内核代码搬运到内存中跑起来。接着就开始启动linux内核代码了,过程有点复杂,这里可以参考和菜鸟一起学linux内核之引导启动篇,这里主要介绍了内核代码的启动。
3、android系统启动
当linux内核启动完成之后就需要启动android代码了。android的简单启动流程如下图所示:
等到系统都启动完了之后,手机变可以正常使用了,但是底层是linux,那么上层的android是怎么调用到底层的linux来进行数据的交互呢?先来了解下linux上面android下面的hal层。
4、android hal层
hal是hardware abstraction layer的简写,也可说是android和linux的中间件,其主要是由c/c++编写得到的,这一层主要是负责实现硬件的功能和控制,同时又提供了统一的api接口,这样换了底层的linux驱动,照样不用改变android的代码。一般做android的底层开发主要就是针对这一层做修改适配具体的硬件。比如led灯底层换了一个gpio口,那么hal层重新适配上,android app还是可以照样控制的。hal层的功能基本就是这样,那么android framework的java代码是怎么调用hal层的c/c++代码的呢?
5、android 系统运行库
android底层有许多的开源库,像数据库的sqlite啊,网络连接的wpa_supplicant啊,3D绘图的OpenGL|ES啊之类,这些库都是linux下常用的开源库,很好的实现了android的功能。具体可以参考android源码的/external目下的开源库。
6、android jni层
jni是java native interface的简写,允许java和其他语言进行交互,这里主要是和c/c++进行交互,jni的作用不仅仅是为了与hal层打交道从而控制硬件,还可以提升性能。主要是一些算法,一些库是c/c++的,效率也很高,换做java效率肯定变低了,所以借助jni,android应用也可以得到很好的性能提高。像一些游戏就是用的c++的库,这里就不多加介绍了,当然后续还是会实际搞个例子来理解理解。
7、android framework层
framework层很庞大,主要提供了构建应用程序时可能用到的各种api,android自带的一些核心应用就是使用这些api来完成的。对于hal层和jni层还有framework层,app层的一个例子就是我的那篇关于gps的文章:和菜鸟一起学android4.0.3源码之硬件gps简单移植。
8、android app层
这一层就是我们所编写的android app了,上一篇的hello world就是属于这一层,一般的android应用开发也是主要针对这一层而言的。
9、android虚拟机
这里摘抄一份内容,觉得这里讲得不错:android虚拟机。
Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
当一个java程序启动时,一个虚拟机就诞生了,每个android应用程序都运行在自己的dalvikvm实例当中,有几个进程就有几个dalvik虚拟机实例在运行,dalvik虚拟机主要做了两件事:处理jni,提供thread。
好了,对于android的整个系统做了简单的介绍,之后基于这几部分,会有三个博客专栏,初探linux子系统集,android源码学习之路和android开发学习之路。今天评了个准专家,希望16年成为专家!fighting!!!^_^