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!!!^_^
Android开发学习之路--Android系统架构初探的更多相关文章
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路-Android Studio开发小技巧
上一次发过了一个介绍Studio的,这里再发一个补充下. 我们都知道,Android Studio的功能是非常强大的,也是很智能的.如果有人告诉你学Android开发要用命令行,你可以告诉他Andro ...
- Android开发学习之路--Android Studio项目目录结构简介
既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...
- Android开发学习之路-Android中使用RxJava
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
- Android开发学习之路-Android N新特性-多窗口模式
我们都知道,在最新的Android N系统中,加入了一个新的功能,就是多窗口模式.多窗口模式允许我们在屏幕上显示两个窗口,每个窗口显示的内容不同,也就是说,我们可以一遍看电视剧,一边聊微信. 这里我们 ...
- Android开发学习之路-Android Design Support Library使用(CoordinatorLayout的使用)
效果图: 上面的这个图有两个效果是,一个是顶部的图片,在上滑之后会隐藏起来并且显示出一个ToolBar(ToolBar类似于ActionBar,但是只有ToolBar是兼容Material Desig ...
- Android开发学习之路-Android Studio真神器!
放假之后电脑配置升级就开始用Android Studio(下面简称AS)了,那个酸爽真的不是一般的啊,这里开一篇博客来记录下AS里面各种酷炫的功能,有更好玩的,大家不要吝啬,评论告诉我吧! 最近And ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
随机推荐
- [bzoj4820][Sdoi2017]硬币游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了 ...
- [BZOJ]3672 购票(Noi2014)
革命尚未成功,同志还需努力. Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ ...
- bzoj 1217: [HNOI2003]消防局的设立
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- Python中模块之xml的讲解
xml模块的功能介绍 这里主要讲解xml模块下的etree.ElementTree类. 1. 创建 具体代码如下 import xml.etree.ElementTree as XM namelist ...
- VueJs(4)---V-model指令
V-model指令 摘要 限制: v-model只能用在:<input> <select> <textarea> <components&g ...
- 在Spring Boot中使用数据库事务
我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源(在Spring Boot中输出REST资 ...
- 粗糙的es6 -> es5转换正则集
(r'() => {}','function () {return {}}'), # (r'\{\.\.\.(.+?)\}','Object.assign({}, \\1)') , # (r'( ...
- ubuntu初始化python3+postgresql+uwsgi+nginx+django
一. postgresql 数据库 安装 apt-get update apt-get install postgresql 进入psql客户端 sudo -u postgres psql 创建数据库 ...
- Git之(一)Git是什么
为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...