美文网首页
基础知识复习 启动过程

基础知识复习 启动过程

作者: 刘景昌 | 来源:发表于2021-03-09 13:57 被阅读0次

    Android系统底层基于Linux Kernel, 当Kernel启动过程会创建init进程, 该进程是所有用户空间的鼻祖, init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖). Zygote进程会创建 system_server进程以及各种app进程,下图是这几个系统重量级进程之间的层级关系。


    image.png

    各大核心进程启动后,都会进入各种对象所相应的main()方法,如下

    进程main方法

    进程 主方法
    init进程 Init.main()
    zygote进程 ZygoteInit.main()
    app_process进程 RuntimeInit.main()
    system_server进程 SystemServer.main()
    app进程 ActivityThread.main()

    主方法介绍
    Init.main()
    init进程(pid=1)是Linux系统中用户空间的第一个进程,主要工作如下:
    创建一块共享内存空间,用于属性服务器
    解析各个rc文件,并启动对应的属性服务进程
    初始化epoll,一次设置signal、property,keychord 这三个fd对应的回调函数
    进入无线循环,执行流程如下
    检查action_quene列表是够为空,若不为空择启动相应的action
    检查是否需要重启进程,若有择将其重新启动
    进入epoll_wait状态 直到新系统属性变化事件(property_set属性值变化),或者收到紫禁城的信号,或者收到键盘输入时间,则会退出等待状态,执行相应的回调函数
    init启动流程


    image.png

    zygote进程
    Zygote是由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。
    Zygote启动流程


    image.png
    解析init.zygote.rc中的参数,创建appRuntime并调用AppRunTime.start方法;
    调用AddroidRuntime的startVm()方法并创建虚拟机,在调用startReg()注册JNI函数;
    通过JNI的方式调用ZygiteInit.mian进入java区域
    通过 registerZygoteSocket()建立Socket通道,zygote作为通信的服务气短,相应客户端的请求;
    preload 预加载通用类,加载color,drawable资源 openGL,共享库、和webView 用于提高app的启动效率
    zygote完成了大部分工作 ,接下来通过startSystemServer()来fork system_server
    进程,也是framework的载体
    zygote 完成所有工作 调用runSelectLoop 进入挂起状态;
    Activity的启动过程
    image.png
    • 首先桌面点击图标 lancher才会用binder IPC 想system_server 发送startActivity请求
    • system_server收到请求后,想Zygote发送创建进程请求
    • zygote通过socket fork一个子进程 就是我们需要的App进程
    • app进程通过BinderIPC 想system_server发送attchApplication请求
    • system_server收到请求后进行一系类准备,然后发送scheduleLaunchActivity通知app进程
    • app进程的binder线程(ApplicationThread)收到消息后通过Handler向主线程发送lancherActivity消息
    • 主线程收到消息 通过反射创建 activity
    • 调用activity的OnCreate方法

    相关文章

      网友评论

          本文标题:基础知识复习 启动过程

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