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