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 ...
随机推荐
- VISUAL STUDIO 2012下的OPENCV 2.4.7安装过程
邮箱已经收到了Visual Studio 2013的升级通知,但是很多软件如OpenCV.Qt等都只有VS2012的预编译库,还是懒得升级了(除非VS支持C++11了). 网上搜了一些VS2012(或 ...
- Numpy 利用数组进行数据处理
Numpy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环). 用数组表达式代替循环的做法,通常被称为矢量化.一般来说,矢量化数组运算要比等价的纯跑一趟湖南快 上一两个数量级( ...
- SAP财务供应链与金库管理的联系与区别
SAP Treasure Module & Cash Fund , Risk Management 本文简要阐述一下什么是财务供应链管理(FSCM),什么是金库管理(Treasury Ma ...
- Kb,KB,Kbps,Mb,Mbps等一些列概念
先普及一下Kb,KB,Kbps,Mb,Mbps等一些列概念 1Byte = 8bit1KB (Kilobyte 千字节)=1024Byte1MB (Megabyte,兆字节,简称“兆”)=1024KB ...
- (原创)Linux下一定要4字节地址对齐操作
Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!
- JDBC是什么?
JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语 ...
- Mysql 8.0.11版本,安装成功,使用Navicat连接失败。
Note:本文只针对mac!! 问题 安装mysql成功之后,想自己弄个数据库试试,但是报错.并不是错误代号,而是一段代码: Authentication plugin 'caching_sha2_p ...
- 在js中 把 json对象转化为String对象的方法
方法1: 使用js的扩展方法 ** * json对象转字符串形式 */ function json2str(o) { var arr = []; var fmt = function(s) { if ...
- mothur summary.seqs 统计fasta文件中每条序列的长度
在介绍summary.seqs的用法之前,我们首先需要搞清楚两个概念: 1)ambiguous bases 中文叫做模糊碱基,对于DNA序列来说,只有ATCG 4种碱基,在IUPAC定义的碱基标准中, ...
- js 跨域 Jquery取得iframe中元素的几种方法
http://www.jb51.net/article/34942.htm 收集利用Jquery取得iframe中元素的几种方法 : 父页面访问子页面 $(document.getElementByI ...