android是运行在linux系统上的,一个android应用在启动的时候会会创建自己的进程,创建自己的任务栈,下面通过源码来查看系统是依据什么来创建一个应用的进程的.
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指定一样的就会运行在同一个进程中了.