zoukankan      html  css  js  c++  java
  • Dalvik虚拟机源码解读

    Dalvik虚拟机的入口有两个

    1./Dalvikvm/Main.c

    2.frameworks/base/cmds/app_process.cpp

    这两个文件中都包含main函数  用于创建第一个虚拟机实例  虚拟机作为一种应用程序,运行它是需要main函数的  其中app_peocess.cpp继承了AndroidRuntime.cpp

    /frameworks/base/core/jni/AndroidRuntime.cpp

    第一个是用于开发用的,一般在x86上,开发调试时用。

    第二个是手机等移动设备上用的。区别在于开发时要使用dx工具等,实际手机就是使用android操作系统,运行.apk文件,不需要再做编译等工作。(.apk文件中包含的是.dex文件)

    下面分析第二个入口的源码:

    手机开机的时候就创建一个虚拟机-->初始化这个虚拟机-->开始主线程-->一直运行下去  

    调用的函数:startVm-->JNI_CreateJavaVM()-->start   start函数中调用findClass()和findMeth()进行执行 这个函数时不返回的 作为主线程 

    start函数中会进入Zygote类,并且执行其main函数,函数中加载了Framework的类或者资源用于共享。还使用socket用于监听,什么时候创建其他的虚拟机。Zygote就是一个孵化器,其他的虚拟机实例都是复制的他,同时共享了他的Framework的共享资源(这些资源都在同一个物理区域)。

    Zygote进程复制的第一个虚拟机是Systemserver进程,此进程中有很多线程用于初始化系统服务。

    Zygote是第一个虚拟机实例,当用户运行其他应用程序的时候,系统会复制这个虚拟机,产生第二个虚拟机实例,可以很多个

    大家知道一个虚拟机实例对应一个linux内核进程,系统启动的时候,linux会创建一个系统进程,在这个进程中创建其他的进程,dalvik基于linux多进程就是这个意思。

    在一个虚拟机实例里面有一个主线程,就是上面提到的start函数,这个主线程用于执mian函数。其他线程可以由用户创建,也可以是系统自带的,比如垃圾回收线程。

  • 相关阅读:
    SharePoint和Reporting Services整合 样式问题
    SharePoint2010安装体验(二)
    Moss 文件夹审批
    Moss中的控件—PeoplePicker
    C# 温故而知新:Stream篇(—)
    Entity Framework框架Code First Fluent API
    C# 温故而知新:Stream篇(二)
    扩展RBAC用户角色权限设计方案
    常见C#面试试题
    Spring Cloud之Ribbon负载均衡(Spring Cloud 2020.0.3版)
  • 原文地址:https://www.cnblogs.com/autum/p/dalvik123.html
Copyright © 2011-2022 走看看