android应用程序进程启动过程的源代码分析

上传人:xzh****18 文档编号:35437874 上传时间:2018-03-15 格式:DOCX 页数:26 大小:131.20KB
返回 下载 相关 举报
android应用程序进程启动过程的源代码分析_第1页
第1页 / 共26页
android应用程序进程启动过程的源代码分析_第2页
第2页 / 共26页
android应用程序进程启动过程的源代码分析_第3页
第3页 / 共26页
android应用程序进程启动过程的源代码分析_第4页
第4页 / 共26页
android应用程序进程启动过程的源代码分析_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《android应用程序进程启动过程的源代码分析》由会员分享,可在线阅读,更多相关《android应用程序进程启动过程的源代码分析(26页珍藏版)》请在金锄头文库上搜索。

1、 Android 应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持 Binder 进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析 Android 应用程序进程创建过程中是如何实现这两个特点的。Android 应用程序框架层创建的应用程序进程的入口函数是 ActivityThread.main 比较好理解,即进程创建完成之后,Android 应用程序框架层就会在这个进程中将 ActivityThread 类加载进来,然后执行它的 main 函数,这个 main 函数就是进程执行消息循环的地方了。A

2、ndroid 应用程序框架层创建的应用程序进程天然支持 Binder 进程间通信机制这个特点应该怎么样理解呢?前面我们在学习 Android 系统的Binder 进程间通信机制时说到,它具有四个组件,分别是驱动程序、守护进程、Client 以及 Server,其中Server 组件在初始化时必须进入一个循环中不断地与 Binder 驱动程序进行到交互,以便获得 Client 组件发送的请求,具体可参考 Android 系统进程间通信(IPC)机制 Binder 中的 Server 启动过程源代码分析一文,但是,当我们在 Android 应用程序中实现 Server 组件的时候,我们并没有让进程

3、进入一个循环中去等待 Client 组件的请求,然而,当 Client 组件得到这个 Server 组件的远程接口时,却可以顺利地和Server 组件进行进程间通信,这就是因为 Android 应用程序进程在创建的时候就已经启动了一个线程池来支持 Server 组件和 Binder 驱动程序之间的交互了,这样,极大地方便了在 Android 应用程序中创建Server 组件。在 Android 应用程序框架层中,是由 ActivityManagerService 组件负责为 Android 应用程序创建新的进程的,它本来也是运行在一个独立的进程之中,不过这个进程是在系统启动的过程中创建的。Ac

4、tivityManagerService 组件一般会在什么情况下会为应用程序创建一个新的进程呢?当系统决定要在一个新的进程中启动一个 Activity 或者 Service 时,它就会创建一个新的进程了,然后在这个新的进程中启动这个 Activity 或者 Service,具体可以参考 Android 系统在新进程中启动自定义服务过程(startService)的原理分析、Android 应用程序启动过程源代码分析和 Android 应用程序在新的进程中启动新的 Activity 的方法和过程分析这三篇文章。ActivityManagerService 启动新的进程是从其成员函数 startP

5、rocessLocked 开始的,在深入分析这个过程之前,我们先来看一下进程创建过程的序列图,然后再详细分析每一个步骤。点击查看大图Step 1. ActivityManagerService.startProcessLocked这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java 文件中:view plain1.public final class ActivityManagerService extends ActivityManagerNative 2. impleme

6、nts Watchdog.Monitor, BatteryStatsImpl.BatteryCallback 3. 4. . 5. 6. private final void startProcessLocked(ProcessRecord app, 7. String hostingType, String hostingNameStr) 8. 9. . 10. 11. try 12. int uid = app.info.uid; 13. int gids = null; 14. try 15. gids = mContext.getPackageManager().getPackageG

7、ids( 16. app.info.packageName); 17. catch (PackageManager.NameNotFoundException e) 18. . 19. 20. 21. . 22. 23. int debugFlags = 0; 24. 25. . 26. 27. int pid = Process.start(“android.app.ActivityThread“, 28. mSimpleProcessManagement ? app.processName : null, uid, uid, 29. gids, debugFlags, null); 30.

8、 31. . 32. 33. catch (RuntimeException e) 34. 35. . 36. 37. 38. 39. 40. . 41. 42. 它调用了 Process.start 函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为“android.app.ActivityThread“,这就是进程初始化时要加载的 Java 类了,把这个类加载到进程之后,就会把它里面的静态成员函数 main 作为进程的入口点,后面我们会看到。Step 2. Process.start 这个函数定义在 frameworks/base/core/java/android/os/Pro

9、cess.java 文件中:view plain1.public class Process 2. . 3. 4. public static final int start(final String processClass, 5. final String niceName, 6. int uid, int gid, int gids, 7. int debugFlags, 8. String zygoteArgs) 9. 10. if (supportsProcesses() 11. try 12. return startViaZygote(processClass, niceName

10、, uid, gid, gids, 13. debugFlags, zygoteArgs); 14. catch (ZygoteStartFailedEx ex) 15. . 16. 17. else 18. . 19. 20. return 0; 21. 22. 23. 24. . 25. 这里的 supportsProcesses 函数返回值为 true,它是一个 Native 函数,实现在frameworks/base/core/jni/android_util_Process.cpp 文件中:view plain1.jboolean android_os_Process_support

11、sProcesses(JNIEnv* env, jobject clazz) 2. 3. return ProcessState:self()-supportsProcesses(); 4. ProcessState:supportsProcesses 函数定义在 frameworks/base/libs/binder/ProcessState.cpp 文件中:view plain1.bool ProcessState:supportsProcesses() const 2. 3. return mDriverFD = 0; 4. 这里的 mDriverFD 是设备文件/dev/binder

12、的打开描述符,如果成功打开了这个设备文件,那么它的值就会大于等于 0,因此,它的返回值为 true。回到 Process.start 函数中,它调用 startViaZygote 函数进一步操作。Step 3. Process.startViaZygote这个函数定义在 frameworks/base/core/java/android/os/Process.java 文件中:view plain1.public class Process 2. . 3. 4. private static int startViaZygote(final String processClass, 5. fi

13、nal String niceName, 6. final int uid, final int gid, 7. final int gids, 8. int debugFlags, 9. String extraArgs) 10. throws ZygoteStartFailedEx 11. int pid; 12. 13. synchronized(Process.class) 14. ArrayList argsForZygote = new ArrayList(); 15. 16. / -runtime-init, -setuid=, -setgid=, 17. / and -setgroups= must go first 18. argsForZygote.add(“-runtime-init“); 19. argsForZygote.add(“-setuid=“ + uid); 20. argsForZygote.add(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 多媒体应用

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号