zygote启动分析

android的系统应用中的一个重要的进程就是zygote,所有的java应用程序进程都是由zygote派生出来的,zygote这个进程的作用就是“生儿子”。具体的一个应用如何出来的大家可以看我以前的一篇文章-----Android 应用初始化及窗体事件的分发。

   首先要了解一点初始化语言的基本知识吧:

Services(服务)是一个程序,他在初始化时启动,并在退出时重启(可选)。Services(服务)的形式如下:

       service <name> <pathname> [ <argument> ]*
          <option>
          <option>
Options为选项,具体可以参考linux service命令
zygote进程正是在linux kernel startup后通过这个文件启动的,具体看init.rc中这一段:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
一段一段的分析这个代码:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
启动服务名字zygote.   /system/bin/app_process 进程的bin文件具体路径,后面跟的就是启动参数-Xzygote /system/bin --zygote --start-system-server。这段参数有什么作用可以对照看代码app_main.cpp
if (i < argc) {
        arg = argv[i++];
        if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ?
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
            set_process_name("zygote");
           runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer);
        } else {
            set_process_name(argv0);

            runtime.mClassName = arg;

            // Remainder of args get passed to startup class main()
            runtime.mArgC = argc-i;
            runtime.mArgV = argv+i;

            LOGV("App process is starting with pid=%d, class=%s./n",
                 getpid(), runtime.getClassName());
            runtime.start();
        }
    }

-Xzygote 这个参数的意义是在jvm中设置gDvm.zygote = true;至于这个参数的具体作用大家自己看代码吧。 其流程是 androidRuntime->start() call---> JNI_CreateJavaVM() call ---->dvmStartup()(戴维林虚拟机初始化) call---->dvmProcessOptions().

/system/bin :也许是告知系统应用的路径吧,大家看到了告诉我。

onrestart write /sys/android_power/request_state wake:

如果这个服务重启了,打开/sys/android_power/request_state 这个文件写入wake字符串


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyfllzy/archive/2011/02/19/6195408.aspx

 

Android启动, 首先kernel内核自动载入内存运行,它主要功能是完成各个设备驱动的初始化,例如,照相机,蓝牙,电话等驱动。

 


这部分启动完后就开始按照init.rc 文件中开始启动系统进程

 


init.rc 的路径为:platform/system/core/rootdir/init.rc   现在开始分析此文件。

 


此文件中可以看到如下格式:

 


service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

          socket zygote stream 66

          onrestart write /sys/android_power/request_start wake

          onrestart write /sys/power/state on

          onrestart restart media

          onrestart restart netd

 


这种格式,是指明要启动一系列系统级的服务, 如上,

 


service zygoet:就是启动了一个zygote服务,

/system/bin/app_process:进程bin文件的具体路径,可以zygote是对应着app_process进程,

其余的参数,等会儿解释,

 


app_pocess文件的路径为:/platform/frameworks/base/cmds/app_process/app_main.cpp,打开此文件,

可以看到此文件中的main()函数,由此可以得出结论,这个main()函数就是zygote服务的入口,

那么,刚才init.rc中service中的参数也就明白了,可以对应到

main(int argc,const char* const argv[]) 的参数中,会用到。

 


此外,此文件中还有一个重要的类,如下定义:

class AppRuntime:public AndroidRuntime { }

 


其中类AndroidRuntime类路径为:/platform/frameworks/base/core/jni/AndroidRuntime.cpp

 


此类用于启动java运行环境,其中一句最重要的代码为:

 


 main(int argc,const char* const argv[]) {

     .....

     AppRuntime runtime;

     runtime.start("com.android.internal.os.Zygoteinit",startSystemServer);

    

     ......

 


 }

 


此句是执行 ZygoetInit类,用于初始化Zygote服务,     下面开始分析ZygoteInit类


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyfllzy/archive/2011/02/21/6198796.aspx

 

Zygote初始化完成,创建的第一个进程为系统进程(SystemServer进程), 首先会执行此进程的main()方法,我们看main方法

public static void main(String[] args) {

    ...

   System.loadLibrary("android_servers");

   init1(args) ;

}

从这个方法中就可以看出,首先加载了一个本地库android_servers.so库,然后调用init1() 方法,此方法是一个native方法,也就是说,这个方法是由C/C++实现的, 此方法据说是初始化一些系统级的服务,具体什么服务,还有待研究,但肯定的一点是,在init1()方法中会调用init2()方法,现在可以看看init2()方法中做了那些操作,

public static final void init2() {

  Thread thr=new ServerThread();

  thr.start();

}

由此可以,此方法主要是启动了一个线程,那么我们具体分析ServerThread线程中的run()方法,

在run()方法中主要启动了一系列服务,并且把这些服务一一添加到ServiceManager进程,由ServiceManager来统一管理,以后使用这些服务都会通过ServiceManager进程来读取, 示例代码如下:

     PowerManagerService power=new PowerManagerService();  // 创建电源管理服务

     ServiceManager.addService(Context.POWER_SERVICE,power); // 添加服务到ServiceManager

其中最重要的两个服务是ActivityManagerService 和 WindowManagerService

ActivityManagerService服务(简称是AMS服务)是管理android概念空间中的四大组件,包括Activity,Service,等的管理,生命周期的管理,状态维护等工作,

注意,它是管理所有手机中所有应用程序的组件,并不是单独管理一个程序。

WindowManagerService服务(简称是WMS服务)主要是管理Activity中窗口的管理,是管理手机中所有程序所有activity中的所有窗口,并不单间是管理一个程序中的窗口,

我们先看AMS的初始化过程,

1):首先调AMS的main()方法

2):调用AMS的setSystemProcess()方法

3):调用AMS的installSystemProviders()方法

4):调用AMS的setWindowManager()方法

5):调用AMS的systemReady方法

1:AMS的main()方法分析:通过AThread内部类来创建AMS对象,调用ActivityThread类中的systemMain()方法,创建ActivityThread对象,最后调用AMS中的 startRunning();

2:AMS中的setSystemProcess()方法分析:

     首先会把AMS添加到ServiceManager进程中,接着再添加MemBinder,CpuBinder,PermissionController到ServiceManager中

    我猜这三个的作用是:Cpu控制和权限控制,

   

   接着,会调用AMS中的newProcessRecordLocked()方法创建一个ActivityThread类的进程,按照IPC的概念,此类应该为表示客户端,而AMS表示服务端,此类的进程被封装成ProcessRecord类,在服务端ProcessRecord都表示为进程,创建完毕后,再看如下代码

   

    ProcessRecord app=mSelf.newProcessRecordLocked(mSystemThread.getApplicationThread(),info,info.processName);

    mSelf.mProcessNames.put(app,app.info.uid,app);

    synchronized(mSelf.mPidsSelfLocked) {

       mSelf.mPidsSelfLocked.put(app.pid,app);

      

    }

    mSelf.updateLruProcessLocked(app,true,true);

其中mSelf就是代表AMS自己,

mProcessNames是一个HashMap,主要用来存放ProcessRecord对象,每创建一个新的进程,都会添加到此数据结构中,

mPidsSelfLocked也是一个ProcessMap数据结构,存取方式为通过app.pid来查找ProcessRecord。

从newProcessRecordLocked(thread,info,customProcess)方法中分析,要创建一个进程要的参数如下:

IApplicationThread thread:

ApplicationInfo info:// 进程的信息,包括名字,等内容

String customProcess:进程名字

再后来会调用updateLruProcessLocked()方法,来更新最后一次打开程序的列表,

3:调用AMS的installSystemProviders()方法分析,这个方法的主要作用是:初始化与系统进程(system)相关的所有ContentProviders

    代码如下:

    public static final installSystemProviders() {

        List providers;

        synchronized(mSelf) {

           ProcessRecord app=mSelf.mProcessNames.get("system",Process.SYSTEM_UID);// 得到名字为system的进程

           providers=mSelf.generateApplicationProvidersLocked(app); //  得到所有与此进程相关的Providers

          ......

        

          if(providers!=null) {

             mSystemThread.installSystemProviders(providers); // 通知客户端(ActivityThread)初始化providers

          }

       }

}

4:调用AMS的setWindowManager()方法,

     此方法主要作用是:把WindowManagerService赋给AMS中的一个实例,以便于AMS更好的控制WMS


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyfllzy/archive/2011/02/26/6208992.aspx

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值