ART虚拟机启动流程

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容