当前位置:操作系统 > 安卓/Android >>

Android 创世纪 第三天

 

第三天,google说,伊甸园(linux世界)要被隔离,于是便创造了亚当(Adm)与夏娃(Eve),称它为zygote和system_server

 

               --xxx

 

 

 

     第二天,init跑完了,它对于android系统,最重要的,就是启动了zygote和system-server,谁是Adam谁是Eve?

 

     从分析init.rc来看

 

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

 

     --start-system-server只是个参数。

 

 

 

    分析源码

 

    啊,原来夏娃(zygote)用自己的肋骨(fork)创造了亚当(system_server)!什么?为什么不是亚当创造夏娃!?  android的世界,是无性繁殖的世界,zygote(夏娃)一开始就是个受精卵。。。。。。。

 

 

 

Eve诞生记(zygote启动过程)

 

 

第一步,受精(改名)

 

    从init.rc可以看出,启动的是app_process程序,启动后,再把自己的进程名改为zygote,就算是受精了。。

 

 

 

第二步,着床(交由AppRuntime启动javaVM)

 

    这时,会创建一个vm,算是android java世界的祖师爷,并且在这个vm启动时赋予各种参数,比如我们都知道默认的情况下,一个应用程序加载的内存不能超过16mb,这个参数就是在这里设置的,heapsize为16mb。这之后vm就启动了,哦,应该叫dalvik。

 

    在启动后,还会为java的类注册JNI函数,android世界是c与java互相交织的。

 

第三步,生长脐带(初涉java世界)

 

    注册好各种JNI函数后,zygote的C层面就可以调用Java代码了。

 

    这里第一次进入了java世界。它调用了  com.android.internal.os.ZygoteInit 的main方法。

 

    java世界并不孤立

 

  1、它首先注册socket,使自己成为一个服务端,也就是IPC通信服务端。这就是android的伟大之处,巧妙利用了linux的所有特性。以后会讲到zygote的真谛。

 

  2、然后预加载类以及一些android资源。洋洋洒洒1k多个java类要加载,并且还都是加载时间大于1250微妙的类,android框架加载耗时的类都到这里来加载了,这也正是android开机慢得原因,不过苦尽甘来吗,开始累点能干的都干了,以后用起来就方便了,不是么?当然,android的系统就像是量产车,各种性能不求最好只求最稳定,广大发烧友改rom就像改装汽车一样,需要精通从齿轮组到ECU的各种知识,方能达到硬件与软件完美的结合以便发挥出最大功效,扯多了。。要想定制rom,减少开机时间,还得靠nb的水平与良好的洞察力。

 

  3、启动SystemServer。也就是system_server进程。

 

     刚才说了,这个system_server就是Adm,夏娃的第一块肉就这么掉下来了,同样利用linux的frok机制,从zygote进程易做图出了一个system_server进程。男女搭配干活不累,亚当与夏娃共同劳动,为我们搭建美好的android世界。

 

     后面会分析system_server都干些什么事。

 

  4、建一个线程,转入socket侦听模式。每个apk在android中运行起来都是一个单独的linux进程,这些进程,就是zygote易做图出来的。现在zygote侦听的就是ActivityService通过system_server使用socket传入的请求,用以易做图进程。线程之外的最后,关闭之前打开的socket侦听。

 

    现在夏娃该干的事,基本上干完了,就等着亚当再次让她受精了。。。。。   -_-!!!!

 

 

 

    这里就顺便描述下每个Activity分娩出来的过程吧!(Activity大致启动过程)

 

      step 1 凡人向神求仔:

 

           启动一个activity,也就是startActivity。这个activity依附于一个未启动的进程,好比刚开机,打开一个android程序。

 

     step 2 大神收到祈愿:

 

            ActvityManagerService收到startActvity,梳理一番各种参数,比如apk的报名,再将这个祈愿通过送到伊甸园交由夏娃实施。

 

      step3 伊甸园接到生仔请求:

 

            亚当愿意别人直接找夏娃么?呵呵,各种service都是SystemServer启动起来的,而SystemServer又掌管着Binder,自己肯定会首先处理这个通知的。SystemServer通过socket这个IPC机制,向zygote发送一个frok请求,这时从java世界回到了native世界,亚当(system_server)让夏娃(zygote)受精了。。。。-_-!!!  android的繁荣离不开这种造仔活动

 

      step4 夏娃生仔:

 

            又要易做图了,fork出了一个新进程,并把这个进程返还给Java世界,并且由ActivityManagerService管理它。这里,就是让这个进程调用ActivityThread,ActvityThread就是main,apk程序的main。

 

            linuix中fork出来的子进程会继承父进程的所有信息,就相当于一个拷贝,只不过变成了另一个进程。既然继承了所有信息,那么dalvik也就继承下来了,这就解释了为什么一个android程序都有一个vm进程。

 

 

 

Adam诞生记(SystemServer启动过程)

 

    上面提到zygote在java层启动并fork了SystemServer,也就是夏娃身上掉下来的第一块肉。

 

    SystemServer首先会关闭因fork而从父进程继承而来的socket。

 

 

第一步,Native层初始化

 

     这里会通过JNI调用native方法,又回到了Native世界。

 

     首先,初始化Skia引擎,就是一个图像引擎,封装了画图的各种操作,这样屏幕就能让显示东西了。

 

     然后,启动Binder,也就是android IPC的核心。

 

 

 

第二步,换名,并进行JAVA层初始化

 

     换名了,这个vm进程就被正式命名为system_server了。

 

     java层初始化,也就是调用com.android.server.SystemServer 的main。有趣的是,这里通过反射,获得SystemServer类的main方法后,不直接调用,而是抛出一个异常,这个异常包含了main这个Method。

 

     再回头看看zygote的java世界,启动了system_server的代码是在try中,catach中就是截获上面所说的异常,并执行main的这个Method。

 

 

 

为什么这么做?

 

先来看个示例程序:

 

01 public class Method_test { 

 

02   

 

03     public static void main(String[] args) { 

 

04         ClassA ca=new ClassA(); 

 

05         ca.start();      

 

06     } 

 

07   

 

08 } 

 

09   

 

10 class ClassA{ 

 

11   

 

12     public ClassA() { 

 

13     } 

 

14     public void start(){ 

 

15         System.out.println("开始调用方法"); 

 

16         Met

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,