环境搭建好了,最简单的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系统架构初探的更多相关文章

  1. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  2. Android开发学习之路-Android Studio开发小技巧

    上一次发过了一个介绍Studio的,这里再发一个补充下. 我们都知道,Android Studio的功能是非常强大的,也是很智能的.如果有人告诉你学Android开发要用命令行,你可以告诉他Andro ...

  3. Android开发学习之路--Android Studio项目目录结构简介

    既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...

  4. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  5. Android开发学习之路-Android N新特性-多窗口模式

    我们都知道,在最新的Android N系统中,加入了一个新的功能,就是多窗口模式.多窗口模式允许我们在屏幕上显示两个窗口,每个窗口显示的内容不同,也就是说,我们可以一遍看电视剧,一边聊微信. 这里我们 ...

  6. Android开发学习之路-Android Design Support Library使用(CoordinatorLayout的使用)

    效果图: 上面的这个图有两个效果是,一个是顶部的图片,在上滑之后会隐藏起来并且显示出一个ToolBar(ToolBar类似于ActionBar,但是只有ToolBar是兼容Material Desig ...

  7. Android开发学习之路-Android Studio真神器!

    放假之后电脑配置升级就开始用Android Studio(下面简称AS)了,那个酸爽真的不是一般的啊,这里开一篇博客来记录下AS里面各种酷炫的功能,有更好玩的,大家不要吝啬,评论告诉我吧! 最近And ...

  8. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  9. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

随机推荐

  1. Visual Studio 2015 无法命中断点

    新安装操作系统后发现,vs2015无法命中断点. 在项目中设置生成调试信息:FULL   即可.

  2. 一起来Fit TDMA over WiFi(1)

    1 概述 WiFI TDMA领域,2009年Sam  Leffler在<TDMA for Long Distance Wireless Networks>首次系统提出了TDMA技术方案,并 ...

  3. java 实现WebService

    1.xml    2.    wsdl: webservice description language web服务描述语言        通过xml格式说明调用的地址方法如何调用,可以看错webse ...

  4. UDA机器学习基础—评估指标

    这里举例说明 混淆矩阵  精确率 召回率  F1

  5. MVC简单随笔

    MVC的具体含义是:model+view+controller,即模型+视图+控制它们各自处理自己的任务: (1)模型(model):模型持有所有的数据.状态和程序逻辑.模型独立于视图和控制器.(2) ...

  6. Python中的文件路径的分隔符

    主要是需要考虑分隔符的问题: 在Windows系统下的分隔符是:\ (反斜杠). 在Linux系统下的分隔符是:/(斜杠). 当在字符中出现\时,大家就要考虑到转义字符了. 转义字符的概念,参考维基百 ...

  7. Python中模块之hashlib&hmac的讲解

    hashlib & hmac的讲解 两个模块主要用于加密相关的操作. 1. hashlib模块 md5 具体代码如下 import hashlib ha_m5 = hashlib.md5()# ...

  8. 记录一次widora sdk编译ipk 实战编译redis

      因为业务需求,需要用到redis存储一点简单的数据,因为redis有良好的哈希机制,可以完美实现我的某些需求,但openwrt官方提供memcached的ipk并没有提供redis,没办法,只能自 ...

  9. SecureCRT永久设置保护眼睛配色方案

    配色后效果如下: 下面开始配色 1.选项(Options)==>会话选项(Sessions options)==>终端(Terminal)==>仿真(Emulation) 按图中标注 ...

  10. 数据挖掘_requests模块的get方法

    关于requests模块 之前在跟大家讲通过字典列表批量获取数据的时候用过这个模块 安装过程就不再讲解了 requests模块是python的http库,可以完成绝大部分与http应用相关的工作,所以 ...