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

时间:2022-12-23 19:09:02

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

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启动)