android系统的启动流程
2015-07-12 16:59
483 查看
体系
流程
当系统引导程序启动linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,android系统开始启动并加载第一个用户级别的进程:init(system/init/Init.c)*查看 Init.c代码 看main函数
int mai(int argc,char**argv){
//执行linux指令
makdir(“/dev”,0755);
makdir(“/proc”,0755);
makdir(“/sys”,0755);
…
//解析执行init.c配置文件
init_parse_config_file(“init.rc”);
..
}
在init.rc中定义好的指令都会开始执行,其中执行了很多bin指令,启动系统服务
//启动孵化器进程,此进程是android系统启动关键服务的一个母进程
*在app_process文件夹下找到app_main,cpp,查看main函数,发现以下代码
int main(int argc ,const char* const argv[]){
//启动一个系统服务:ZygoteInit
}
*在ZygoteInit,java中,查看main方法
public static void main(String argv[]){
//加载android系统需要的类
proloadClasses();
if(argv[1].equals(“true”)){
//调用方法启动一个系统服务
startSystemServer();
}
}
*在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”,
“com.android.server.SystemServer”,
};
[code] ... //分叉启动上面字符串数组定义的服务 pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities);
*SystemServer服务被启动
public static void main(String[] args){
//加载动态链接库
System.loadLibrary(“android_servers”);
//执行连接库里面的init1方法
init1(args);
}
*
* 动态链接库文件和java类包名相同,找到com_android_server_SystemServer.cpp文件
* 在com_android_server_SystemServer.cpp文件中,找到了
[code] static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ //给init1方法映射一个指针,调用system_init方法 { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 }, };
android_server_SystemServer_init1方法体中调用了system_init,system_init没有方法体
在system_init.cpp文件中找到system_init方法,方法体中
//执行了SystemServer.java的init2方法
runtime->callStatic(“com/android/server/SystemServer”, “init2”);
回到SystemServer.java,在init2的方法体中
[code]//启动一个服务线程 Thread thr = new ServerThread(); thr.start();
在ServerThread的run方法中
[code]//准备消息轮询器 Looper.prepare(); ... //启动大量的系统服务并把其逐一添加至ServiceManager ServiceManager.addService(Context.WINDOW_SERVICE, wm); ... //调用systemReady,准备创建第一个activity ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady(new Runnable(){ ... });
在ActivityManagerService.java中,有systemReady方法,方法体里找到
[code]//检测任务栈中有没有activity,如果没有,创建Launcher mMainStack.resumeTopActivityLocked(null);
在ActivityStack.java中,方法resumeTopActivityLocked
[code]// 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(); } } ... ![转载](http://img.blog.csdn.net/20150712165832661)
相关文章推荐
- [Android随笔]Android关于Crash的处理
- android学习路线:如何成长为高级工程师
- 【Android】关于使用空格对齐文字
- Android Studio 项目目录结构
- android 程序中禁止屏幕旋转和重启Activity
- Android应用被killed时,Service不被一起kill的方法
- Android Studio SDK Download interrupted: Read timed out解决
- Mac下Android studio 之NDK配置教程(二)
- android 中“分享一下”的实现方法
- Android去掉标题栏和全屏
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android 屏幕(View)坐标系统
- android坐标
- Android基础入门
- 优雅的处理Android数据库升级的问题
- Android fragment
- AndroidStudio打包及引用aar - Android
- Android页面事件挂接模拟
- Android数据存储之IO
- android ActionBar(2)