Android(安卓)启动过程分析--笔记缩减
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。
ActivityManagerService启动新的进程是从其成员函数startProcessLocked开始的。 它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为"android.app.ActivityThread",这就是进程初始化时要加载的Java类了,把这个类加载到进程之后,就会把它里面的静态成员函数main作为进程的入口点。这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中。
- int pid = Process.start("android.app.ActivityThread",
- mSimpleProcessManagement ? app.processName : null, uid, uid,
- gids, debugFlags, null);
神!上帝造人的时候到了,这个时候将在Zygote 进程中创建一个进程(ActivityManagerService让Zygote 创建的进程)真正创建进程的地方就是在这里了:
- pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids, parsedArgs.debugFlags, rlimits);
有Linux开发经验的读者很容易看懂这个函数调用,这个函数会创建一个进程,而且有两个返回值,一个是在当前进程中返回的,一个是在新创建的进程中返回,即在当前进程的子进程中返回,在当前进程中的返回值就是新创建的子进程的pid值,而在子进程中的返回值是0。因为我们只关心创建的新进程的情况,因此,我们沿着子进程的执行路径继续看下去:
[java] view plain copy
- pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids, parsedArgs.debugFlags, rlimits);
[java] view plain copy
- if (pid == 0) {
- // in child
- handleChildProc(parsedArgs, descriptors, newStderr);
- // should never happen
- return true;
其中ZygoteInitNative函数通过层层调用建立binder 通讯机制如下:
[java] view plain copy
- pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids, parsedArgs.debugFlags, rlimits);
- sp
proc = ProcessState::self(); - if (proc->supportsProcesses()) {
- LOGV("App process: starting thread pool.\n");
- proc->startThreadPool();
- }
- }
- ......
- };
另外一个函数invokeStaticMain函数调用,就是实现ActivityThread 的加载,前面我们说过,这里传进来的参数className字符串值为"android.app.ActivityThread",这里就通ClassLoader.loadClass函数将它加载到进程中:
[java] view plain copy
- cl = loader.loadClass(className);
[java] view plain copy
- m = cl.getMethod("main", new Class[] { String[].class });
- public final class ActivityThread {
- ......
- public static final void main(String[] args) {
- SamplingProfilerIntegration.start();
- Process.setArgV0("
" ); - Looper.prepareMainLooper();
- if (sMainThreadHandler == null) {
- sMainThreadHandler = new Handler();
- }
- ActivityThread thread = new ActivityThread();
- thread.attach(false);
- if (false) {
- Looper.myLooper().setMessageLogging(new
- LogPrinter(Log.DEBUG, "ActivityThread"));
- }
- Looper.loop();
更多相关文章
- C语言函数的递归(上)
- Android(安卓)bionic缺失pthread_cancel的解决方法
- 一篇文章看明白 Android(安卓)Service 启动过程
- Android(安卓)init源代码分析(1)概要分析
- Android(安卓)/ OPhone开发系列教程正在发布中……
- Android(安卓)清单目录application对应属性讲解
- Android(安卓)Intent的几种用法总结
- Android(安卓)ClassLoader
- Android(安卓)Support V4, V7, V13的作用与用法