Android基础知识一(Dalvik虚拟机(DVM)、基本架构、启动过程)

原创 2017年12月12日 08:51:10

本文对部分安卓基础知识的总结:

Dalvik虚拟机(DVM)、Android基本架构、Android的启动过程

一、Dalvik虚拟机(DVM)

(1)Android系统可以简单地完成进程隔离和线程管理,每一个Android应用都在底层会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
(2)Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是专有的文件格式为dex的文件。
在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class),然后打包到jar文件,而后虚拟机会从相应的class文件和jar文件中获取相应的字节码。
Android应用虽然也是使用Java语言编程,但是在编译成class文件之后,还会通过一个工具将应用所有的class文件转换成dex文件,而后Dalvik虚拟机会从其中读取指令和数据。
(3)Dalvik虚拟机主要具有以下特征:
A)专有的dex文件格式。每个应用中会有很多类,编译完成后即会有很多的class文件,class文件中会有大量的冗余信息,而dex文件格式会把所有的class文件内容整合到一个文件中。这样除了减小尺寸,也提高了类的查找速度;增加了对新的操作码的支持;

B)dex的优化。文件结构尽量简洁,使用等长的指令,借以提高解析速度;尽量扩大只读结构的大小,借以提高跨进程的数据共享。

C)基于寄存器。相对于基于堆栈实现的虚拟机,基于寄存器实现的虚拟机虽然在硬件、通用性上要差一些,但是它在代码的执行效率上更胜一筹。
D)一个应用,一个虚拟机实例,一个进程。每一个Android应用都运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等的实现都以来底层操作系统。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多地依赖操作系统的线程调度和管理机制。
不同的应用在不同的进程空间里运行,对不同来源的应用都使用不同的Linux用户来运行,可以更大程度地保护应用的安全和独立运行。


二、Android基本架构

(1)Android其本质就是在标准的linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个Java的application framework,所有的应用都是基于Java的application framework之上。
(2)Android分为四层,从高到低为别是application,application framework,libraries和linux kernal。蓝色的代表java程序,黄色的代码为运行java程序而实现的虚拟机,绿色部分为C/C++语言编写而成的程序库,红色的为linux内核代码。在application franmwork之下,有C/C++的程序库组成,通过JNI完成由Java到C的调用。
Application
所有的应用程序都是使用java语言编写的,每一个应用程序由一个或多个activity组成,activity类似于操作系统上的进程,但是活动比操作系统的进程要更为灵活,与进程类似的是,活动在多种状态之间切换。
利用java的跨平台性质,基于android框架开发的应用程序可以不用编译而运行于任何一台安装有Android系统的平台。
Application framework
通过提供开放的开发平台,android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、向状态栏添加通知。
开发者完全可以利用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布它的功能且任何其它应用程序可以使用这些功能(需要从框架执行的安全限制)。这一机制允许用户替换组件。所有的应用程序其实是一组服务和系统:
A)View:丰富的、可扩展的视图集合,可用于构建一个应用程序。包括列表,网格、文本框、按钮,甚至内嵌的网络浏览器。
B)Content Provider:是应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据。
C)Resource Manager:提供访问非代码资源,如本地化字符串、图形和布局文件。
D)Notification Manager:使所有的应用程序能够在状态栏显示自定义警告。
E)Activity Manager:管理应用程序生命周期,提供通用的导航回退功能。
Libraries
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过android framework暴露够开发者,下面列出一些核心库:
A)系统C库:表示C系统库的BSD衍生,调整为基于嵌入式linux设备。
B)媒体库:基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态文件图像。
C)界面管理:管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层。
D)LibWebCore:新式的web浏览器引用,驱动android浏览器和内嵌的web视图。
E)SGL:基本的2D图形引擎。
F)3D库:基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅。
G)FreeType:位图和矢量字体渲染。
SQLite:所有应用程序都可以使用的强大而轻量级的关系数据库引擎。


三、Android的启动过程
(一、开机加电)

BootLoader进行底层初始化,并加载内核代码,最终调转到内核的boot程序。
(二、Linux内核引导)
1)kernel核心初始化(内存初始化,打开中断,初始化进程表等等)
2)驱动初始化
3)启动内核后台线程
4)安装根文件系统
5)启动第一个用户级进程init
(三、init进程启动)
init进程的程序在system/core/init/init.c里,它是Android系统特有的初始化程序,最终它会以后台进程(daemon)的形式一直存在。该进程主要有以下功能:
1)创建/安装设备文件/进程文件/系统文件节点。
2)解析启动/init.rc和/init.<machine_name>.rc。
3)显示Logo画面。
4)打开Device Socket,Property Socket,child进程通信Socket。
5)执行脚本中指定的命令或动作,启动指定服务,监听特定事件。
6)进入死循环:检查是否有action需要执行,是否需要restart某服务
(四、Native服务启动)
1)Service Manager:Binder服务管理器,管理所有Android系统服务。
2)Zygote:启动Android Dalvik Runtime并负责孵化进程。
(五、Android Runtime启动)
zygote创建并启动Android Runtime(Dalvik属于Runtime的一部分),然后启动System Server进程进行系统初始化。
(六、Android系统初始化)
System Server作为Zygote的第一个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其它服务。其它的Android服务都由System Server启动并允许在该进程空间。
(七、Home启动)
版权声明:本文为博主原创文章,未经博主允许不得转载。

JVM、DVM(Dalvik VM)和ART虚拟机对比

本文在于帮助大家快速的有一定深度的了解Android虚拟机。如果读者期望更加深入的了解相关的内容,可以根据文末给出的参考资料继续往下学习。如果觉得文中内容有什么错误,欢迎读者朋友指正,同时如需要转载请...
  • evan_man
  • evan_man
  • 2016年09月02日 15:31
  • 3575

深入理解Dalvik虚拟机- 解释器的运行机制

Dalvik的指令执行是解释器+JIT的方式,解释器就是虚拟机来对Javac编译出来的字节码,做译码、执行,而不是转化成CPU的指令集,由CPU来做译码,执行。可想而知,解释器的效率是相对较低的,所以...
  • threepigs
  • threepigs
  • 2016年04月06日 00:14
  • 3761

Dalvik虚拟机为新创建对象分配内存的过程分析

在前面一文中,我们分析了Dalvik虚拟机创建Java堆的过程。有了Java堆之后,Dalvik虚拟机就可以在上面为对象分配内存了。在Java堆为对象分配内存需要解决内存碎片和内存不足两个问题。要解决...
  • Luoshengyang
  • Luoshengyang
  • 2014年12月08日 01:00
  • 19353

Dalvik VM (DVM) 与Java VM (JVM)的区别

Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格...
  • x356982611
  • x356982611
  • 2014年03月24日 19:50
  • 9724

Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 ...
  • aj758461601
  • aj758461601
  • 2014年04月23日 13:50
  • 2702

dvm进程,linux进程,应用程序进程是否同一概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。Da...
  • u013628732
  • u013628732
  • 2014年02月21日 14:58
  • 2223

Android内存优化(一)DVM和ART原理初探

要学习Android的内存优化,首先要了解Java虚拟机,此前我用了多篇文章来介绍Java虚拟机的知识,就是为了这个系列做铺垫。在Android开发中我们接触的是与Java虚拟机类似的Dalvik虚拟...
  • itachi85
  • itachi85
  • 2017年06月05日 00:24
  • 3651

深入理解Android之Java虚拟机Dalvik

一、背景这个选题很大,但并不是一开始就有这么高大上的追求。最初之时,只是源于对Xposed的好奇。Xposed几乎是定制ROM的神器软件技术架构或者说方法了。它到底是怎么实现呢?我本意就是想搞明白Xp...
  • Innost
  • Innost
  • 2015年12月22日 09:55
  • 33235

java虚拟机和Dalvik虚拟机的区别,DVM为什么要设计成基于寄存器的!

有人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时...
  • busjb
  • busjb
  • 2014年02月13日 10:46
  • 4723

安卓Dalvik虚拟机学习(1)----Dalvik虚拟机运行原理

安卓Dalvik虚拟机相关知识点总结Java虚拟机与Dalvik虚拟机的区别 Java虚拟机运行的是Java字节码(保存在class文件中),Dalvik运行的是Dalvik字节码(由Java字节码转...
  • u013736724
  • u013736724
  • 2016年11月05日 21:45
  • 568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android基础知识一(Dalvik虚拟机(DVM)、基本架构、启动过程)
举报原因:
原因补充:

(最多只允许输入30个字)