Linux启动过程
- 加载 BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;
- 读取并运行第一个启动装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
- 依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
- 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯
- init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络、时区等)
- init 运行 run-level 的各个服务之启动 (script 方式);
- init 运行 /etc/rc.d/rc.local 文件;
- init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦;
android启动基本流程
开机执行bootloader程序
操作系统内核初始化
执行第一个应用程序
开机复位完成后,会执行rom的小块程序,这个程序就是bootloader
bootloader会选择从哪个物理接口装载用户程序,如usb,sd卡等,android装载
的是fastboot,fastboot用来初始化设备,提供开发调试,内核烧写等
当fastboot被bootload装载运行后,如果没有检测到特殊按键,就开始装载linux内核
linux内核装载后,就开始内核初始化过程
源代码查阅流程
- 加载内核完成后,Android系统会启动第一个进程 init进程(system/core/init/init.c)
int main(int argc, char **argv)
{
...
//执行Linux指令
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
...
//解析执行init.rc配置文件
init_parse_config_file("/init.rc");
...
}
init进程>挂载目录>运行init.rc脚本
2, 在init.rc中,启动了进程孵化器zygote,执行了app_main.cpp
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
app_process 是一个目录,里面有一个cpp文件app_main.cpp,执行了该文件
3, 在app_main.cpp里
int main(int argc, const char* const argv[])
{
...
//启动一个系统服务:ZygoteInit
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
...
}
启动了一个系统服务ZygoteInit
4, 在ZygoteInit.java,main方法
public static void main(String argv[]) {
...
//加载Android系统需要的类
preloadClasses();
...
if (argv[1].equals("true")) {
//调用方法启动一个系统服务
startSystemServer();
}
...
}
peloadClasses加载了系统的类,然后调用了startSystemServer()方法
5, startSystemServer方法启动了SystemServer服务,在SystemServer.java的main方法里
public static void main(String[] args) {
...
//加载动态链接库
System.loadLibrary("android_servers");
//执行链接库里的init1方法
init1(args){
init2();//调用了init2方法
}
...
init2(){
//启动一个服务线程
Thread thr = new ServerThread();
thr.start();
}
}
6, SystemServer开启了一个线程,该线程的run方法
run() {
//准备消息轮询器
Looper.prepare();
...
//启动大量的系统服务并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
...
//调用systemReady,准备创建第一个activity
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable(){
...
});
}
7, 查看ActivityManagerService的ystemReady方法
//检测任务栈中有没有activity,如果没有,创建Launcher
mMainStack.resumeTopActivityLocked(null);
8, mMainStack是ActivityStack,查看它的resumeTopActivityLocked方法
// Find the first activity that is not finishing.
ActivityRecord next = topRunningActivityLocked(null);
...
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
// 启动桌面
if (mMainStack) {
return mService.startHomeActivityLocked();
}
}
最后就启动了桌面,下一学习,Android 滑动分析