总纲

作者: 莫库施勒 | 来源:发表于2019-05-24 16:20 被阅读0次

    框架

    android 体系架构图

    Android系统体系架构分为5层,自顶而下分别是:

    • 应用程序框架(Application Framework)
    • 进程通信层(Binder IPC)
    • 系统服务层(Android System Services)
    • 硬件抽象层(HAL)
      -- HAL 定义了一个标准接口用于硬件厂商的实现. HAL允许功能实现,而不会影响或修改上层的系统。HAL的实现被打包成模块(.so)文件,并在适当的时候被加载进Android系统。
    • Linux内核(Linux Kernel)

    启动概述

    启动概述
    Android系统底层基于Linux Kernel, 当Kernel启动过程会创建init进程, 该进程是所有用户空间的鼻祖, init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖). Zygote进程会创建 system_server进程以及各种app进程,同时我们应该注意这里的 socket 通信binder 通信

    init启动

    Kernel启动后,在用户空间启动init进程(init进程是Linux系统中用户空间的第一个进程,进程号固定为1),调用init中的main()方法执行init进程的职责,主要包括四部分:

    • 信号处理 signal_handler_init()
      -- 初始化signal句柄;
      -- 循环处理子进程;
      -- 注册epoll句柄;
      -- 处理子进程的终止;
    • 解析并运行所有的init.rc相关文件,根据rc文件,生成相应的设备驱动节点
      -- rc文件主要包含Action、Service、Command、Options,其中对于Action和Service的名称都是唯一的,对于重复的命名视为无效。
    • 启动服务


      服务启动流程
    • 属性服务。
      -- 当某个进程A,通过property_set()修改属性值后,init进程会检查访问权限,当权限满足要求后,则更改相应的属性值,属性值一旦改变则会触发相应的触发器(即rc文件中的on开头的语句),在Android Shared Memmory(共享内存区域)中有一个system_property_area区域,里面记录着所有的属性值。对于进程A通过property_get()方法,获取的也是该共享内存区域的属性值。

    init进程执行的大体过程

    • 创建一块共享内存空间,用于属性服务器
    • 解析各个rc文件,并启动相应属性服务进程
    • 初始化epoll,依次设置signal、property、keychord这3个fd可读时相对应的回调函数
    • 循环执行如下:
      -- 检查action_queue列表是否为空,若不为空则执行相应的action
      -- 检查是否需要重启的进程,若有则将其重新启动
      -- 进入epoll_wait等待状态,直到系统属性变化事件(property_set改变属性值),或者收到子进程的信号SIGCHLD,再或者keychord 键盘输入事件,则会退出等待状态,执行相应的回调函数

    Zygote 启动

    • 它是android系统第一个java进程,是所有java进程的父进程,由于Android应用程序运行在各自独立的Dalvik虚拟机中,如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,则会大大降低系统性能,因此Android首先创建一个zygote虚拟机,然后通过它孵化出其他的虚拟机进程,进而共享虚拟机内存和框架层资源,这样大幅度提高应用程序的启动和运行速度。
    • 也就是说, Zygote进程会事先将应用程序要使用的Android Framework中的类与资源加载到内存中, 并组织形成所用资源的链接信息. 这样, 新运行的Android应用程序在使用所需资源时不必每次形成资源的链接信息, 这样就大大提升了程序的运行时间.
    • Zygote进程就是init进程fork出来的. 但是, Zygote是由java编写而成的, 所以也要先初始化虚拟机, 由app_process进程装载并运行ZygoteInit类. 大体过程如下:app_process创建一个AppRuntime变量,然后调用它的start成员函数, 由于AppRuntime类没有重写start函数, 所以调用的是其父类AndroidRuntime中的start函数. 在这个start函数中, 它干了三件事: 一是调用函数startVM启动虚拟机,二是调用函数startReg注册运行ZygoteInit时需要调用的JNI本地方法,三是调用了com.android.internal.os.ZygoteInit类的main函数.

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

    Zygote 调用流程图
    • 创建AppRuntime 并调用 AppRuntime.start() 方法
    • 在 Runtime 中 startVM() 创建虚拟机, startReg() 注册 JNI 函数
    • 通过 JNI 调用 ZygoteInit.main() ,进入 Java 环境
    • registerZygoteSocket()建立socket通道。(zygote作为通信的服务端,用于响应客户端请求)
    • preload() 预加载通用类、drawable和color 资源、openGL、共享库、WebView
    • startSystemServer() fork 出system_server 进程
    • 调用 runSelectLoop() 等待新的请求来将其唤醒并执行新的工作

    总结

    1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
    2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。
    3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。

    SystemServe 启动

    StartSystemServer1.jpg
    • 首先fork出一个子进程
    • 初始化并配置zygote进程
    • 由于startSystemServer起始于main 方法,通过抛出 MethodAndArgsCaller 异常来回到main方法,从而进入到 SystemServer.main() 方法
      注:
    // ZygoteInit.java
    public static void main(String argv[]) {
        try {
            startSystemServer(abiList, socketName);//启动system_server
            ....
        } catch (MethodAndArgsCaller caller) {
            caller.run(); //【见小节13】
        } catch (RuntimeException ex) {
            closeServerSocket();
            throw ex;
        }
    }
    public static class MethodAndArgsCaller extends Exception implements Runnable {
        public void run() {
            try {
                //根据传递过来的参数,可知此处通过反射机制调用的是SystemServer.main()方法
                mMethod.invoke(null, new Object[] { mArgs });
            } catch (IllegalAccessException ex) {
                throw new RuntimeException(ex);
            } catch (InvocationTargetException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException) cause;
                } else if (cause instanceof Error) {
                    throw (Error) cause;
                }
                throw new RuntimeException(ex);
            }
        }
    }
    

    SystemServer 的main方法会启动一系列的Service 如: ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务和BatteryService,UsageStatsService,WebViewUpdateService等核心服务。
    到此, System_server主线程的启动工作总算完成, 进入Looper.loop()状态,等待其他线程通过handler发送消息到主线再处理.


    system_server 启动流程

    简单解析如下:

    • Phase0 引导四大服务:ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService
    • Phase100 回调服务 :PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService、DropBoxManagerService、FingerprintService、LauncherAppsService
    • Phase480 回调服务:DevicePolicyManagerService
    • Phase500 核心系统服务:WindowManagerService.systemReady()、PowerManagerService.systemReady()、PackageManagerService.systemReady()、DisplayManagerService.systemReady(),然后是AMS.systemReady
    • Phase550 准备就绪
    • Phase600 各种服务的systemRunning:
    • Phase1000 启动就绪
      这个过程启动的服务包括引导服务(7个)、核心服务(3个)、其他服务(70个+)

    AMS (ActivityManagerService)启动

    在SystemServer中启动的服务startBootstrapServices中包括了 AMS SystemServiceManager.startService(ActivityManagerService.Lifecycle.class)
    主要流程包括:

    • 创建AMS实例,包括Android Runtime、ActivityThread、Context对象等
    • setSystemProces,将创建的AMS、meminfo、cpuinfo等注册到ServiceManager中
      -- 这册 binder 服务,如: activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo、usagestats等
    • installSystemProviders,安装系统provider,并创建CoreSettingsObserver,来监控settings的变化
    • 启动systemUI,调用相应服务的systemReady
      -- startProcessLocked()过程对于非persistent进程必须等待mProcessesReady = true才会真正创建进程,否则进程放入mProcessesOnHold队列。例外包括:addAppLocked、finishBooting、cleanUpApplicationRecordLock、attachApplicationLocked,还有processNextBroadcast对于flag为 FLAG_RECEIVER_BOOT_UPGRADE的广播,一般情况下mProcessesReady在没有ready前,则基本没有应用进程

    //TODO:Activity启动

    相关文章

      网友评论

          本文标题:总纲

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