当前位置:网站首页>SystemServer进程
SystemServer进程
2022-07-02 10:18:00 【xhBruce】
SystemServer进程
android12-release
Android系统启动
Zygote进程
Zygote进程fork而来
init进程 -> Zygote进程 -> system_server进程
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/Zygote.java
frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
art/runtime/native/dalvik_system_ZygoteHooks.cc
forkSystemServer().run() -> pid = Zygote.forkSystemServer() -> nativeForkSystemServer() -> com_android_internal_os_Zygote_nativeForkSystemServer -> pid = zygote::ForkCommon() -> pid = fork() -> SpecializeCommon()
/* Hardcoded command line to start the system server */
String[] args = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",
};
ZygoteArguments parsedArgs;
SystemServer进程参数信息为uid=1000,gid=1000,进程名为
sytem_server
Zygote.forkSystemServer()
fork出system_server进程
com_android_internal_os_Zygote_nativeForkSystemServer
JNIzygote::ForkCommon()
调用到fork()
创建新进程,采用copy on write方式,这是linux创建进程的标准方法,会有两次return。 返回值有3种类型:父进程中,fork返回新创建的子进程的pid;子进程中,fork返回0;当出现错误时,fork返回负数。
当system_server进程死亡后,重启zygote进程。新创建system_server进程已完成,
pid == 0
便进入handleSystemServerProcess()方法
handleSystemServerProcess
fork()
到此system_server进程已完成了创建的所有工作,接下来开始了system_server进程的真正工作
handleSystemServerProcess(parsedArgs)
完成system_server进程剩余工作,运行在system_server进程
Process.setArgV0(parsedArgs.mNiceName)
当前进程名"system_server"performSystemServerDexOpt()
执行dex优化操作,由installd
来完成- system_server执行
ZygoteInit.zygoteInit()
/** * Finish remaining work for the newly forked system server process. */
private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
// set umask to 0077 so new files and directories will default to owner-only permissions.
Os.umask(S_IRWXG | S_IRWXO);
if (parsedArgs.mNiceName != null) {
Process.setArgV0(parsedArgs.mNiceName);
}
final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
if (systemServerClasspath != null) {
performSystemServerDexOpt(systemServerClasspath);
// Capturing profiles is only supported for debug or eng builds since selinux normally
// prevents it.
if (shouldProfileSystemServer() && (Build.IS_USERDEBUG || Build.IS_ENG)) {
try {
Log.d(TAG, "Preparing system server profile");
prepareSystemServerProfile(systemServerClasspath);
} catch (Exception e) {
Log.wtf(TAG, "Failed to set up system server profile", e);
}
}
}
if (parsedArgs.mInvokeWith != null) {
String[] args = parsedArgs.mRemainingArgs;
// If we have a non-null system server class path, we'll have to duplicate the
// existing arguments and append the classpath to it. ART will handle the classpath
// correctly when we exec a new process.
if (systemServerClasspath != null) {
String[] amendedArgs = new String[args.length + 2];
amendedArgs[0] = "-cp";
amendedArgs[1] = systemServerClasspath;
System.arraycopy(args, 0, amendedArgs, 2, args.length);
args = amendedArgs;
}
WrapperInit.execApplication(parsedArgs.mInvokeWith,
parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
VMRuntime.getCurrentInstructionSet(), null, args);
throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
} else {
ClassLoader cl = getOrCreateSystemServerClassLoader();
if (cl != null) {
Thread.currentThread().setContextClassLoader(cl);
}
/* * Pass the remaining arguments to SystemServer. */
return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
parsedArgs.mDisabledCompatChanges,
parsedArgs.mRemainingArgs, cl);
}
/* should never reach here */
}
ZygoteInit.zygoteInit()
ZygoteInit.nativeZygoteInit()
在AndroidRuntime.cpp中,进行了jni映射RuntimeInit.applicationInit()
中内部类MethodAndArgsCaller.run运行mMethod.invoke()
启动SystemServer.main()
SystemServer.main
4.2 系统服务:由SystemServer.java负责启动和管理整个Java framework中服务startBootstrapServices、startCoreServices、startOtherServices
时序图
边栏推荐
- De4000h storage installation configuration
- [technology development-22]: rapid overview of the application and development of network and communication technology-2-communication Technology
- Sum of the first n terms of Fibonacci (fast power of matrix)
- Halcon extract orange (Orange)
- How to modify the error of easydss on demand service sharing time?
- 2022 zero code / low code development white paper [produced by partner cloud] with download
- 【文档树、设置】字体变小
- [usaco05jan]watchcow s (Euler loop)
- 刚好1000粉丝,记录一下
- How to explain binary search to my sister? This is really difficult, fan!
猜你喜欢
We sincerely invite young creators to share with investors and entrepreneurs how to make choices in life in the metauniverse
能自动更新的万能周报模板,有手就会用!
2022 Heilongjiang provincial examination on the writing skills of Application Essays
题解:《压缩技术》(原版、续集版)
Subcontracting configuration of uniapp applet subpackages
How to explain binary search to my sister? This is really difficult, fan!
Node. JS accessing PostgreSQL database through ODBC
Countermeasures for the failure of MMPV billing period caused by negative inventory of materials in SAP mm
Explanation: here is your UFO, Goldbach conjecture
代码实现MNLM
随机推荐
Winter vacation daily question - lucky numbers in the matrix
How much do you know about free SSL certificates? The difference between free SSL certificate and charged SSL certificate
Unity small map production [2]
Qt入门-制作一个简易的计算器
石子合并板子【区间DP】(普通石子合并 & 环形石子合并)
Error function ERF
MySQL -- convert rownum in Oracle to MySQL
Solution: Compression Technology (original version and sequel version)
每日一题:1175.质数排列
Essential for operation and maintenance - Elk log analysis system
[cloud native database] what to do when encountering slow SQL (Part 1)?
We sincerely invite young creators to share with investors and entrepreneurs how to make choices in life in the metauniverse
OpenApi-Generator:简化RESTful API开发流程
2022零代码/低代码开发白皮书【伙伴云出品】附下载
[unity] using GB2312, the solution to abnormal program after packaging
Explanation of 34 common terms on the Internet
I did it with two lines of code. As a result, my sister had a more ingenious way
mac(macos Monterey12.2 m1) 个人使用php开发
Why can't d link DLL
验证失败,请检查您的回电网址。您可以按照指导进行操作