Android 进程管理模型

2016/06/29 Android

前言

Android基于Linux内核,其进程管理模型沿用Linux进程模型,但是由于Goodle为了方便App开发,将进程进行了了封装,应用层几乎看不到进程的概念,开发者接触到的只是组件的概念。

  • 当按下Android设备电源键时究竟发生了什么?
  • Android的启动过程是怎么样的?
  • 什么是Linux内核?
  • 桌面系统linux内核与Android系统linux内核有什么区别?
  • 什么是引导装载程序?
  • 什么是Zygote?
  • 什么是X86以及ARM linux?
  • 什么是init.rc?
  • 什么是系统服务?

Android系统的启动

当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程,init是第一个进程,可以说它是root进程或者说有进程的父进程会启动第一个用户级别的 init进程是Linux内核启动的第一个用户级进程,

<img src=”http://jbcdn2.b0.upaiyun.com/2014/06/e516252bdb5ae1c1798ec9507a060f19.png”/ width=600>

Android进程类型

在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。

  • init进程
  • init.rc中的Service进程
  • zygote进程及守护进程rild、ServiceManager进程等
  • SystemServer及其他系统服务
  • Android Application进程

init进程

当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程,init是第一个进程,可以说它是root进程或者说有进程的父进程会启动第一个用户级别的 init进程是Linux内核启动的第一个用户级进程。init进程是linux系统中用户空间的第一个进程,进程号为1,有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。

Zygote加载进程及守护进程rild、media、ServiceManager进程等

Zygote进程 service zygote /system/bin/app_process -Xzygote /system/bin –zygote
registerZygoteSocket();//登记Listen端口  
startSystemServer();//启动SystemServer  

Zygote进程是Android Java世界的开创者,所有的Java应用程序进程都由Zygote进程创建,在Java中,虚拟机实例会为不同的应用分配不同的内存,Android应用应该尽可能快地启动,但如果Android系统为每一个应用启动不同的Dalvik虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android系统创造了”Zygote”。Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。Zygote是一个虚拟器进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。通常,这些核心类一般是只读的,也是Android SDK或者核心框架的一部分。在Java虚拟机中,每一个实例都有它自己的核心库类文件和堆对象的拷贝。

  • 加载ZygoteInit类,源代码:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  • registerZygoteSocket()为zygote命令连接注册一个服务器套接字。
  • preloadClassed “preloaded-classes”是一个简单的包含一系列需要预加载类的文本文件,你可以在/frameworks/base找到“preloaded-classes”文件。
  • preloadResources() preloadResources也意味着本地主题、布局以及android.R文件中包含的所有东西都会用这个方法加载,在这个阶段,你可以看到启动动画。
ServiceManager守护类进程

init.rc中的Service其实都可以看做是守护进程,他们的父进程都是init。

SystemServer进程
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  

由于配置了参数–start-system-server,因此SystemServer进程会伴随Zygote进程的启动而启动,SystemServer虽然也是又Zygote进程孵化出来,但和普通的应用程序进程的启动方式有所不同,这里是通过调用startSystemServer()函数来启动SystemServer进程的, 与普通的区别是没用通过socke请求开启新进程。

try {  
        //参数解析  
        parsedArgs = new ZygoteConnection.Arguments(args);  
        //打开系统调试属性  
        ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);  
        ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);  
  
        /* 请求fork SystemServer进程*/  
        pid = Zygote.forkSystemServer(  
                parsedArgs.uid, parsedArgs.gid,  
                parsedArgs.gids,  
                parsedArgs.debugFlags,  
                null,  
                parsedArgs.permittedCapabilities,  
                parsedArgs.effectiveCapabilities);  
    } catch (IllegalArgumentException ex) {  
        throw new RuntimeException(ex);  
    } 

系统服务

完成了Zygote进程后,运行环境请求Zygote运行系统服务。系统服务同时使用native以及java编写,系统服务可以认为是一个进程。同一个系统服务在Android SDK可以以System Services形式获得。系统服务包含了所有的System Services。这些服务其实都是运行在SystemServer中,只是添加了一些Binder实体。

核心服务:

  • 启动电源管理器;
  • 创建Activity管理器;
  • 启动电话注册;
  • 启动包管理器;
  • 设置Activity管理服务为系统进程;
  • 启动上下文管理器;
  • 启动系统Context Providers;
  • 启动电池服务;
  • 启动定时管理器;
  • 启动传感服务;
  • 启动窗口管理器;
  • 启动蓝牙服务;
  • 启动挂载服务。
  • 其他服务:

  • 启动状态栏服务;
  • 启动硬件服务;
  • 启动网络状态服务;
  • 启动网络连接服务;
  • 启动通知管理器;
  • 启动设备存储监视服务;
  • 启动定位管理器;
  • 启动搜索服务;
  • 启动剪切板服务;
  • 启动登记服务;
  • 启动壁纸服务;
  • 启动音频服务;
  • 启动耳机监听;
  • 启动AdbSettingsObserver(处理adb命令)。

其实可以从代码中看出:

    Installer installer = null;
    AccountManagerService accountManager = null;
    ContentService contentService = null;
    LightsService lights = null;
    PowerManagerService power = null;
    DisplayManagerService display = null;
    BatteryService battery = null;
    VibratorService vibrator = null;
    AlarmManagerService alarm = null;
    MountService mountService = null;
    NetworkManagementService networkManagement = null;
    NetworkStatsService networkStats = null;
    NetworkPolicyManagerService networkPolicy = null;
    ConnectivityService connectivity = null;
    WifiP2pService wifiP2p = null;
    WifiService wifi = null;
    NsdService serviceDiscovery= null;
    IPackageManager pm = null;
    Context context = null;
    WindowManagerService wm = null;
    BluetoothManagerService bluetooth = null;
    DockObserver dock = null;
    UsbService usb = null;
    SerialService serial = null;
    TwilightService twilight = null;
    UiModeManagerService uiMode = null;
    RecognitionManagerService recognition = null;
    NetworkTimeUpdateService networkTimeUpdater = null;
    CommonTimeManagementService commonTimeMgmtService = null;
    InputManagerService inputManager = null;
    TelephonyRegistry telephonyRegistry = null;

以上服务都是位于SystemServer进程中 ,并且这些服务都没注册到ServiceManager中,ServiceManager中能注册普通Service吗?

参考文档

Inside the Linux boot process
Android启动过程深入解析

Search

    Table of Contents