启动过程
Bootloader 引导程序 ---> Linux Kernel 内核启动 ---> Android 系统启动
启动入口:init进程(Linux系统中用户空间的第一个进程) init.c --- > main 还是从main方法开始启动
加载配置(init.rc)
启动孵化器(zygote)——java世界孵化器
system_init启动Native世界
ServiceThread启动Java世界
详细过程:
1. 手机通电以后(按开机键后),首先加载驱动程序,然后去加载第一个用户进程,init.c(android2.3\system\core\init.c)
int main(int argc, char **argv) { ... //创建所需要的文件夹 mkdir("/dev", 0755); ... //加载设备 mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755"); mkdir("/dev/pts", 0755); ... //初始化log log_init(); ... //初始化,并解析配置文件 init.rc init_parse_config_file("/init.rc"); ...
init.rc文件中的主要内容:
//加载设置 //启动服务,最主要就是zygote服务(孵化器),android系统就是从这孵化出来的 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd
int main(int argc, const char* const argv[]) { //获得虚拟机的引用 AppRuntime runtime; //开启第一个java程序 setArgv0(argv0, "zygote"); set_process_name("zygote"); runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
3.com.android.internal.os.ZygoteInit.java 类中的主要工作:
public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024); ... //加载android中所有的类文件 preloadClasses(); //加载android中所有的资源 preloadResources(); ... //开启系统服务 com.android.server.SystemServer startSystemServer();
4.SystemServer.java 中主要有二个方法 native方法 init1() 和java方法 init2() 方法 ,其中init1开启android系统中和硬件相关的服务,init2方法,开启android系统中的其他服务
init1 调C代码开启硬件相关的服务: System_init.cpp文件中 // Start the AudioFlinger AudioFlinger::instantiate(); // Start the media playback service MediaPlayerService::instantiate(); // Start the camera service CameraService::instantiate(); // Start the audio policy service AudioPolicyService::instantiate(); init2()方法 开启SystemThread线程,在此线程中,加载androd服务 如: //开启和硬件无关的服务, devicePolicy = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, devicePolicy); //通知ActivityManagerService系统已经准备好了 ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady5.ActivityManagerService中的systemReady 方法中的处理事件:
//发出一个开机广播 Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); broadcastIntentLocked(null, null, intent, null, finisher, 0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID); // 通知ActivityStack 将最上层的activity运行,此时,ActivityStack 中为空的,会开启luncher应用 mMainStack.resumeTopActivityLocked(null); .. ActivityRecord next = topRunningActivityLocked(null); if (next == null) { // // There are no more activities! Let's just start up the // Launcher... if (mMainStack) { return mService.startHomeActivityLocked(); }
经过以上的五个步骤,手机桌面就启动起来了