android系统启动分析,Android系统启动流程源码分析

用Source Insight来追踪Android系统启动流程的源码,并将我认为重要的源码进行分析

1、当系统引导程序启动Linux内核,内核会记载各种数据结构和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:Init.c(system\core\init)

//Init.c中的main()方法

int main(int argc, char **argv)

{

//解析执行init.rc配置文件

init_parse_config_file("/init.rc");

}

2、执行配置文件init.rc(system\core\rootdir)中定义好的指令,进行环境初始化;执行了很多bin指令,来启动系统服务

//启动孵化器进程,执行app_process(一个编译好的可执行文件)

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

3、在app_process文件下找到app_main.cpp,查看main()方法

int main(int argc, const char* const argv[])

{

//启动一个系统服务:ZygoteInit

runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);

}

4、在ZygoteInit.java中,查看main()方法

public static void main(String argv[]) {

//预加载Android系统所需要的类

preloadClasses();

if (argv[1].equals("true")) {

//调用方法开启系统服务

startSystemServer();

}

}

preloadClasses(),加载Android运行时环境

/**

* The name of a resource file that contains classes to preload.

*/

//“preloaded-classes”这个文件里面是Android中所有需要加载的全包名

private static final String PRELOADED_CLASSES = "preloaded-classes";

private static void preloadClasses() {

//用类加载器,根据文件名,加载资源作为一个输入流

InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(PRELOADED_CLASSES);

BufferedReader br = new BufferedReader(new InputStreamReader(is), 256);

String line;

//一行一行的读取全包名

while ((line = br.readLine()) != null) {

//根据全包名加载类

Class.forName(line);

}

}

startSystemServer(),这个方法开启系统服务

String args[] = {

"--setuid=1000",

"--setgid=1000",

"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,

1009,1010,1018,3001,3002,3003",

"--capabilities=130104352,130104352",

"--runtime-init",

"--nice-name=system_server",

//开启SystemServer服务

"com.android.server.SystemServer",

};

5、启动SystemServer服务

//C库中的init1()方法

native public static void init1(String[] args);

public static void main(String[] args) {

//加载C库

System.loadLibrary("android_servers");

//执行C库里的init1方法

init1(args);

}

在om_android_server_SystemServer.cpp文件,找到init1()方法

static JNINativeMethod gMethods[] = {

/* name, signature, funcPtr */

//给init1方法映射一个指针,最后调用了system_init()方法,而system_init()没有方法体

{ "init1", "([Ljava/lang/String;)V", (void*)

android_server_SystemServer_init1 },

};

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)

{

system_init();

}

extern "C" int system_init();

在system_init.cpp文件中找到system_init()方法

extern "C" status_t system_init()

{

//这个方法里主要是开启硬件管理服务

SensorService::instantiate();

AudioFlinger::instantiate();

MediaPlayerService::instantiate();

CameraService::instantiate();

//执行SystemServer类中的init2()方法

runtime->callStatic("com/android/server/SystemServer", "init2");

}

回到SystemServer类中的init2()方法

public static final void init2() {

//创建系统服务线程

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

6、在ServerThread类中的run()方法中,开启系统的其他服务

//准备消息轮询器

Looper.prepare();

//启动大量的系统服务并把其逐一添加至ServiceManager

ServiceManager.addService(Context.WINDOW_SERVICE, wm);

//调用ActivityManagerService类中的systemReady()方法,准备创建第一个activity

((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {});

7、在ActivityManagerService.java中,找到systemReady()方法

public ActivityStack mMainStack;

public void systemReady(final Runnable goingCallback) {

//启动laucher

mMainStack.resumeTopActivityLocked(null);

}

在ActivityStack.java中找到resumeTopActivityLocked()方法

final boolean resumeTopActivityLocked(ActivityRecord prev) {

ActivityRecord next = topRunningActivityLocked(null);

//判断栈顶是否有activity,没有的话直接启动laucher

if (next == null) {

// There are no more activities! Let's just start up the Launcher...

if (mMainStack) {

return mService.startHomeActivityLocked();

}

}

}

至此,Laucher已经被启动,Android系统启动完成;

声明:本文只做学习交流,欢迎大家提出各类问题,让我们共同进步!!!

最后附上时序图一张

9cbf147da660

Android系统的启动时序图.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值