写点什么

软件测试 | Dalvik 虚拟机是如何执行程序的

  • 2023-06-13
    北京
  • 本文字数:767 字

    阅读完需:约 3 分钟

获取更多学习资料

Android 系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独立分发、容易收敛问题和错误等优点。Android 系统由 Linux 内核、函数库、Android 运行时、应用程序框架以及应用程序组成。如图 3-4 的 Android 系统架构所示,Dalvik 虚拟机属于 Android 运行时环境,它与一些核心库共同承担 Android 应用程序的运行工作。

Android 系统启动加载完内核后,第一个执行的是 init 进程,init 进程首先要做的是设备的初始化工作,然后读取 inic.rc 文件并启动系统中的重要外部程序 Zygote.Zygote 进程是 Android 所有进程的孵化器进程,它启动后会首先初始化 Dalvik 虚拟机,然后启动 system_server 并进入 Zygote 模式,通过 socket 等候命令。当执行一个 Android 应用程序时,system_server 进程通过 socket 方式发送命令给 Zygote,Zygote 收到命令后通过 fork 自身创建一个 Dalvik 虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。整个流程如图 3-5 所示。

Zygote 提供了三种创建进程的方法:

fork(),创建一个 Zygote 进程;

forkAndSpecialize(),创建一个非 Zygote 进程;

forkSystemServer(),创建一个系统服务进程。

其中,Zygote 进程可以再 fork()出其他进程,非 Zygote 进程则不能 fork 其他进程,而系统服务进程在终止后它的子进程也必须终止。

当进程 fork 成功后,执行的工作就交给了 Dalvik 虚拟机。Dalvik 虚拟机首先通过 loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个 ClassObject 类型的数据结构存储在运行时环境中,虚拟机使用 gDvm.loadedClass 全局哈希表来存储与查询所有装在进来的类,随后,字节码验证器使用 dvmVerifyCodeFlow()函数对装入的代码进行校验,接着虚拟机调用 FindClass()函数查找并装载 main 方法类,随后调用 dvmInterpret()函数初始化解释器并执行字节码流。整个过程如图 3-6 所示。

搜索微信公众号:霍格沃兹测试学院

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | Dalvik虚拟机是如何执行程序的_测试_测吧(北京)科技有限公司_InfoQ写作社区