Android 源码分析 - 系统 - app

Android 源码分析 - 系统 - app,第1张

Android 源码分析 - 系统 - app

App_process用来启动Android runtime。

源代码位于:frameworks/base/cmds/app_process。

Zygote、SystemServer其实都是app_process 进程。

app_process的命令行参数分为四部分:

  1. 传给虚拟机,所有直到“--” 或者不是“-”开头的参数
  2. 父目录,在虚拟机参数后的第一个参数,目前没有使用
  3. 内部参数,一到多个
    1. --zygote                使用孵化器模式启动
    2. --start-system-server   启动系统服务
    3. --application           单独模式启动
    4. --nice-name         进程名称
  4. 其他参数
    1. 孵化器模式,传给孵化器main方法
    2. 非孵化器模式,类名以及其main方法的参数

Runtime的启动由AndroidRuntime类(C++类,libandroid_runtime库中)实现,该类定义实现在:

  1. frameworks/base/include/android_runtime/AndroidRuntime.h
  2. frameworks/base/core/jni/AndroidRuntime.cpp

AndroidRuntime初始化虚拟机完成后,会进入下面两个类之一的main方法

  1. com.android.internal.os.ZygoteInit
  2. com.android.internal.os.RuntimeInit

源代码位于:frameworks/base/core/java/com/android/internal/os。

流程
  • main中初始化并启动AppRuntime(继承AndroidRuntime)
  1. AppRuntime::AppRuntime()
    1. AndroidRuntime::AndroidRuntime()
      1. SkGraphics::Init()【UI系统初始化】
      2. gCurRuntime = this【用于java层回调虚拟方法】
  2. runtime.addVmArguments()【记录传给虚拟机的参数】
  3. 【分析内部参数】
  4. if (!className.isEmpty())
    1. runtime.setClassNameAndArgs()【AppRuntime记录类名和参数】
  5. else
    1. 【参数通过AndroidRuntime start方法传递】
  6. if (niceName && *niceName)
    1. runtime.setArgv0()【直接修改命令行块,假设命令行是连续内存块】
    2. set_process_name()【libcutils】
      1. prctl(PR_SET_NAME)
  7. runtime.start()【类名是ZygoteInit或者RuntimeInit】
  • AndroidRuntime启动java运行时(start)
  1. AndroidRuntime::startVm()
    1. JNI_CreateJavaVM()
  2. AppRuntime::onVmCreated()【虚拟方法,AppRuntime实现】
    1. env->FindClass【找到目标类】
  3. AndroidRuntime::startReg()
    1. androidSetCreateThreadFunc()【设置启动线程函数javaCreateThreadEtc,该函数会在新线程attach java vm】
    2. register_jni_procs()【注册rumtime所有jni函数】
  4. 【将className(ZygoteInit或者RuntimeInit)作为main方法的第一个参数】
  5. env->FindClass()【查找类ZygoteInit或者RuntimeInit】
  6. env->GetStaticMethodID()【获取main方法】
  7. env->CallStaticVoidMethod()【调用main方法】
  8. mJavaVM->DetachCurrentThread()
  9. mJavaVM->DestroyJavaVM()【销毁java vm】
  • RuntimeInit的主方法(main)

上面调用ZygoteInit或者RuntimeInit的main方法,这里只看RuntimeInit,ZygoteInit在zygote小节中分析。推算下来main参数为:

RuntimeInit application|tool

  1. RuntimeInit.main()
    1. if 【如果argv[1] == “application”】
      1. redirectLogStreams()【重定向java系统输出流】
        1. System.setOut(new AndroidPrintStream)
        2. System.setErr(new AndroidPrintStream)
    2. else
      1. tool模式,不需要日志
    3. commonInit()
      1. Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler())
      2. TimezoneGetter.setInstance()
      3. LogManager.getLogManager().reset()
      4. new AndroidConfig【增加AndroidHandler的日志系统】
        1. Logger.getLogger("").addHandler(new AndroidHandler())
    4. nativeFinishInit()
      1. com_android_internal_os_RuntimeInit_nativeFinishInit()
        1. gCurRuntime->onStarted()【调用到AppRuntime虚方法】
          1. ProcessState::startThreadPool()
          2. AndroidRuntime::callMain()【调用目标类的main方法】
            1. env->CallStaticVoidMethod()
          3. IPCThreadState::stopProcess()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4014576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-22
下一篇 2022-10-22

发表评论

登录后才能评论

评论列表(0条)

保存