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

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

ID:41008647

大小:131.20 KB

页数:26页

时间:2019-08-13

Android应用程序进程启动过程的源代码分析_第1页
Android应用程序进程启动过程的源代码分析_第2页
Android应用程序进程启动过程的源代码分析_第3页
Android应用程序进程启动过程的源代码分析_第4页
Android应用程序进程启动过程的源代码分析_第5页
资源描述:

《Android应用程序进程启动过程的源代码分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

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

2、循环的地方了。Android应用程序框架层创建的应用程序进程天然支持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应用程序创建新的进程的,它本来也是运行在一个独立的进程之中,不过这个进程是在系统启动的过程中创建

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

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

6、tends ActivityManagerNative    2.        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {    3.    4.    ......    5.    1.    private final void startProcessLocked(ProcessRecord app,    2.                String hostingType, String hostingNameStr) {    3.    4.      

7、  ......    5.    6.        try {    7.            int uid = app.info.uid;    8.            int[] gids = null;    9.            try {    10.                gids = mContext.getPackageManager().getPackageGids(    11.                    app.info.packageName);    12.            } catch

8、 (PackageManager.NameNotFo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。