环境搭建好了,最简单的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. bzoj3930[CQOI2015]选数 容斥原理

    3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1383  Solved: 669[Submit][Status] ...

  2. 以太坊MetaMask钱包插件简介

    MetaMask是一个以太坊钱包插件,虽然只能在Chrome浏览器中使用,但作为以太坊钱包的metamask却很受以太坊开发者欢迎. MetaMask 评价(5★):安装设置:★★★★界面操作:★★★ ...

  3. a标签href无值 onclick事件跳转

    <a href='#'  onclick='gomore()'>更多>></a>  单击无反应 <a href='javascript:void(0)'  o ...

  4. C语言实现的排序

    冒泡排序 比较相邻的两个元素,若顺序不对,则将其调换 通过一遍排序,较大的数会排到最后(沉到底部) 两层循环,外层循环控制遍数,内层循环控制每一遍内的排序. 完整代码: #include<std ...

  5. vs2017 +CUDA 9.0配置

    环境: 1.Win7 64位 旗舰版 2.VS2017 3.CUDA 9.0 安装过程比较简单,直接运行在官网下载的CUDA安装包就可以了. 建议先安装VS,再安装CUDA.这样安装完之后会在VS里直 ...

  6. FJUT第三周寒假作业《第九集,离间计》栈

    第九集,离间计 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d   Problem Description 拥有了 ...

  7. file的基本操作;file的修改

    file的基本操作 # Author:nadech # 文件读写/修改/ #data = open("yesterday",encoding="utf-8"). ...

  8. Node.js 子进程

    稳定性: 3 - 稳定 Node 通过 child_process 模块提供了 popen(3) 数据流. 它能在非阻塞的方式中,通过 stdin, stdout, 和 stderr 传递数据. (请 ...

  9. MySQL where 子句

    MySQL where 子句 我们知道从MySQL表中使用SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是SQL ...

  10. MongoDB 复制(副本集)

    MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...