源码学习总结《1》Android 系统启动流程

对于NDK开发学习已经完结,并且成功的做出相应的案例,银行卡/身份证卡号识别,现在呢,伟大的学习路程又要开始了,接下来就是要学习系统源码framework相关的知识。(只做个人学习总结,学过就留点痕迹~~,不做长篇大论,谢谢 ^_^ )

对于android源码学习,最开始肯定要了解以下android系统是怎么启动的,这是对android系统启动流程学习的个人总结,第一次学习源码还是要有个辅助 比如:

  1. 源码系列的书
  2. 源码系列的博客
  3. 相关视频讲解

选择一个学习方式,让我们第一次学习不用像个无头苍蝇一样乱撞,不知从何处学起。

我个人是根据书籍来学习的推荐大家: android进阶xxx  https://pan.baidu.com/s/1li1xj_XUDlpzAi4t79q3lA   提取码: dft9

对于android系统启动还是要有点c/c++基础的,我只做总结,需要详细学习了解的,可以去根据书籍来学习。

学习流程:

  1. 首先跟着书籍走一篇,把某整个模块的流程摸清楚
  2. 在有了方向和大体流程,抛开书籍,自己根据源码网站,再多看几篇
  3. 一定要记住 源码不是看 一篇 两篇 就能懂得 时刻来安慰自己,生怕自己会放弃 ^_^

其实源码在网页上看 也听方便的,可以按住ctrl键去查看索引的,看起来也是挺方便。推荐网站:http://androidxref.com/

根据自己情况去选择源码的版本从 1.6 - xxx 都有。 

系统启动流程总结

注释:

[*1] init.rc 文件是一个android初始化语言脚本(android init language),
里面保存了service的命令:
格式 service + service name + service path + 属性。

[*2] 调用init.cpp的main方法创建启动所需要的文件夹和挂载文件,解析init.rc文件,
得到启动service的名字/路径/属性等。利用ServiceParser解析service初始化脚本。
通过解析init.rc文件的service的脚本(根据class_start main)这句脚本运行
do_class_start()-> startifnotdiable() -> service.cpp的start()方法

[*3] AndroidRunTime.start ("com.android.internal.os.Zygoteinit", args, zygote);
传递java层的Zygoteinit的包名到AndroidRunTime中。

[*4] 1.启动虚拟机,2.为虚拟机注册JNI方法,3.利用JNI方法把com.android.internal.os.Zygoteinit 
转化-> com/android/internal/os/Zygoteinit并且查找Zygoteinit类并调用Zygoteinit的main方法
(这样 Zygote 就从 Native 层进入了 Java 框架层)。
根据路径找到jclass,然后根据方法签名利用jni调用main方法。

[*5] 等待SystemServer的进程创建完成之后,调用socket的 runSelectLoop(abiList)方法循环
等待AMS请求来创建新的应用进程。

[*6] 配置SystemServer的参数,handleSystemServiceprocess() -> 
创建pathclassloader 反射调用SystemServer的main方法

[*7] 调用Looper.prepareMainLooper()创建Looper消息,加载library so,创建
system context -> 创建systemservicemanager -> 通过反射创建所有的service,启动引导/核心/其他 服务,
发布了119 篇原创文章 · 获赞 140 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/WangRain1/article/details/98503541