欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析:Zygote进程如何启动SystemServer进程

时间:10-26 现代故事 提交错误

大家好,感谢邀请,今天来为大家分享一下深入解析:Zygote进程如何启动SystemServer进程的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

SystemServer是怎么启动的

上面我们知道,zygote孵化器进程在其main函数中调用startSystemServer函数来启动SystemServer进程。通过了解zygote孵化器,我们可以确定SystemServer是zygote进程fock自己创建的新子进程。过程。

*/

//zygote进程main函数调动startSystemServer

私有静态布尔startSystemServer(字符串abiList,字符串socketName,ZygoteServer zygoteServer)

抛出Zygote.MethodAndArgsCaller,RuntimeException {

……

/* 硬编码命令行来启动系统服务器*/

//这里构造了启动SystemServer所需的参数。

字符串参数[]={

"--setuid=1000",

"--setgid=1000",

"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",

"--能力=" + 能力+ "," + 能力,

"--nice-name=system_server",

"--运行时参数",

"com.android.server.SystemServer",

};

ZygoteConnection.Arguments parsedArgs=null;

PID;

尝试{

parsedArgs=new ZygoteConnection.Arguments(args); //解析出来的参数都是直接Del类

ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);

ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

/* 请求fork系统服务器进程*/

//这很重要。 Zygote进程fock自己的内存地址来创建一个新的子进程。

pid=Zygote.forkSystemServer(

parsedArgs.uid, parsedArgs.gid,

parsedArgs.gids,

parsedArgs.debugFlags,

无效的,

parsedArgs.permissedCapability,

parseArgs. effectiveCapability);

} catch (IllegalArgumentException ex) {

抛出新的RuntimeException(ex);

}

/* 对于子进程*/

//上面fock已经创建了SystemServer进程,这里的代码已经在SystemServer进程中运行了。

如果(pid==0){

如果(hasSecondZygote(abiList)){

waitForSecondaryZygote(socketName);

}

//关闭zygote进程原有的socket请求

zygoteServer.closeServerSocket();

//启动systemServer主函数

处理系统服务器进程(parsedArgs);

}

返回真;

}从代码中我们了解到,startSystemServer首先构造启动SystemServer所需的参数,然后Zynote进程fock自己的内存地址。因为zynote中有socket链接,所以不需要关闭SystemServer,然后再启动。

forkSystemServer用户复制zynote进程的内存地址,也就是复制zynote进程,后续的代码都会在这个新进程中执行,也就是SystemServer进程。

forkSystemServer一旦执行完毕,后续代码执行将会是一个新的进程。因为新进程复制了zynote进程,所以zynote进程之前执行的所有内容也都存在,只是之前的内容也被复制到了新进程中。

私有静态无效handleSystemServerProcess(

ZygoteConnection.Arguments parsedArgs)

抛出Zygote.MethodAndArgsCaller {

if (parsedArgs.invokeWith !=null) {

……

} 别的{

类加载器cl=null;

if (systemServerClasspath !=null) {

//创建path类型的类加载器

cl=createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);

Thread.currentThread().setContextClassLoader(cl);

}

/*

* 将剩余的参数传递给SystemServer。

*/

//启动主函数,参数较多

ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);

}

/* 永远不应该到达这里*/

}handleSystemServerProcess 函数处理许多参数。我们需要知道的是

该函数创建一个路径类型类加载器并将其设置为当前线程。 zygoteInit函数启动该类的main函数。我们知道参数是"com.android.server.SystemServer"类的main函数public static final void zygoteInit(int targetSdkVersion, String[] argv,

ClassLoader classLoader) 抛出Zygote.MethodAndArgsCaller {

如果(运行时初始化.DEBUG){

Slog.d(RuntimeInit.TAG, "RuntimeInit: 从zygote 启动应用程序");

}

Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");

RuntimeInit.redirectLogStreams();

RuntimeInit.commonInit();

//启动binder线程池

ZygoteInit.nativeZygoteInit();

//调用并执行main函数

RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);

}这一步也很重要。其中包括启动binder线程池,它是systemServer与其他进程通信的基础。活页夹,

protected static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

抛出Zygote.MethodAndArgsCaller {

……

//剩余的参数传递给启动类的静态main

invokeStaticMain(args.startClass, args.startArgs, classLoader);

}applicationInit函数为jvm设置一些参数。 InvokeStaticMain是最终执行的函数。它通过反射找到SystemServer的main方法并抛出异常。

私有静态无效invokeStaticMain(字符串类名,字符串[]argv,类加载器类加载器)

抛出Zygote.MethodAndArgsCaller {

类?cl;

尝试{

cl=Class.forName(className, true, classLoader);

} catch (ClassNotFoundException ex) {

抛出新的运行时异常(

"调用static main 时缺少类" + className,

前任);

}

方法m;

尝试{

m=cl.getMethod("main", new Class[] { String[].class });

} catch (NoSuchMethodException ex) {

抛出新的运行时异常(

"缺少static main on " + className, ex);

} catch (SecurityException ex) {

抛出新的运行时异常(

"在" + className 上获取静态main 时出现问题,例如);

}

int 修饰符=m.getModifiers();

if (!(Modifier.isStatic(修饰符) Modifier.isPublic(修饰符))) {

抛出新的运行时异常(

"Main 方法在" + className) 上不是公共和静态的;

}

抛出新的Zygote.MethodAndArgsCaller(m, argv);

}这个函数分析了SystemServer类,找到了这个类的main函数,但是这里并没有执行main函数。它抛出一个异常throw new Zygote.MethodAndArgsCaller。新的Zygote.MethodAndArgsCaller类位于/framework/core/base/java/com/android/internal/os/Zygote类中,这是一个异常类。到这里回忆一下ZynoteInit类的主要函数。

公共静态无效主(字符串argv []){

.

if (启动系统服务器) {

startSystemServer(abiList, socketName, zygoteServer);

}

Log.i(TAG, "接受命令套接字连接");

zygoteServer.runSelectLoop(abiList);

zygoteServer.closeServerSocket();

} catch (Zygote.MethodAndArgsCaller caller) { //Zygote.MethodAndArgsCaller 异常捕获

调用者.run();

} catch(可抛出的前){

Log.e(TAG, "系统受精卵异常死亡", ex);

zygoteServer.closeServerSocket();

扔前;

}

}zynote的主线程已经捕获了异常,但是SystemServer是一个复制的zynote进程,所以它也具有zynote的能力和代码。同样,SystemServer主线程的异常也在这里捕获。在相同的捕获之后,将执行caller.run 方法。

公共无效运行(){

尝试{

mMethod.invoke(null, new Object[] { mArgs }); //执行带参数的方法

} catch (IllegalAccessException ex) {

……

}invok方法是Java通过反射执行的类方法。这里我们了解到这个方法在SystemServer抛出异常的时候就已经得到了体现,也就是SystemServer类的main方法。这也意味着这是main 方法最终开始执行的代码。

关于深入解析:Zygote进程如何启动SystemServer进程的内容到此结束,希望对大家有所帮助。

用户评论

莫名的青春

这个标题听着就比较专业啊,感觉是系统级的知识点。

    有17位网友表示赞同!

可儿

终于有人研究了zygote进程在这方面的影响了,期待深入了解。

    有7位网友表示赞同!

情如薄纱

我平时一直觉得Android系统还挺复杂的,这篇文章也许能解答一些疑问。

    有6位网友表示赞同!

发型不乱一切好办

SystemServer进程很重要吧?Zygote进程怎么影响它呢?

    有19位网友表示赞同!

漫长の人生

感觉zygote进程在Android系统中扮演着很关键的角色。

    有6位网友表示赞同!

那伤。眞美

终于有一个专门研究启动机制的文章了,希望能看到更深入的分析。

    有14位网友表示赞同!

执拗旧人

要对SystemServer进程启动流程有更深刻理解,了解Zygote进程的作用很重要啊。

    有13位网友表示赞同!

暮光薄凉

这个标题听起来很有技术含量,我必须好好学习一下!

    有13位网友表示赞同!

花菲

系统启动机制永远都是一个永恒的话题吧!

    有7位网友表示赞同!

鹿先森,教魔方

学习Android编程越来越需要这些系统级的知识了。

    有11位网友表示赞同!

■孤独像过不去的桥≈

期待看到这篇文章能帮我更好地理解Android的启动过程。

    有9位网友表示赞同!

命里缺他

感觉zygote进程是连接程序和系统的桥梁!

    有7位网友表示赞同!

鹿叹

这个研究方向很有潜力,希望能有更多更深入的研究成果。

    有11位网友表示赞同!

强辩

学习一下Android内核机制吧,看来对开发很有帮助。

    有20位网友表示赞同!

浮世繁华

这篇文章能解释一下zygote进程和SystemServer进程之间的关系吗?

    有5位网友表示赞同!

执念,爱

我猜zygote进程可能是所有应用程序的父进程吧?

    有14位网友表示赞同!

苏莫晨

想要理解Android系统的启动流程,这个文章是必读书!

    有5位网友表示赞同!

不忘初心

系统运行起来的速度和效率都很关键对不对,Zygote进程应该扮演着重要的角色。

    有20位网友表示赞同!

顶个蘑菇闯天下i

学习系统级知识可以提高开发的能力,这篇文章让我心动!

    有5位网友表示赞同!

【深入解析:Zygote进程如何启动SystemServer进程】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

免责声明:部分作品来自网友发布,或收集于互联网,目的在于更好的传递 好内容 ,正能量内容。如果侵犯了您的权益,或者您不想在本站发布,请及时联系我们,我们第一时间删除信息!