通过源码分析一个linux进程可以运行多个android应用
2016-09-07 20:57
931 查看
android是运行在linux系统上的,一个android应用在启动的时候会会创建自己的进程,创建自己的任务栈,下面通过源码来查看系统是依据什么来创建一个应用的进程的.
1.系统首先通过下面的代码来判断进程是否存在,这个段代码位于ActivityStack.startSpecificActivityLocked方法中,这个方法在系统源码的frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中
这个方法需要的就是processName,和uid.processname就是acitiviy在清单文件中配置的process属性,如果没有配置就使用的包名,每个应用都一个唯一的uid.系统就通过这2个参数来判断该应用的进程是否存在.
2.然后在通过ActivityManagerService.startProcessLocked来创建进程,该方法位于frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中
“`这个方法首先也是调用getProcessRecordLocked(processName, info.uid);判断以processName+uid命名的进程是否存在,如果不存在就通过new ProcessRecordLocked(null, info, processName)创建一个ProcessRecord赋值给app,然后调用startProcessLocked(app, hostingType, hostingNameStr)进一步操作,在这个方法中就会创建出新的进程.
3.通过上面的分析可以知道,如果想要让多个应用运行在同一个进程中,只要在清单文件的activity中将process和uid指定一样的就会运行在同一个进程中了.
1.系统首先通过下面的代码来判断进程是否存在,这个段代码位于ActivityStack.startSpecificActivityLocked方法中,这个方法在系统源码的frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中
mService.getProcessRecordLocked(r.processName, r.info.applicationInfo.uid)
这个方法需要的就是processName,和uid.processname就是acitiviy在清单文件中配置的process属性,如果没有配置就使用的包名,每个应用都一个唯一的uid.系统就通过这2个参数来判断该应用的进程是否存在.
2.然后在通过ActivityManagerService.startProcessLocked来创建进程,该方法位于frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中
public final class ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting) { ProcessRecord app = getProcessRecordLocked(processName, info.uid); String hostingNameStr = hostingName != null ? hostingName.flattenToShortString() : null; if (app == null) { app = new ProcessRecordLocked(null, info, processName); mProcessNames.put(processName, info.uid, app); } else { // If this is a new package in the process, add the package to the list app.addPackage(info.packageName); } startProcessLocked(app, hostingType, hostingNameStr); return (app.pid != 0) ? app : null; } }
“`这个方法首先也是调用getProcessRecordLocked(processName, info.uid);判断以processName+uid命名的进程是否存在,如果不存在就通过new ProcessRecordLocked(null, info, processName)创建一个ProcessRecord赋值给app,然后调用startProcessLocked(app, hostingType, hostingNameStr)进一步操作,在这个方法中就会创建出新的进程.
3.通过上面的分析可以知道,如果想要让多个应用运行在同一个进程中,只要在清单文件的activity中将process和uid指定一样的就会运行在同一个进程中了.
相关文章推荐
- android源码settings中显示所有正在运行进程流程分析
- [Android Pro] 获取手机已经安装的应用 和 获取当前正在运行的所有进程(一个uid对应多个pid)
- 通过对一个病毒源码的分析,了解VBS脚本语言的应用
- Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念以及Dalvik和Java运行环境的区别
- [Android Pro] 获取手机已经安装的应用 和 获取当前正在运行的所有进程(一个uid对应多个pid)
- android源码settings中显示所有正在运行进程流程分析
- Android 8.0系统源码分析--应用进程启动过程分析
- Android6.0的phone应用源码分析(2)——phone相关进程启动分析
- Android 关于图片文件夹后缀错误,使应用在源码下编译通过却无法运行的错误
- Android之rild进程启动源码分析(个人认为写的比较完善的一个)
- Android 6.0 AMS分析的第二条线:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互等知识;
- 如何获取所有安装的Android应用并且可以运行其中一个?
- 源码分析Android 应用进程的启动过程
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android - 如何将两个/多个应用放到一个进程中去?
- CreateMutex创建互斥体可以用于只运行进程的一个实例
- 第一个Android应用程序---Android应用的目录结构与运行过程分析
- 【转】Android系统原理与源码分析:利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框