Android process 的启动流程
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对象。