从源码角度看 AMS.startProcessLocked
2023-09-26 03:25:01
前言
众所周知,Android 系统是基于 Linux 内核的移动操作系统。而 Linux 又是通过 fork 来复制进程,复制的时候只是创建唯一识别符等轻量操作,真正的内存复制发生在 execve 之后。Android 系统也采用了类似的机制,在 AMS.startProcessLocked 函数中,通过调用 fork 来创建一个新的进程,然后在子进程中调用 execve 来执行指定的可执行文件。
AMS.startProcessLocked 函数简介
AMS.startProcessLocked 函数是 Android 系统中用来创建和管理进程的函数,它位于 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 文件中。该函数的原型如下:
public final Process startProcessLocked(String processName, String entryPoint, String[] entryPointArgs, String[] entryPointEnv, int pid, int flags, boolean inPackage, String requiredAbi, String instructionSet, boolean isolated, boolean keepCausedByActivity, boolean isCoreApp, boolean bindToPackage, boolean allowWhileBooting, boolean enableOpenGlTrace, ProfilerInfo profilerInfo, ApplicationInfo appInfo, List<ReferrerIntent> referrerIntents, Bundle bOptions, String callingPackage, boolean isolatedSplitLoading)
从函数原型可以看出,AMS.startProcessLocked 函数接收了大量的参数,这些参数主要用于指定要创建的进程的名称、入口点、入口点参数、入口点环境、PID、标志、是否在包中、所需的 ABI、指令集、是否隔离、是否保留由活动引起的、是否为核心应用、是否绑定到包、是否允许在启动时、是否启用 OpenGL 跟踪、分析器信息、应用程序信息、引荐意图列表、选项包、调用包、是否隔离拆分加载。
AMS.startProcessLocked 函数的实现
AMS.startProcessLocked 函数的实现非常复杂,这里只简单介绍一下它的主要流程:
- 首先,函数会检查传入的参数是否合法,如果参数不合法,则会抛出异常。
- 然后,函数会创建一个新的进程,并为该进程分配 PID。
- 接下来,函数会在子进程中调用 execve 函数来执行指定的可执行文件。
- 最后,函数会返回子进程的 PID。
AMS.startProcessLocked 函数的注意事项
在使用 AMS.startProcessLocked 函数时,需要注意以下几点:
- 该函数只能在 AMS 服务中调用。
- 该函数只能由系统进程调用。
- 该函数只能创建新的进程,不能修改现有进程。
- 该函数可能会抛出异常,因此需要在调用该函数时进行异常处理。
总结
AMS.startProcessLocked 函数是 Android 系统中用来创建和管理进程的重要函数。通过调用该函数,我们可以轻松地创建一个新的进程,并为该进程指定名称、入口点、入口点参数、入口点环境、PID、标志等属性。该函数的实现非常复杂,但其基本原理却很简单,只要理解了它的基本原理,我们就可以轻松地使用它来创建和管理进程。