Android开机流程
2021-08-03 本文已影响0人
猿规
最近回顾的一些知识,补充了一下。
源码标准:API : 29「Android 10.0」
android手机是怎么开机的?
android 的底层是 linux kernel「内核」,由 BootLoader「系统启动加载器」 负责加载(类似于计算机的BIOS系统)。
/bootable/recovery/bootloader.h
首先启动 init「父进程,第一个进程」进程,接着运行init.rc脚本,脚本文件有个命令启动了Zygote进程,初始化时会启动虚拟机。
image/system/core/rootdir/init.zygote.rc
Zygote进程fork出SystemServer进程,然后会调用SystemServer.main()方法。
/frameworks/base/services/java/com/android/server/SystemService.java
/** The main entry point from zygote.*/
public static void main(String[] args) {
new SystemServer().run();
}
run方法中,主要是在进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等。
private void run() {
//创建主线程Looper、ActivityThread、SystemContext
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
Looper.prepareMainLooper();
// Initialize native services.
System.loadLibrary("android_servers");
// Initialize the system context.
createSystemContext();
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// 并行线程池
SystemServerInitThreadPool.get();
// Start services.
traceBeginAndSlog("StartServices");
startBootstrapServices();
startCoreServices();
startOtherServices();
// Loop forever.
Looper.loop();
}
下面是一些主要的初始化方法。
/**
* 这些服务具有复杂的相互依赖关系,所以需要放一起全部初始化
*/
private void startBootstrapServices() {
// Start the watchdog as early as possible so we can crash the system server
final Watchdog watchdog = Watchdog.getInstance();
watchdog.start();
//启动AMS
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
//电源管理器需要提前启动,因为其他服务需要它
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
// Start the package manager.
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
//设置Application实例并开始
mActivityManagerService.setSystemProcess();
//使用 ActivityManager 实例完成看门狗设置并监听重启
watchdog.init(context, mActivityManagerService);
}
真正启动是在ActivityManagerService的中systemReady方法,调用resumeTopActivityLocked打开锁屏界面。
/**
* Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
*/
private void startOtherServices() {
//启动WMS
wm = WindowManagerService.main();
mActivityManagerService.setWindowManager(wm);
//WMS 显示默认启动消息
ActivityManagerNative.getDefault().showBootMessage();
//开始启动初始应用程序
mActivityManagerService.systemReady(new Runnable(){
//SystemUI
startSystemUi(context, windowManagerF);
});
}
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
/** 通过StackSupervisor运行所有 ActivityStacks */
final ActivityStackSupervisor mStackSupervisor;
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
到这里,android的开机流程结束。