一.Android 系统启动过程
1.图解
从下层到上层共包括四层,分别是linux内核层、系统运行库层、应用框架层和应用层。
2.启动过程
<1> 启动bootloader。
<2> 加载系统内核。
<3> 启动init进程。
<4> 继续。
第一二步都是Linux内核相关的知识。这里暂时不说。咱们从第三部 启动init进程 起讲起。
二.init进程&Zygote进程&SystemServer进程
1.简介
init进程是Linux内核启动完成后在用户空间启动的第一个进程。主要负责初始化工作、启动属性服务、解析init.rc文件。并启动Zygote进程。
Zygote进程是一个进程孵化器,负责创建虚拟机实例、应用程序进程、系统服务进程等等。
Zygote进程是使用socket来进行跨进程通信的,所以会创建一个名为zygote的socket。
init进程启动后,通过fork和execve来启动Zygote进程。
然后app_main.cpp中(frameworks/base/cmds/app_process/app_main.cpp)
//启动Zygote,进入ZygoteInit.main函数
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
这样 就到了Java层的代码的ZygoteInit类。路径如下
com.android.internal.os.ZygoteInit
ZygoteInit类 main方法部分源码(XXX\Android\Sdk\sources\android-30\com\android\internal\os)
public static void main(String argv[]) {
//初始化native方法
Zygote.initNativeState(isPrimaryZygote);
//是否要创建SystemServer
boolean startSystemServer = false;
String socketName = "zygote";
String abiList = null;
boolean enableLazyPreload = false;
for (int i = 1; i < argv.length; i++) {
if ("start-system-server".equals(argv[i])) {
startSystemServer = true;
} else if ("--enable-lazy-preload".equals(argv[i])) {
enableLazyPreload = true;
} else if (argv[i].startsWith(ABI_LIST_ARG)) {
abiList = argv[i].substring(ABI_LIST_ARG.length());
} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
socketName = argv[i].substring(SOCKET_NAME_ARG.length());
} else {
throw new RuntimeException("Unknown command line argument: " + argv[i]);
}
}
//fork并启动SystemServer进程
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
}
}
也就是说,ZygoteInit类 main方法 核心功能是 执行 forkSystemServer方法。
forkSystemServer方法部分源码
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
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",
};
parsedArgs = new ZygoteArguments(args);
}
也就是说 forkSystemServer方法 核心功能是通过 com.android.server.SystemServer 启动SystemServer进程
小结1
到这里 init进程 到 Zygote进程(Socket通信) 到 SystemServer进程 。
下面我们看一下SystemServer类。
SystemServer类部分源码(XXX\Android\Sdk\sources\android-30\com\android\server)
public final class SystemServer {
//上下文对象
private Context mSystemContext;
//系统管理 用来生成 AMS WMS和PMS都是通过自己类的main方法获取的
private SystemServiceManager mSystemServiceManager;
//AMS
private ActivityManagerService mActivityManagerService;
//WMS
private WindowManagerGlobalLock mWindowManagerGlobalLock;
//PMS
private PackageManagerService mPackageManagerService;
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
//创建系统上下文
createSystemContext();
//创建系统Manager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
//启动根服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();
}
//创建系统上下文 实际上是创建ActivityThread类
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
//启动根服务
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
//创建AMS
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
//创建PMS
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
}
//启动核心服务
private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
}
//启动其他服务
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
//AMS准备就绪
mActivityManagerService.systemReady()
//创建WMS
WindowManagerService wm = null;
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
}
}
小结2
由此可见,SystemServer类核心功能有
<1> 创建系统上下文对象。详解如下。
<2> 创建SystemServiceManager对象。使用该对象 创建下面的 AMS。
<3> 创建ActivityManagerService对象。详解如下。
<4> 创建PackageManagerService对象。详解如下。
<5> 创建WindowManagerService对象。详解如下。
创建系统上下文方法详解
//SystemServer类的全局变量
private Context mSystemContext;
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
由此可见,此方法中。
<1> 调用ActivityThread类的systemMain()方法获取ActivityThread类对象。
<2> 调用ActivityThread类的getSystemContext()方法获取上下文对象。
小结3
<1> ActivityThread类的创建时机是SystemServer类的run方法。
<2> 创建ActivityThread类调用的是ActivityThread类的静态方法systemMain()。
ActivityThread类的静态方法systemMain()源码
public static ActivityThread systemMain() {
// The system process on low-memory devices do not get to use hardware
// accelerated drawing, since this can add too much overhead to the
// process.
if (!ActivityManager.isHighEndGfx()) {
ThreadedRenderer.disable(true);
} else {
ThreadedRenderer.enableForegroundTrimming();
}
ActivityThread thread = new ActivityThread();
thread.attach(true, 0);
return thread;
}
创建SystemServiceManager对象方法详解
mSystemServiceManager = new SystemServiceManager(mSystemContext);
创建ActivityManagerService对象方法详解
SystemServer类中几个方法
//startBootstrapServices方法
private void startBootstrapServices() {
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mActivityManagerService.initPowerManagement();
mActivityManagerService.setSystemProcess();
}
//startCoreServices方法
private void startCoreServices() {
mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
}
//startOtherServices方法
private void startOtherServices() {
mActivityManagerService.installSystemProviders();
final Watchdog watchdog = Watchdog.getInstance();
watchdog.init(context, mActivityManagerService);
mActivityManagerService.setWindowManager(wm);
networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,
networkManagement);
mActivityManagerService.enterSafeMode();
mActivityManagerService.showSafeModeOverlay();
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
mActivityManagerService.systemReady()
mActivityManagerService.startObservingNativeCrashes();
}
小结4
<1> 使用 SystemServiceManager对象 创建ActivityManagerService对象。
<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744
创建PackageManagerService对象方法详解
SystemServer类中几个方法
//isFirstBootOrUpgrade方法
private boolean isFirstBootOrUpgrade() {
return mPackageManagerService.isFirstBoot() || mPackageManagerService.isUpgrade();
}
//startBootstrapServices方法
private void startBootstrapServices() {
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
OtaDexoptService.main(mSystemContext, mPackageManagerService);
}
//startOtherServices方法
private void startOtherServices() {
mPackageManagerService.updatePackagesIfNeeded();
mPackageManagerService.performFstrimIfNeeded();
mPackageManagerService.systemReady();
mPackageManagerService.waitForAppDataPrepared();
}
小结5
<1> 使用 PackageManagerService类的main方法创建PackageManagerService对象。
<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744
创建WindowManagerService对象方法详解
SystemServer类中几个方法
//startOtherServices方法
private void startOtherServices() {
WindowManagerService wm = null;
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
mActivityManagerService.setWindowManager(wm);
wm.onInitReady();
inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
wm.displayReady();
statusBar = new StatusBarManagerService(context, wm);
final boolean safeMode = wm.detectSafeMode();
wm.systemReady();
final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);
}
小结6
<1> 使用 WindowManagerService类的main方法创建WindowManagerService对象。
<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744