大家好,又见面了,我是你们的朋友全栈君。
作为一名程序员,肯定不仅仅限于使用API文档,因为浮于表面是远远不够的。进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。
引用Google的一张框架图:

Google提供的四层架构非常经典,如果我们要深入学习这个架构,最好就是以Android系统启动流程开始学起,然后一步一步展开,牵引学习。这样不至于我们陷入源码的大海里而没有方向。
这个是之前我画的一张启动流程图:

Java和C++通过JNI连接,C/C++通过system call直接调用linux os。
1. Boot ROM: 上电后,BootRom会被激活,引导芯片代码开始从预定义的地方(固化在ROM)开始执行,然后加载引导程序到RAM。
2. Boot Loader引导程序 Boot Loader是启动Android系统之前的引导程序,引导程序是OEM厂商或者运营商加锁和限制的地方,它是针对特定的主板与芯片的。OEM厂商要么使用很受欢迎的引导程序比如redboot、uboot、ARMboot等或者开发自己的引导程序,它不是Android操作系统的一部分。 Boot Loader主要作用是检查RAM,初始化硬件参数等功能。
Kernel的启动流程:
alps/kernel/init/main.c start_kernel() ==> rest_init() ==> kernel_thread(kernel_init) ==> kernel_init()
0号进程: swapper进程(pid=0):又称为idle进程, 叫空闲进程,由系统自动创建, 运行在内核态。 系统初始化过程Kernel由无到有开创的第一个进程, 也是唯一一个没有通过fork或者kernel_thread产生的进程。 swapper进程用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
1号进程 init进程(pid=1):由0号进程通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终运行在用户空间,init进程是所有用户进程的鼻祖。
2号进程 kthreadd进程(pid=2):由0号进程通过kernel_thread创建,是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。 kthreadd运行在内核空间, 负责所有内核线程的调度和管理 , kthreadd进程是所有内核进程的鼻祖。
Native层主要是init一号进程,并且由其孵化出来的一系列daemon进程,还有一些列native service。
Zygote进程孵化出的第一个App进程是Launcher,Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。所有的App进程都是由Zygote进程fork生成的。
了解了大致的框架体系之后,接下来就是给自己列一个学习计划。博主不定期总结学习内容到博客上面来,与大家一起分享。博客会以Android N源码为主来分析,尽量每个知识点做到多画图,多总结,少贴大段源码,避免犯困。
Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider。
init进程,如何启动zygote进程和system_server进程: 参考:https://maoao530.github.io/2017/02/06/android-study/
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134747.html原文链接:https://javaforall.cn