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. C# 建立UDP服务器并接收客户端数据

    C# 建立UDP服务器并接收客户端数据 2015-02-11 17:20 1218人阅读 评论(0) 收藏 举报  分类: C#开发技术(22)  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  2. 解释一下python中的成员运算符

    通过成员运算符‘in’ 和 ‘not in’,我们可以确认一个值是否是另一个值的成员 print('me' in 'disappointment')#True print('us' in 'disap ...

  3. redhat 9.0安装完不能上网解决办法(补) - 并附上redhat9.0 下载链接

    昨天一位网友Q我,说我的开发环境搭建教程按步骤最后上不了网怎么解决我才突然想起9.0版本在VM7,8中存在问题,于是今天我就简单说下解决的方法. 由于本人习惯使用redhat 9.0版本所以到现在还是 ...

  4. 微信小程序 使用腾讯地图SDK详解及实现步骤

    信小程序 使用腾讯地图SDK详解及实现步骤    微信小程序JavaScript SDK: 官方文档:http://lbs.qq.com/qqmap_wx_jssdk/index.html 步骤: 1 ...

  5. Mac 一键显示所有隐藏文件 不要那么六好吧

    系统应简洁而有效,对一般用户来说这一点尤为重要.不必要让普通用户知道的信息往往会给他们造成困扰,因而,隐藏掉他们便是个不错的选择,既可以保证系统平稳流畅运行,也可以为用户提供友好界面. 对于开发者而言 ...

  6. java zookeeper权限控制ACL(digest,IP)

    java zookeeper权限控制ACL(auth,digest,ip) 学习前请参考:https://www.cnblogs.com/zwcry/p/10407806.html zookeeper ...

  7. npm国内镜像设置

    http://cnodejs.org/topic/4f9904f9407edba21468f31e

  8. Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中

    Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中 在Linux系统中,Tomcat 启动后默认将很多信息都写入到 catalina.out 文件中,我们可以通过tail  ...

  9. oracle 11 g数据库卸载(方法二)

    1.开始->设置->控制面板->管理工具->服务 停止所有 Oracle服务. 2.开始->程序->Oracle - OraHome81->Oracle In ...

  10. m2eclipse插件——添加依赖不显示搜索结果

    使用Eclipse,安装m2eclipse插件之后,选中Maven项目的pom文件,添加依赖,点击“Add Dependency”的时候,输入要检索的jar包名称,search result却一直为空 ...