Android process 的启动流程

1.android启动时所运行的进程:

USER    PID     PPID    VSIZE    RSS    WCHAN         PC              NAME
root  1  0  264   176  c00acc6c  0000c36c        S /init
root    28  1  724   308    c0051354  afe0c4cc  S /system/bin/sh
system  30 1  796   248  c026516c  afe0b74c S /system/bin/servicemanager
root 31  1  1824  316  ffffffff  afe0b50c  S /system/bin/mountd
root    32  1  652   248 c02976e0  afe0c0bc  S /system/bin/debuggerd
radio   33 1 5344  664  ffffffff  afe0bdbc  S /system/bin/rild
root    34  1  71028    18828  c00ad308  afe0b874  S zygote
media   37  1  16812  3456  ffffffff  afe0b74c S /system/bin/mediaserver
root    39  1  788  288  c02f9ae4  afe0b50c  S /system/bin/installd
system  86  34  187756  21836 ffffffff  afe0b74c  S system_server
radio   118  34  103476  13896 ffffffff afe0c824  S com.android.phone
app_4   124 34  117848   19248  ffffffff  afe0c824  S android.process.acore
app_5   139  34  98672   11516  ffffffff  afe0c824  S com.android.mms
app_3   151 34  92096   10976  ffffffff  afe0c824  S com.android.alarmclock
app_6   161  34  94436   12616  ffffffff  afe0c824  S com.android.calendar
app_9   173  34 93248   11728  ffffffff  afe0c824  S android.process.media
app_15  182  34  91848   9764  ffffffff  afe0c824  S com.android.voicedialer
app_16  190 34 94524   10812  ffffffff  afe0c824  S android.process.im

这些进程又被划分为3类:

1 Root Process

2 Native Application Process

3 JAVA Application Process

-------------------------------------

1 Root Process

它是在内核启动以后,最先运行的进程,它的主要任务:

◎解析和执行 init.rc 和 init.%hardware%.rc

◎自动在 /dev 下产生设备节点

◎开启log和property service

◎监视设备,property设置和子进程退出事件。

2 Native Application Process

根据init.rc,初始化过程将产生本地应用程序进程分支。

◎console : 开启 shell.

◎servicemanager : 开启绑定 IPC 服务管理.

◎mountd : 挂载所有的定义在/system/etc/mountd.conf 的fs,从本地的socket接收commands去挂载所有的fs。

◎debuggerd : 开启 debug 系统.

◎rild : 开启radio interface layer daemon.

◎zygote : 开启Android Java VM Runtime 并开启system server. 这是最重要的进程.

◎mediaserver : 开启 AudioFlinger, MediaPlayerService和CameraService.

◎installd : 开始安装 package daemon.

3 JAVA Application Process

java应用程序进程是zygote进程的分支,system_server 是一个特殊的java进程,他直接就是zygote的分支。

其它的java进程由ActivityManagerService(run in system_server process)创建。

如:

int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, ((app.info.flags&ApplicationInfo.FLAG_DEBUGGABLE) != 0), null);

Process.java用UNIX的socket和zygote联系。

全局图如下:

◎System Server

它是zygote运行的第一个java程序,他开启了android的核心服务,如ActivityManager, WindowManager, PackageManager 等。

它是android的核心引擎。

◎Persistent Application

在启动过程中,ActivityManagerService.systemReady 将开始所有的持久稳固的应用程序(persistent applications)。

List apps = ActivityThread.getPackageManager(). getPersistentApplication(PackageManager.GET_SHARED_LIBRARY_FILES); 

if (apps != null) { 

int N = apps.size(); 

int i; 

for (i=0; i<N; i++) { 

ApplicationInfo info = (ApplicationInfo)apps.get(i); 

if (info != null && !info.packageName.equals("android")) { 

addAppLocked(info); 

}
}
}

而此时,只有phone应用程序在AndroidManifest.xml 中以persistent app的形式注册过。

<application android:name="PhoneApp" 

android:persistent="true" 

android:label="@string/dialerIconLabel" 

android:icon="@drawable/ic_launcher_phone"> 

所以在启动过程中,只有phone应用程序是自动执行的。即“com.android.phone”进程。

◎The First Activity

第一个activity的执行是由ActivityManagerService送来的Intent.CATEGORY_HOME 意图所引起的。

Intent intent = new Intent( mTopAction, mTopData != null ? Uri.parse(mTopData) : null); 

intent.setComponent(mTopComponent); 

if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { 

intent.addCategory(Intent.CATEGORY_HOME ); 

} 

ActivityInfo aInfo = intent.resolveActivityInfo(mContext.getPackageManager(), PackageManager.GET_SHARED_LIBRARY_FILES); 

if (aInfo != null) { 

intent.setComponent(new ComponentName( aInfo.applicationInfo.packageName, aInfo.name)); 

// Don't do this if the home app is currently being instrumented.

ProcessRecord app = getProcessRecordLocked(aInfo.processName, 

aInfo.applicationInfo.uid); 

if (app == null || app.instrumentationClass == null) { 

intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); 

startActivityLocked(null, intent, null, null, 0, aInfo, 

null, null, 0, 0, 0, false); 

}
}

它是“android.process.acore”进程。进程名是在AndroidManifest.xml中定义的。

◎Auto-launched Application After Booting

当activity idle (Idle()功能该函数在用户每次活动(例如,按键盘、移动鼠标等)后重置定时器,n秒后触发应用对象的Idle事件。)

被ActivityManagerService检测到,它立即broadcast ACTION_BOOT_COMPLETED 意图。

if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { 

// Tell anyone interested that we are done booting! 

synchronized (this) { 

broadcastIntentLocked(null, null, 

new Intent(Intent.ACTION_BOOT_COMPLETED , null), 

null, null, 0, null, null, 

android.Manifest.permission.RECEIVE_BOOT_COMPLETED, 

false, false, MY_PID, Process.SYSTEM_UID); 

} 

} 

此时,MMS, AlarmClock, Calendar, MediaProvider, VoiceDialer 和 IM 已经作为ACTION_BOOT_COMPLETED意图的接受者在AndroidManifest.xml中注册过了。所以他们将被自动激发执行。

Email 也是作为ACTION_BOOT_COMPLETED 意图的接受者在AndroidManifest.xml注册了, 但它定义了android:enable=”false”. 所以它不会被自动激发执行。

<receiver android:name=".service.BootReceiver" android:enabled="false" > 

<intent-filter> 

<action android:name="android.intent.action.BOOT_COMPLETED" /> 

</intent-filter> 

<intent-filter> 

<action android:name="android.intent.action.DEVICE_STORAGE_LOW" /> 

</intent-filter> 

<intent-filter> 

<action android:name="android.intent.action.DEVICE_STORAGE_OK" /> 

</intent-filter> 

</receiver> 

DownloadProvider同Email,它定义了android:exported=”false”所以也不会被自动执行。

<receiver android:name=".DownloadReceiver" android:exported="false" > 

<intent-filter> 

<action android:name="android.intent.action.BOOT_COMPLETED" /> 

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 

</intent-filter> 

</receiver> 

◎Behind the JAVA process

system_server是一个特殊情况,它呼叫ActivityThread.java 的systemMain静态函数,这个静态函数创建了一个ActivityThread. ActivityThread的实例,继而创建ApplicationThread, Application 和 ApplicationContext的实例。

每个其他的java进程都以不同的方式工作,它们受system_server 的控制,system_server 又是zygote的分支。所有是zygote分支的的java进程除了system_server,都会自动的呼叫ActivityThread.java 的main静态函数。

try { 

ZygoteInit.invokeStaticMain(cloader, className, mainArgs); 

} catch (RuntimeException ex) { 

logAndPrintError (newStderr, "Error starting. ", ex); 

} 

ActivityThread.java的main静态函数创建了一个ActivityThread实例。ActivityThread然后创建了一个ApplicationThread的实例。ApplicationThread将以IBinder对象的形式工作,并和system_server中的ActivityManagerService相互作用。新的进程此时其它的事不做,专门等待system_server过来的IPC的呼叫。 Application 和 ApplicationContext 的对象此时也不会创建。事实上它会推迟到当进程真正工作的时候,如开始一个activity,接受intent或者开始一个service时才创建。

例如:当开始一个activity时,ActivityManagerService知道activity需要在哪个进程中执行,然后他将RPC呼叫ApplicationThread的scheduleLaunchActivity,并在那个进程中执行这个新的activity。然后ApplicationThreadpost一个消息,让ActivityThread知道它需要启动一个activity。ActivityThread然后创建Application 和 ApplicationContext 对象.再然后,他呼叫Instrumentation。最后Instrumentation呼叫JAVA dalvik VM 去准备创建一个activity java对象。

Android process 的启动流程的更多相关文章

  1. Android开机动画启动流程

    android开机动画启动流程   从android的Surface Flinger服务启动分析知道,开机动画是在SurfaceFlinger实例通过调用startBootAnim()启动的. 下面我 ...

  2. Cocos2d-x3.3RC0的Android编译Activity启动流程分析

    本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...

  3. Android的开机启动流程

    1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...

  4. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...

  5. Android之Activity启动流程详解(基于api28)

    前言 Activity作为Android四大组件之一,他的启动绝对没有那么简单.这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程.activity的启动流程随着版本的更替,代码细节一直 ...

  6. 关于Android系统的启动流程

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

  7. Android的Launcher启动流程 “Launcher部分启动流程”

    研究代码从:AndroidManifest.xml.自定义的Application.java开始. Android系统启动时,系统需要一个Home应用程序来负责将这些应用程序展示出来:也就是该应用的目 ...

  8. Android系统的启动流程

    手机启动后首先会通过执行BootLoader来启动Linux内核,BootLoader是所有嵌入式设备开机启动执行的第一行代码,linux内核在启动过程中会加载各种设备的驱动同时初始化数据结构,并且开 ...

  9. Android N 的开机启动流程概述

    原地址:https://blog.csdn.net/h655370/article/details/77727554 图片展示了Android的五层架构,从上到下依次是:应用层,应用框架层,库层,运行 ...

随机推荐

  1. 分页和Cookie、Session

    分页和Cookie.Session 分页 自定义分页 函数班 from django.shortcuts import render # Create your views here. data = ...

  2. 【教程】Microsoft Visual Studio 2015 安装Android SDK

    http://blog.sina.com.cn/s/blog_51f9ffaa0102vuhy.html Hi,大家好,自vs2015发布后,有很多小伙伴尝试使用VS2015开发安卓,由于是新手,一折 ...

  3. tomcat web工程 jar包冲突解决方法

    目前在部署工程时,遇到了一个问题,报错信息如下: See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet ...

  4. MAC brew软件安装

    之前一直怀念ubuntu下的apt-get,因为实在是方便,需要安装什么,一个命令搞定,相关的依赖包统统由apt-get维护.下载,编译,安装,那叫一个痛快.什么软件用着不爽,一个命令卸载! 怀念ap ...

  5. JAVA 对象序列化——Serializable(转)

    文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...

  6. 移动端1px的border

    移动端浏览器解决1px的底部border问题 1.使用border:1px solid #e0e0e0. 在不同设备下由于devicePixelRatio不同导致1px实际显示的长度不同.所以在移动端 ...

  7. python中数据类型转换

    python中list和str互转   1.list转str 假设有一个名为test_list的list,转换后的str名为test_str 则转换方法: test_str = "" ...

  8. [转]浅谈Hive vs. HBase 区别在哪里

    浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...

  9. MySQL-5.7密码策略及用户资源限制

    1.密码策略 在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件.支持密码的强度要求. (1)安装插件 [root@localhost ~]# ll /usr/ ...

  10. Linux静默安装Oracle

    打算在云服务器上装oracle服务,以前DBA美眉都是在图形化界面下安装,这次抓瞎了.赶紧上网查查,静默安装可以解决问题.于是乎赶紧开始部署,过程如下.安装环境:操作系统:CentOS 7内存:11G ...