美文网首页
ART虚拟机启动流程

ART虚拟机启动流程

作者: dumphex | 来源:发表于2018-01-24 20:25 被阅读0次

    ART虚拟机启动的流程非常复杂,这里先将涉及到的各个模块列个提纲。后续再详细分析各个子模块。

    总之,看虚拟机的启动流程,紧紧抓住下面这条主线即可。


    vm_startup.jpg

    init

    init.rc

    • source

      • system/core/rootdir/init.rc
    • import zygote的资源文件

      ... ...
      import /init.${ro.zygote}.rc
      ... ...
      
    • angler board的值如下

      • ${ro.zygote}在build/target/product/core_64_bit.mk中定义
        # Set the zygote property to select the 64-bit primary, 32-bit secondary script
        
        # This line must be parsed before the one in core_minimal.mk
        
        PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.zygote=zygote64_32
        
      • 获取ro.zygote属性
        angler:/ # getprop ro.zygote
        zygote64_32
        

    init.zygote*.rc

    • source
      • system/core/rootdir/init.zygote64_32.rc
    • 内容
      service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
        class main
        priority -20
        user root
        group root readproc
        socket zygote stream 660 root system
        onrestart write /sys/android_power/request_state wake
        onrestart write /sys/power/state on
        onrestart restart audioserver
        onrestart restart cameraserver
        onrestart restart media
        onrestart restart netd
        onrestart restart wificond
        writepid /dev/cpuset/foreground/tasks
      
      service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
        class main
        priority -20
        user root
        group root readproc
        socket zygote_secondary stream 660 root system
        onrestart restart zygote
        writepid /dev/cpuset/foreground/tasks
      

    app_process

    source

    • frameworks/base/cmds/app_process/app_main.cpp
    • Android.mk
      LOCAL_MODULE:= app_process
      LOCAL_MULTILIB := both
      LOCAL_MODULE_STEM_32 := app_process32
      LOCAL_MODULE_STEM_64 := app_process64
      

    流程

    • 创建AppRuntime对象
      AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
      
    • 解析参数
    • runtime.start
      • runtime.start("com.android.internal.os.ZygoteInit", args, zygote)
      • runtime.start("com.android.internal.os.RuntimeInit", args, zygote)

    AndroidRuntime

    source

    • frameworks/base/core/jni/include/android_runtime/AndroidRuntime.h
    • frameworks/base/core/jni/AndroidRuntime.cpp

    AndroidRuntime::start()流程

    • 初始化JNI

      JniInvocation jni_invocation;
      jni_invocation.Init(NULL);
      
    • startVm(&mJavaVM, &env, zygote)

      • 构造ART VM参数(dalvik property)
      • JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs)
        • 通过JNI创建ART虚拟机
    • onVmCreated()

      • AppRuntime::onVmCreated()
    • startReg()

      • androidSetCreateThreadFunc()
      • env->PushLocalFrame(200)
      • register_jni_procs()
        • register_com_android_internal_os_RuntimeInit()
        • register_com_android_internal_os_ZygoteInit()
        • ... ...
      • env->PopLocalFrame(NULL)
    • 进入Java main()

      • env->FindClass(slashClassName)
      • env->GetStaticMethodID()
      • env->CallStaticVoidMethod(startClass, startMeth, strArray);

    libnativehelper

    source

    • libnativehelper/include/nativehelper/jni.h
    • libnativehelper/include/nativehelper/JniInvocation.h
    • libnativehelper/JniInvocation.cpp

    代码

    • JniInvocation::Init()

      • dlopen("libart.so")
      • JniInvocation::FindSymbol()
        • JNI_GetDefaultJavaVMInitArgs_(JNI_GetDefaultJavaVMInitArgs)
        • JNI_CreateJavaVM_(JNI_CreateJavaVM)
        • JNI_GetCreatedJavaVMs_(JNI_GetCreatedJavaVMs)
    • JniInvocation::JNI_CreateJavaVM

      jint JniInvocation::JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
        return JNI_CreateJavaVM_(p_vm, p_env, vm_args);
      }
      

    ART

    source

    • art/runtime/java_vm_ext.cc
    • art/runtime/runtime.cc

    流程

    art::JNI_CreateJavaVM()

    Runtime::Create()

    • Runtime::ParseOptions()

      • ParsedOptions::Parse()
        • ParsedOptions::Parse()
          • ParsedOptions::DoParse()
            • ParsedOptions::ProcessSpecialOptions()
            • parser->Parse(argv_list)
            • 设置BootClassPath/Image等
    • Runtime::Create()

      • instance_ = new Runtime()
      • Runtime::Init()
        • MemMap::Init()
        • QuasiAtomic::Startup()
        • oat_file_manager_ = new OatFileManager
        • monitor相关
          • Monitor::Init()
          • monitor_list_ = new MonitorList
          • monitor_pool_ = MonitorPool::Create()
        • thread_list_ = new ThreadList()
        • intern_table_ = new InternTable
        • heap_ = new gc::Heap()
        • jit_options_.reset()
        • fault_manager
          • BlockSignals()
          • InitPlatformSignalHandlers()
          • fault_manager.Init()
          • new StackOverflowHandler(&fault_manager)
          • new NullPointerHandler(&fault_manager)
        • java_vm_ = JavaVMExt::Create()
        • Thread::Startup()
        • Thread::Attach("main")
        • class_linker_
          • class_linker_ = new ClassLinker(intern_table_)
          • GetHeap()->HasBootImageSpace()
            • InitFromBootImage()
            • InitWithoutImage()
        • verifier::MethodVerifier::Init()
        • plugin.Load()
        • agent.Load()
    • Thread::Attach()

      • new Thread()
      • Thread::Init()
        • JNIEnvExt::Create()
          • new JNIEnvExt()
            • GetFunctionTable()
            • GetJniNativeInterface()
              • gJniNativeInterface
                • JNI::FindClass()
                • JNI::RegisterNatives()
                • ... ...
      • self->InitStringEntryPoints()
      • SetState(kNative)

    Runtime::Start()

    • self->TransitionFromRunnableToSuspended(kNative)

    • InitNativeMethods()

      • JniConstants::init(env)
      • RegisterRuntimeNativeMethods(env)
        • register_dalvik_system_DexFile(env)
        • register_dalvik_system_VMRuntime(env)
        • register_dalvik_system_ZygoteHooks(env)
        • ... ...
      • WellKnownClasses::Init(env)
        • CacheClass()
        • CacheMethod()
        • CacheField()
        • CachePrimitiveBoxingMethod()
      • java_vm_->LoadNativeLibrary("libjavacore.so")
      • java_vm_->LoadNativeLibrary("libopenjdk.so")
      • WellKnownClasses::LateInit(env)
    • InitThreadGroups(self)

    • Thread::FinishStartup()

    • !IsZygote()

      • T: CreateJit()
      • F: jit::Jit::LoadCompilerLibrary(&error_msg)
    • system_class_loader_ = CreateSystemClassLoader(this);

    • !is_zygote_

      • InitNonZygoteOrPostFork()
    • StartDaemonThreads()

      • env->CallStaticVoidMethod()
        • ReferenceQueueDaemon.INSTANCE.start()
        • FinalizerDaemon.INSTANCE.start()
        • FinalizerWatchdogDaemon.INSTANCE.start()
        • HeapTaskDaemon.INSTANCE.start()

    Runtime::InitNonZygoteOrPostFork()

    非Zygote或zygote fork后的子进程,走到这里会创建和启动jit/signalcatcher/jdwp三个线程。

    • Runtime::InitNonZygoteOrPostFork()
      • Heap::CreateThreadPool()
      • Heap::ResetGcPerformanceInfo()
      • CreateJit()
      • StartSignalCatcher()
      • Dbg::StartJdwp()

    ZygoteInit

    source

    • frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    • frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

    • frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java

    • frameworks/base/core/java/com/android/internal/os/Zygote.java

    • frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

    • libcore/dalvik/src/main/java/dalvik/system/ZygoteHooks.java

      ZygoteInit最终会编译到framework.jar

    main()

    • new ZygoteServer()

    • registerZygoteSocket()

    • preload()

      • beginIcuCachePinning()

      • preloadClasses()

        • 主要是预加载preloaded-classes
          • preloaded-classes在代码库的位置:frameworks/base/preloaded-classes
          • preloaded-classes在手机中的位置:/system/etc/preloaded-classes
          • Android 8.1版本在frameworks/base/config/preloaded-classes
        • new FileInputStream(PRELOADED_CLASSES)
        • new BufferedReader(new InputStreamReader(is), 256)
        • line = br.readLine()
        • Class.forName(line, true, null)
          • classForName()
            • art::Class_classForName()
              • ClassLinker::FindClass()
      • preloadResources()

      • preloadOpenGL()

      • preloadSharedLibraries()

      • preloadTextResources()

    • startSystemServer()

      • Zygote.forkSystemServer()

        • VM_HOOKS.preFork()
          • Daemons.stop()
          • waitUntilAllThreadsStopped()
          • nativePreFork()
        • nativeForkSystemServer()
          • com_android_internal_os_Zygote_nativeForkSystemServer()
            • ForkAndSpecializeCommon()
        • VM_HOOKS.postForkCommon()
          • Daemons.startPostZygoteFork()
            • ReferenceQueueDaemon.INSTANCE.startPostZygoteFork()
            • FinalizerDaemon.INSTANCE.startPostZygoteFork()
            • FinalizerWatchdogDaemon.INSTANCE.startPostZygoteFork()
            • HeapTaskDaemon.INSTANCE.startPostZygoteFork()
      • handleSystemServerProcess()

        • performSystemServerDexOpt()
        • ZygoteInit.zygoteInit()
          • RuntimeInit.commonInit()
          • ZygoteInit.nativeZygoteInit()
            • com_android_internal_os_ZygoteInit_nativeZygoteInit()
              • AppRuntime::onZygoteInit()
                • ProcessState::self()
                • startThreadPool()
          • RuntimeInit.applicationInit()
            • invokeStaticMain()
              • 获取指定类的main()方法
              • throw new Zygote.MethodAndArgsCaller(m, argv)
              • caller.run()
                • mMethod.invoke()
    • zygoteServer.runSelectLoop()

      • runOnce()
        • Zygote.forkAndSpecialize()

          • VM_HOOKS.preFork()
          • nativeForkAndSpecialize()
            • com_android_internal_os_Zygote_nativeForkAndSpecialize()
              • ForkAndSpecializeCommon()
        • VM_HOOKS.postForkCommon()

        • 子进程: handleChildProc()

          这里和前面system_server的处理类似。

          • closeSocket()
          • ZygoteInit.zygoteInit()
        • 父进程: handleParentProc()

    ForkAndSpecializeCommon()

    • ForkAndSpecializeCommon()
      • fork()

    子进程

    • UnsetSigChldHandler()
    • env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, ...)
      • callPostForkChildHooks()
        • VM_HOOKS.postForkChild()
          • nativePostForkChild()
            • ZygoteHooks_nativePostForkChild()
              • Runtime::InitNonZygoteOrPostFork()

    父进程

    • sigprocmask(SIG_UNBLOCK, &sigchld, nullptr)

    相关文章

      网友评论

          本文标题:ART虚拟机启动流程

          本文链接:https://www.haomeiwen.com/subject/ajcpaxtx.html