启动的流程

Posted nangongyibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动的流程相关的知识,希望对你有一定的参考价值。

源码的下载 
如果下载源码的目的是为了编译 android的源码 
推荐使用 linux或者 mac 下载

ubuntu 图形化界面比较靠谱 4月 10月

lamp linux apache mysql php/python 
centos redhat 运维

源码的编译 
souceInsight的使用

1 启动的流程 按下电源键开始一直到 桌面运行起来 
① 加载 bootloader 通过bootloader来加载硬件的驱动 加载linux内核 
②启动linux 内核 运行的第一个进程 init进程 
init.c main函数中 解析了一个配置文件 init.rc 
init.rc中有比较重要的命令

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

    class main

    socket zygote stream 660 root system

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart media

    onrestart restart netd

 

以服务的形式把zygote进程启动起来 
zygote 直接翻译受精卵意思 
它是所有的android应用 和 重要的系统进程的父进程 
android应用的进程都是 zyote进程通过复制自身的形式创建起来的

App_main.cpp 
调用了 AndroidRuntime这个类的 start方法 
这个方法启动了 art虚拟机 并且通过JNI调用 通知虚拟机反射的方式调用了 
zyogeInit.java的 main方法 
这样就从c/C++(native 世界) 来到了java虚拟机的世界中

ZygoteInit.java 
zygote进程的初始化 
①创建了一个socket服务端 等待ams和它联系 (进程间通信使用的是socket的方式) 
② 预加载 包括application framework层中 写代码用到的字节码 加载了系统自带的图片 颜色资源 
③ 启动第一个子进程 systemserver进程 
④ 开启了死循环等待ams发消息

SystemServer进程的启动 
zygote在初始化的时候调用了 startSystemServer方法 创建出zygote复制出的第一个进程 
通过反射调用了SystemServer.java的main方法 
先通过JNI的调用 开启native服务 
创建了ServerThread线程 在这个线程中创建系统服务 把所有的系统服务添加到ServiceManager中 
用key-value的形式进行管理 所以 在应用开发时获取系统服务 getSystemService(key)

当所有的系统服务都创建好了 就会走到 ActivityMangerService的 systemReady方法 
这个时候判断当前的任务栈是否有activity 
如果没有说明是刚启动起来 这个时候就启动桌面




























以上是关于启动的流程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段