Dalvik 如何启动应用程序
2016-03-15 22:38
363 查看
Android启动加载完内核后,第一个执行的是
当执行一个 Android 应用程序时,
其中
当进程 fork完成后,执行的工作就交给了 Dalvik虚拟机。
Dalvik 虚拟机首先通过
随后,字节码验证器使用
接着虚拟机调用
随后调用
整个过程如下:
Created with Raphaël 2.1.0虚拟机线程装载程序类验证字节码查找主类执行字节码流结束
init进程。
init进程首先要做的是设备初始化工作,然后读取
init.rc文件并启动系统中重要的外部程序
Zygote。
Zygote是 Android 所有进程的孵化器进程,它启动后会首先初始化 Dalvik 虚拟机,然后启动
system_server并进入
Zygote模式,通过
socket等候命令。
当执行一个 Android 应用程序时,
system_server进程通过
Binder IPC方式发送命令给
Zygote。
Zygote收到命令后通过
fork自身创建一个 Dalvik虚拟机的实例来执行应用程序的入口函数。
Zygote提供了三种创建进程的方法:
fork(),创建一个
Zygote进程
forkAndSpecialize(),创建一个非
Zygote进程
forkSystemServer(),创建一个系统服务进程
其中
Zygote进程可以继续
fork其他进程,非
Zygote进程无法
fork其他进程。而系统服务进程终止后,它的子进程也必须终止。
当进程 fork完成后,执行的工作就交给了 Dalvik虚拟机。
Dalvik 虚拟机首先通过
loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个 ClassObject类型的数据结构存储在运行时的环境中,虚拟机使用 gDvm.loadedClasses全局哈希表来存储与查询所有装载进来的类。
随后,字节码验证器使用
dvmVerifyCodeFlow()函数对装入的代码进行校验。
接着虚拟机调用
FindClass()函数查找并装载 main 方法类。
随后调用
dvmInterpret()函数初始化解释器并执行字节码流。
整个过程如下:
Created with Raphaël 2.1.0虚拟机线程装载程序类验证字节码查找主类执行字节码流结束
相关文章推荐
- ECMAScript5的新特性:案例
- leetcode 31. Next Permutation
- 18.ELK实时日志分析平台之Elasticsearch安装配置
- hdu_2670Girl Love Value(dp)
- viewDebugging
- python PIL 操作图片
- get post mysql存储引擎
- iPython的安装过程
- windows下配置java环境变量
- 独立式环境与宿主式环境————《标准C语言指南》读书笔记01
- ****ECMAScript5的新特性:
- 再次写给我们这些浮躁的程序员
- ERROR 2003 (HY000): Can't connect to MySQL server on '223.3.46.114' (111)
- 开始
- html5 视频播放
- 源程序版本管理软件和项目管理软件,Github注册流程
- Android 在Service里面启动Activity
- 简单链表的创建
- Fresco,Retrofit 和 RecyclerView 实现瀑布流
- AngularJS实现鼠标右键事件