Android应用程序进程启动过程的源代码分析.docx
《Android应用程序进程启动过程的源代码分析.docx》由会员分享,可在线阅读,更多相关《Android应用程序进程启动过程的源代码分析.docx(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。 Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的main函数,这个main函数就是进程执行消息循环的地方了。Android应用程序框架层创
2、建的应用程序进程天然支持Binder进程间通信机制这个特点应该怎么样理解呢?前面我们在学习Android系统的Binder进程间通信机制时说到,它具有四个组件,分别是驱动程序、守护进程、Client以及Server,其中Server组件在初始化时必须进入一个循环中不断地与Binder驱动程序进行到交互,以便获得Client组件发送的请求,具体可参考Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析一文,但是,当我们在Android应用程序中实现Server组件的时候,我们并没有让进程进入一个循环中去等待Client组件的请求,然而,当Client组件得到这
3、个Server组件的远程接口时,却可以顺利地和Server组件进行进程间通信,这就是因为Android应用程序进程在创建的时候就已经启动了一个线程池来支持Server组件和Binder驱动程序之间的交互了,这样,极大地方便了在Android应用程序中创建Server组件。 在Android应用程序框架层中,是由ActivityManagerService组件负责为Android应用程序创建新的进程的,它本来也是运行在一个独立的进程之中,不过这个进程是在系统启动的过程中创建的。ActivityManagerService组件一般会在什么情况下会为应用程序创建一个新的进程呢?当系统决定要在一个新的
4、进程中启动一个Activity或者Service时,它就会创建一个新的进程了,然后在这个新的进程中启动这个Activity或者Service,具体可以参考Android系统在新进程中启动自定义服务过程(startService)的原理分析、Android应用程序启动过程源代码分析和Android应用程序在新的进程中启动新的Activity的方法和过程分析这三篇文章。 ActivityManagerService启动新的进程是从其成员函数startProcessLocked开始的,在深入分析这个过程之前,我们先来看一下进程创建过程的序列图,然后再详细分析每一个步骤。 点击查看大图 Step 1.
5、 ActivityManagerService.startProcessLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:view plain1. publicfinalclassActivityManagerServiceextendsActivityManagerNative2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback3. 4. .5. 6. privatefinalv
6、oidstartProcessLocked(ProcessRecordapp,7. StringhostingType,StringhostingNameStr)8. 9. .10. 11. try12. intuid=app.info.uid;13. intgids=null;14. try15. gids=mContext.getPackageManager().getPackageGids(16. app.info.packageName);17. catch(PackageManager.NameNotFoundExceptione)18. .19. 20. 21. .22. 23.
7、intdebugFlags=0;24. 25. .26. 27. intpid=Process.start(android.app.ActivityThread,28. mSimpleProcessManagement?app.processName:null,uid,uid,29. gids,debugFlags,null);30. 31. .32. 33. catch(RuntimeExceptione)34. 35. .36. 37. 38. 39. 40. .41. 42. 它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为android.a
8、pp.ActivityThread,这就是进程初始化时要加载的Java类了,把这个类加载到进程之后,就会把它里面的静态成员函数main作为进程的入口点,后面我们会看到。 Step 2. Process.start 这个函数定义在frameworks/base/core/java/android/os/Process.java文件中:view plain1. publicclassProcess2. .3. 4. publicstaticfinalintstart(finalStringprocessClass,5. finalStringniceName,6. intuid,intgid,in
9、tgids,7. intdebugFlags,8. StringzygoteArgs)9. 10. if(supportsProcesses()11. try12. returnstartViaZygote(processClass,niceName,uid,gid,gids,13. debugFlags,zygoteArgs);14. catch(ZygoteStartFailedExex)15. .16. 17. else18. .19. 20. return0;21. 22. 23. 24. .25. 这里的supportsProcesses函数返回值为true,它是一个Native函数
10、,实现在frameworks/base/core/jni/android_util_Process.cpp文件中:view plain1. jbooleanandroid_os_Process_supportsProcesses(JNIEnv*env,jobjectclazz)2. 3. returnProcessState:self()-supportsProcesses();4. ProcessState:supportsProcesses函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:view plain1. boolProces
11、sState:supportsProcesses()const2. 3. returnmDriverFD=0;4. 这里的mDriverFD是设备文件/dev/binder的打开描述符,如果成功打开了这个设备文件,那么它的值就会大于等于0,因此,它的返回值为true。 回到Process.start函数中,它调用startViaZygote函数进一步操作。 Step 3.Process.startViaZygote 这个函数定义在frameworks/base/core/java/android/os/Process.java文件中:view plain1. publicclassProces
12、s2. .3. 4. privatestaticintstartViaZygote(finalStringprocessClass,5. finalStringniceName,6. finalintuid,finalintgid,7. finalintgids,8. intdebugFlags,9. StringextraArgs)10. throwsZygoteStartFailedEx11. intpid;12. 13. synchronized(Process.class)14. ArrayListargsForZygote=newArrayList();15. 16. /-runti
13、me-init,-setuid=,-setgid=,17. /and-setgroups=mustgofirst18. argsForZygote.add(-runtime-init);19. argsForZygote.add(-setuid=+uid);20. argsForZygote.add(-setgid=+gid);21. if(debugFlags&Zygote.DEBUG_ENABLE_SAFEMODE)!=0)22. argsForZygote.add(-enable-safemode);23. 24. if(debugFlags&Zygote.DEBUG_ENABLE_DE
14、BUGGER)!=0)25. argsForZygote.add(-enable-debugger);26. 27. if(debugFlags&Zygote.DEBUG_ENABLE_CHECKJNI)!=0)28. argsForZygote.add(-enable-checkjni);29. 30. if(debugFlags&Zygote.DEBUG_ENABLE_ASSERT)!=0)31. argsForZygote.add(-enable-assert);32. 33. 34. /TODOoptionallyenabledebuger35. /argsForZygote.add(
15、-enable-debugger);36. 37. /-setgroupsisacomma-separatedlist38. if(gids!=null&gids.length0)39. StringBuildersb=newStringBuilder();40. sb.append(-setgroups=);41. 42. intsz=gids.length;43. for(inti=0;isz;i+)44. if(i!=0)45. sb.append(,);46. 47. sb.append(gidsi);48. 49. 50. argsForZygote.add(sb.toString(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 应用程序 进程 启动 过程 源代码 分析
限制150内