启动过程
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
2.C代码中的zygote孵化器,对应的文件Mainapp.cpp(\frameworks\base\cmds\appprocess),主要的工作就是开启了一个java服务(ZygoteInit),从此,java中的zygote服务就开启了:
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())
.systemReady
5.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();
}
经过以上的五个步骤,手机桌面就启动起来了