《android系统源代码情景分析》学习-第11章 Zygote和System进程的启动过程

第二次看这本书,推荐阅读。距离上一次看已经很久了,这一次准备断断续续的记录一下,也算是一个学习的动力吧。

第11章 Zygote和System进程的启动过程

Zygote进程的启动

Zygote是进程孵化器,通过复制自身的方式创建 System进程和所有的应用程序进程。Linux内核加载完成后启动init进程。init读取了init.rc的脚本,里面有Zygote的启动信息。

源码位置system/core/rootdir/init.rc

service zygote /system/bin/app_process -Xzygote /system/bin 
--zygote --start-system-server socket zygote stream 666

指定以service的形式启动Zygote进程,启动时需要创建一个名称为zygote的Socket用来进程间通信并且指定在Zygote启动后立即启动System进程。

由于指定了service的形式启动Zygote,所以init进程启动是会调用service_start方法启动Zygote。

//通过fork创建一个子进程,也就是Zygote进程。
//pid等于0时,说明是从Zygote进程返回
pid = fork();
//Zygote进程创建后,遍历在init.rc中为Zygote配置的Socket列表。
//创建socket,返回一个文件描述符,对应的设备文件是
/dev/socket/zygote,AMS请求Zygote创建新的应用程序进程时会先打开这个
设备文件创建一个连接到Zygote进程的Client端 Socket。
create_socket();
//将这个文件描述符发布到系统中,这个过程会将文件描述符保存在
//一个名称为"ANDROID_SOCKET_zygote"的环境变量中。
publish_socket();

以上是Zygote的启动分析,下面看Zygote的启动过程。
init.rc指定了Zygote进程加载的文件是/system/bin/app_process

第一步 main

在脚本中指定了Zygote进程加载的应用程序文件为/system/bin/app_process,入口函数是main方法。

frameworks/base/cmds/app_process/app_main.cpp->main()
1.1 创建一个AppRuntime对象 runtime,继承了AndroidRuntime。
1.2 set_process_name设置当前进程名称为zygote
1.3 AndroidRuntime继续启动Zygote
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);

这里的startSystemServer为true,指定Zygote进程启动完成之后,需要启动System进程。

第二步:start

AppRunTIme的 start方法从父类继承下来

frameworks/base/core/jni/AndroidRuntime.cpp->start()
2.1 startVm()在Zygote创建一个虚拟机,
2.2 startReg()在虚拟机中注册JNI方法,
2.3 调用com.android.internal.os.ZygoteInit的 main方法继续启动 zygote进程

第三步:ZygoteInit.main

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java.main()
3.1 通过registerZygoteSocket()创建一个 Server端Socket,用来与AMS通信。这个过程中首先通过上面提到的环境变量”ANDROID_SOCKET_zygote” 来获取文件描述符。最后根据这个文件描述符创建了一个LocalServerSocket对象sServerSocket。
3.2 通过startSystemServer()启动 System进程,系统的各种关键服务在System中启动。这个过程中首先是一系列的启动参数,然后通过Zygote.forkSystemserver()创建System进程。forkSystemserver最终调用fork();pid等于0时代表在System进程中执行,通过handleSystemServerProcess()进一步启动 System进程。
3.3 通过runSelectLoopMode()等待AMS发起请求,创建新的应用程序进程。首先创建一个大小为4的文件描水符的数组,将sServerSocket的文件描述符加入到数组,通过 while循环监控可读数据的索引index。如果index等于0,那么就说明AMS通过sServerSocket与Zygote建立了连接;如果index大于0,那么就说明 AMS向Zygote发起了一个创建应用程序进程的请求,调用ZygoteConnection->runOnce创建一个新的应用程序进程。

至此 Zygote已经启动完毕,通过无限循环监听sServerSocket接受AMS的创建新的应用程序的请求,并且通过 startSystemServer启动了 System进程,接下来来看System进程的启动。

System进程的启动

上面的 startSystemServer()中提到了通过handleSystemServerProcess()进一步启动System进程。

第一步:ZygoteInit.handleSystemServerProcess

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java.handleSystemServerProcess

1.1 closeServerSocket()

由于 System 进程是通过fork Zygote进程得到的,所以它复制了Zygote进程的地址空间,也获得了Zygote进程中创建的Socket,System用不到这个Socket需要关闭。

1.2 RuntimeInit.zygoteInit()

调用RuntimeInit的 zygoteInit方法进一步启动 System进程。

第二步 RuntimeInit.zygoteInit

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

2.1 commonInit()

初始化 System进程的时区和键盘布局等通用信息。

2.2 zygoteNative()

在System进程中启动一个Binder线程池。

2.3 invokeStaticMain()

进入到SystemServer的main()

第三步 SystemServer.main()

frameworks/base/services/java/com/server/SystemServer.java
调用了init1方法启动一些由C++编写的系统服务,init1是一个JNI方法。

第四步 SystemServer.init1

frameworks/base/services/jni/com_android_server_SystemServer.cpp

static void android_server_SystemServer_init1()
调用了system_init()
4.1

创建了一个GrimReaper用来接受Service Manager的死亡通知,收到Service Manager死亡通知后,会杀死System进程。

4.2 启动SurfaceFlinger服务和SensorService服务。
SurfaceFlinger::instantiate();
SensorService::instantiate();
4.3
runtime->callStatic("com/android/server/SystemServer","init2");
调用com.android.server.SystemServer的静态方法init2启动java开发的系统服务。
4.4
//启动一个线程池,不过之前的 zygoteInitNative已经启动过线程池
//实际这里不起作用。
ProcessState::self()->startThreadPool();
//将当前线程加入到这个 Binder线程池
IPCThreadState::self()->joinThreadPool();

第五步 SystemServer.init2

frameworks/base/service/java/com/android/server/SystemServer.java

创建了一个ServerThread的线程,入口函数为run方法

    Thread thr = new ServerThread();
    thr.setName("android.server.ServerThread");
    thr.start();

第6步 ServerThread.run

frameworks/base/services/java/com/android/server/SystemServer.java
6.1 创建一个消息循环
Looper.prepare();
6.2 启动系统服务
try{ 
 //启动AMS,没有被注册到ServiceManager
   context = ActivityManagerService.main(factoryTest);

 //启动PackageManagerService,立即被注册到ServiceManager
    pm = PachageManagerService.main(context,factoryTest!=
         SystemServer.FACTORY_TEST_OFF);

 //注册AMS到ServiceManager
     ActivityManagerService.setSystemProcess();

 //启动ContentService,立即被注册到ServiceManager
     ContentService.main(context,factoryTest==
                      SystemServer.FACTORY_TEST_LOW_LEVEL);

 //启动WMS,没有被注册到ServiceManager
     wm = WindowManagerService.main(context,power,
        factoryTest!=SystemServer,FACTORY_TEST_LOW_LEVEL);
 //注册WMS到ServiceManager
     ServiceManager.addService(Context.WINDOW_SERVICE,wm);

     }catch(RuntimeException e){}
6.2.1 AMS的启动,启动后没有被立即添加到 ServiceManager

AMS在ActivityManagerService的main方法启动。

frameworks/base/servers/java/android/server/am/ActivityManagerService.java

public static final Context main(int factoryTest){
//创建一个 AThread线程,在线程中实例化一个AMS对象,就是系统的 AMS。
    AThread thr = new AThread();
    thr.start();
    synchronized(thr){
    while(thr.mService==null){
        try{
             thr.wait();
        } catch(InterruptedException e){}
    }
    ActivityManagerService m = thr.mService;
    mSelf = m;
}

AThread创建AMS对象

static class AThread extends Thread{
    ActivityManagerService mService;
    public void run(){
    Looper.prepare();
    ActivityManagerService mm = new ActivityManagerService();
    synchronized(this){
    mService = m;
    notifyAll();
    }
    Looper.loop();
}}}

此时 AMS刚被实例化,还没有注册到ServiceManager。

6.2.2 PMS启动后立即被添加到ServiceManager
frameworks/base/services/java/com/android/server/PackageManagerService.java

public static final IPackageManager main(Context context,boolean factoryTest){
    PackageManagerService m = new PackageManagerService(context,factoryTest);
    ServiceManager.addService("package",m);
    return m;
}
6.2.3 注册AMS到ServiceManager

ActivityManageService.setSystemProcess();

ActivityManagerService m = mSelf;
ActivityManagerService.addService("activity",m);
6.2.4 启动ContentService
frameworks/base/core/java/android/content/ContentService.java

public final class ContentService extends IContentService.stub{
    public static IContentService main(Context context,
                                        boolean factoryTest){
    ContentService service = new ContentService(context,
                            factoryTest);
    ServiceManager.addService("content",service);
    }
}
6.2.5 WMS的启动

WindowManagerService的创建与ActivityManagerService类似。

6.2.6 注册WMS到ServiceManager
ServiceManager.addService("window",wm);
6.3 使当前线程进入消息循环中
Looper.loop(); 
至此,System进程就将系统的关键服务启动完毕, 包括ActivityManagerService,PackageManagerService,ContentService,WindowManagerService,其他进程可以通过 ServiceManager获取服务的代理对象。

猜你喜欢

转载自blog.csdn.net/u013034413/article/details/79258334
今日推荐