原址

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 666onrestart 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[])
{//启动一个系统服务:ZygoteInitruntime.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) {//启动lauchermMainStack.resumeTopActivityLocked(null);
}

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

final boolean resumeTopActivityLocked(ActivityRecord prev) {ActivityRecord next = topRunningActivityLocked(null);//判断栈顶是否有activity,没有的话直接启动laucherif (next == null) {// There are no more activities!  Let's just start up the Launcher...if (mMainStack) {return mService.startHomeActivityLocked();}}
}

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

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

最后附上时序图一张

Android系统启动流程源码分析相关推荐

  1. Android关机流程源码分析

    上一篇文章Android 开关机动画显示源码分析详细介绍了开关机动画的显示过程,Android系统开机时,在启动SurfaceFlinger服务过程中通过Android属性系统方式来启动bootani ...

  2. Activity启动流程源码分析(基于Android N)

    Activity启动流程源码分析 一个Activity启动分为两种启动方式,一种是从Launcher界面上的图标点击启动,另一种是从一个Activity中设置按钮点击启动另外一个Activity.这里 ...

  3. Activity启动流程源码分析-浅析生命周期函数

    源码分析 接着上一篇 Activity启动流程源码分析-setContentView源码阅读 的讲解,本节介绍一下Activity的生命周期函数何时被调用 要看Activity的生命周期函数何时被调用 ...

  4. OkHttp原理流程源码分析

    OkHttp已经是非常流行的android客户端的网络请求框架,我其实在项目中使用也已经好几年了,之前一直把重心放在如何快速的搞定业务上.迭代的效率上,这一点来讲,对于一个公司优秀员工是没有毛病的.但 ...

  5. 【源码分析】storm拓扑运行全流程源码分析

    [源码分析]storm拓扑运行全流程源码分析 @(STORM)[storm] 源码分析storm拓扑运行全流程源码分析 一拓扑提交流程 一stormpy 1storm jar 2def jar 3ex ...

  6. nimble源码学习——广播流程源码分析1

    广播流程源码分析1 在controller层有多种状态:广播.空闲.连接等等,这次分析的是广播这个状态或者叫 做角色.在前面controller层循环的分析中,可以明确controller层也有eve ...

  7. Android uevent进程源码分析

    在Android Init进程源码分析中讲到init进程会依次执行被加入到待执行队列action_queue中的Action,在init.rc中我们有这么一段配置: 11 on early-init1 ...

  8. YOLOv3反向传播原理 之 全流程源码分析

    YOLOv3反向传播原理 之 全流程源码分析 1.YOLOv3网络训练中反向传播主体流程 1.1 初始化 1.2 batch内梯度累加 1.3 network和layer 中的关键变量 2.YOLO层 ...

  9. SpringBoot2 | SpringBoot启动流程源码分析(一)

    首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 SpringBoot2 | SpringBoot启动流程源码分析(一) 置顶 张书康 201 ...

最新文章

  1. 小程序地图多个 circles 使用demo
  2. 暑期集训4:栈,树,优先队列 例 :  UVA - 514 ​​​​​​​​​​​​​​
  3. 6-java代码片段
  4. 收官蓉城,展望2019多媒体技术新方向(内附资料下载)
  5. 胡润百富:华为成为中国最值钱消费电子企业 小米排名第二
  6. python读取npy文件 mse_python读取mat或npy文件以及将mat文件保存为npy文件(或npy保存为mat)的方法...
  7. 倾斜模型精细化处理_无人机倾斜影像三维建模中的模型精细化
  8. C# 后台js重定向Response.Write
  9. 重启Usb蓝牙设备(PD虚拟机模拟插拔)
  10. (2) python--pandas
  11. Python抓取网易云音乐热搜榜热评
  12. 谷歌浏览器访问抖音网页版白屏
  13. 算法之狼羊菜过河问题
  14. 如何用计算机画函数图像,怎样用电脑画函数图象,或用什麽软件画
  15. 小涛python学习路程-(2)编程基本概念
  16. 电大计算机阅读英语作文,关于电大生活的英语作文
  17. MAC OS下编译tensorflow 2.4.1 - 支持GPU CUDA 10.1和AVX2 FMA
  18. zebradesginer zpl代码_老司机为您win7系统安装斑马GK888t打印机驱动的操作技巧
  19. 【自学Docker 】Docker export命令
  20. 加州大学伯克利分校:MapReduce Spark

热门文章

  1. 存储过程系列之存储过程sql数据库调用和程序代码调用
  2. Settings界面分析之Settings一级界面
  3. 27款实用高效的腾讯热门开源项目推荐
  4. 20款免费响应式的 HTML5 网站模板下载
  5. 使用Stanford NLP software进行中文文本预处理
  6. 传参:@RequestParam @RequestBody @PathVariable的作用
  7. 数据库操作update,和insert为什么会有int的返回值
  8. 通过用户电脑ip获取用户当前所在城市以及天气
  9. 定制Dynamics CRM标准导出功能:不能导出指定列的值
  10. java基础知识总结(4)