启动的流程

源码的下载 
如果下载源码的目的是为了编译 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 
如果没有说明是刚启动起来 这个时候就启动桌面

转载于:https://www.cnblogs.com/nangongyibin/p/10425304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值