Android系统启动流程
当系统引导程序启动Linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:init(system/core/init/Init.c)
查看Init.c代码,看main函数
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.rc中定义好的指令都会开始执行,其中执行了很多bin指令,启动系统服务
//启动孵化器进程,此进程是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
在appprocess文件夹下找到appmain.cpp,查看main函数,发现以下代码
int main(int argc, const char* const argv[])
{
...
//启动一个系统服务:ZygoteInit
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
...
}
在ZygoteInit.java中,查看main方法
public static void main(String argv[]) {
...
//加载Android系统需要的类
preloadClasses();
...
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",
}; ...
//分叉启动上面字符串数组定义的服务
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类包名相同,找到comandroidserver_SystemServer.cpp文件
在comandroidserver_SystemServer.cpp文件中,找到了
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
//给init1方法映射一个指针,调用system_init方法
{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};
androidserverSystemServer_init1方法体中调用了systeminit,systeminit没有方法体
在systeminit.cpp文件中找到systeminit方法,方法体中 //执行了SystemServer.java的init2方法 runtime->callStatic("com/android/server/SystemServer", "init2");
回到SystemServer.java,在init2的方法体中
//启动一个服务线程
Thread thr = new ServerThread();
thr.start();
在ServerThread的run方法中
//准备消息轮询器
Looper.prepare();
...
//启动大量的系统服务并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
...
//调用systemReady,准备创建第一个activity
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable(){
...
});
在ActivityManagerService.java中,有systemReady方法,方法体里找到
//检测任务栈中有没有activity,如果没有,创建Launcher
mMainStack.resumeTopActivityLocked(null);
在ActivityStack.java中,方法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系统启动流程的更多相关文章
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- Android系统启动流程(四)Launcher启动过程与系统启动流程
此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...
- 【乘风破浪】Android系统启动流程整理
前言 对于一个Android应用层开发者来说,了解Android系统的启动流程对理解Android系统有很大的帮助.这其中包含了大量的细节,而且前面很多步骤包含了C/C++实现的native层逻辑,作 ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- 源码级分析Android系统启动流程
首先看一下Android系统的体系结构,相信大家都不陌生 1.首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用 ...
- Android系统启动流程(二)解析Zygote进程启动过程
1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ...
- Android系统启动流程 总结
整体流程大致如下: Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为: 1.bootload ...
- 2. Android系统启动流程
1.启动加载完内核 2.执行init进程 ----> 设备初始化工作 a1. 读取inic.rc a2. 启动Zygote进程 ----> 该进程是所有进程的孵 ...
- Android系统启动流程(三)解析SystemServer进程启动过程
1.Zygote启动SystemServer进程 在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示. fra ...
随机推荐
- Linux系统查看系统是32位还是64位方法总结 in 创新实训
这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT ...
- USB学习笔记连载(八):FX2替换到FX2LP需要注意事项
对于使用FX2的用户,可以升级到FX2LP,上述的应用笔记<AN4078-C>中就讲解了在升级中的注意事项. 必要的修改: 1.晶振的匹配电容需要更改,FX2LP是12pF,不过笔 ...
- 《FPGA全程进阶---实战演练》第一章之如何学习FPGA
对于很多初学者,大部分都是急于求成,熟不知越是急于求成,最终越是学无所成,到头来两手空空,要学好FPGA,必须弄懂FPGA本质的一些内容. 1.FPGA内部结构及基本原理 FPGA是可以编程的,必须通 ...
- android 向服务器上传
采用数据流的格式向服务器上传. 代码如下: private void upload(String requestURL) { //参数requestU ...
- 关于Unity中的光照(二)
光源 1: 光照的本质:就是光的颜色和物体纹理的颜色的混合;2: 光源类型: 点光源,定向光源,聚光灯, 区域光源; 区域光的范围会在场景中用黄色的光显示出来; z轴是光的方向; 光的强度会随距离衰减 ...
- C艹 指针和const的关系和注意事项(非常有意思)
有两种不同的形式将const关键字指向指针. 第一种:让指针指向一个常量对象 const float g_moon = 1.63; float * pm = &g_moon; // 不允许 n ...
- 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url
第三百二十六节,web爬虫,scrapy模块,解决重复url——自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...
- SecureCRT同时发送命令到所有主机
有时候我们需要在多台服务器上执行相同的命令,比如安装软件,复制,粘贴,删除等等,但一台一台的去操作工作量就太大了,我们可以借助SecureCRT这款客户端远程连接工具实现这样的要求! 相关阅读: 如何 ...
- DATGRIDVIEW如何不选择第一行,第一列
DataBindingComplete事件中写 ClearSelection();
- Sql Server数据库监听 c#代码
using AnfiniL.SqlServerTools.Data; using SqlServerTools; using SqlServerTools.Data; using System; us ...