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对象。

时间: 2024-08-07 02:43:06

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

[Android][Framework]Activity启动流程

开始 从Launcher点击一个App图标,会触发如下动作: LauncherActivity.java protected void (ListView l, View v, int position, long id) { Intent intent = intentForPosition(position); startActivity(intent);} 走到了 Activity.java 的startActivity相关方法: public void startActivity(Int

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

本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXV4aWt1b18x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDov

关于Android系统的启动流程

当按下Android设备电源键时究竟发生了什么?Android的启动过程是怎么样的?什么是Linux内核?桌面系统linux内核与Android系统linux内核有什么区别?什么是引导装载程序?什么是Zygote?什么是X86以及ARM linux?什么是init.rc?什么是系统服务?当我们想到Android启动过程时,脑海中总是冒出很多疑问.本文将介绍Android的启动过程,希望能帮助你找到上面这些问题的答案. Android是一个基于Linux的开源操作系统.x86(x86是一系列的基于

android开机动画启动流程

从android的Surface Flinger服务启动分析知道,开机动画是在SurfaceFlinger实例通过调用startBootAnim()启动的. 下面我们就一起学习BootAnim是如何启动和结束的,我精读代码前都喜欢先描出框架图,以此图为基础再去研读会达到事半功倍的效果.好吧,直接上图. 内核起来后会启动第一个进程,即init进程. init进程会根据init.rc配置启动surfaceflinger进程. service surfaceflinger /system/bin/su

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

研究代码从:AndroidManifest.xml.自定义的Application.java开始. Android系统启动时,系统需要一个Home应用程序来负责将这些应用程序展示出来:也就是该应用的目的在于:Android系统启动后,第一个启动的应用程序.在Android系统中,这个默认的Home应用程序就是Launcher. 要把某个应用程序作为Home,只需要在Android.xml文件中添加一个category: <intent-filter> <action android:na

Android Framework Boot Up Overview(Android系统框架启动流程概述)

目录章节: 1.Framework运行环境 2.zygote的启动 3.SystemServer进程的启动 4.启动第一个Activity 概述图: 由于将PPT格式转换为博客内容相当花费时间,请对详细介绍内容感兴趣的同学直接下载文档: AndroidFrameworkBootUpOverview 参考: Android内核剖析-柯元旦(推荐)

Android Application启动流程

转载:http://www.51testing.com/html/34/n-3725434.html  ?      先对整体有了一个基本的认识之后,再去看细节 谈到Android Application的启动流程,很多文章都是各种源码类和方法的一堆调用关系,这样的文章就算看一百遍,也只是云里雾里.源码得看,但是最好不要一下子深陷到源码的细节之中,不可自拔.这里站在前人的基础之上做一个总结. 在说应用的启动流程之前,得先了解一下Android系统的启动流程,因为Application的启动是离不

Android系统启动--&gt;应用启动--&gt;界面的展示(一)

参考资料: 1,老罗的Android之旅http://blog.csdn.net/luoshengyang/article/details/6689748 2,Android核心分析http://www.linuxidc.com/Linux/2011-04/33966.htm Android系统的启动: 我们想来一张系统架构图: 一,上面用Git下载编译过程略掉,直接看最后我们Build 的产物. Build 的产物中最重要的是三个镜像文件,位于 /out/target/product/<pro

android源码解析之(十四)--&gt;Activity启动流程

好吧,终于要开始讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍: An activity represents a single screen with a user interface. For example, an email appl