您的位置:首页 > 运维架构 > Linux

通过源码分析一个linux进程可以运行多个android应用

2016-09-07 20:57 363 查看
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指定一样的就会运行在同一个进程中了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 源码
相关文章推荐