Android系统启动过程小结

Android系统启动过程

1. 当电源键按下之后,芯片会加载BootLoader到内存中,BootLoader进而会去加载系统内核

2. 系统内核启动后会启动第一个进程:init进程

  • init进程主要用于启动和守护系统关键服务,比如:网络、通话相关服务、Zygote进程、ServiceManager等等

  • 它是通过解析init.rc文件来启动这些系统关键服务

  • init进程是1号进程,属于第一个用户进程,0号进程是内核进程

3. init进程启动Zygote进程

  • Zygote进程原名是叫app_process,对应的源文件是app_main.cpp

  • 它的主要作用是:

    • 加载系统资源(比如android jar包中framework层那些类)

    • 在ZygoteInit类中创建LocalServerSocket用于监听创建APP进程需求,创建APP进程主要是通过fork的方式进行

    • 启动SystemServer进程

    • 在ProcessState中打开Binder驱动,通过mmap创建Binder接收缓存区,以及开启Binder线程池

  • 为什么Zygote通过fork创建进程?

    • 之所以用fork而不是直接创建新的进程,是因为通过fork方式创建的进程属于zygote的子进程,子进程是可以共享父进程Zygote的资源的,由于每一个APP进程都需要用到系统framework层相关资源,如果每个进程都去加载一份就太浪费系统资源了,所以在Zygote进程中加载这些系统资源,那么通过Zygote fork出来的App子进程就可以共享这些系统资源了
  • 为什么使用Socket而不是Binder通信?

    • 因为Binder是多线程的,而fork这种方式创建子进程是不能在多线程环境下进行的,容易造成死锁,这是因为fork创建进程使用了copy_on_write机制,这个机制是在创建子进程时不拷贝父进程数据到子进程,当子进程需要修改时才进行拷贝,从而提高了创建子进程的速度;但是在拷贝到子进程过程中,会把父进程的锁状态也拷贝过去,但是锁的释放又必须在原来的父进程中进行,就会造成死锁问题,所以不能在多线程环境下fork子进程

4. Zygote启动SystemServer进程

  • SystemServer主要用于启动framework层常见的服务,比如:AMS、PMS、WMS、IMS等等,这些服务都是运行在SystemServer进程中
  • 这些系统服务启动后会被注册到ServiceManager中,供其他app调用,Binder通信

5. SystemServer启动PMS\AMS\WMS等

  • PMS会去系统目录下查找所有的APK文件,解析里面的AndroidManifest文件,将app四大组件等信息封装成对象保存到PMS中,当AMS要启动四大组件时,就会先通过PMS去获取组件信息

  • Android 7.0开始使用PMS使用线程池并发去解析apk文件

  • AMS主要负责管理四大组件的启动、生命周期管理

  • WMS主要负责窗口相关的管理

  • 学习PMS源码可以模拟PMS解析apk包的过程,将apk包中四大组件信息解析出来,可以实现可下发的组件,为插件化提供支持

  • 学习AMS源码可以hook Activity的启动过程,将未注册到AndroidManifest的Activity启动起来,为插件化、统一登录校验等提供支持;

  • hookActivity启动过程具体的实现方法是:

    • hook住ActivityManager,在启动Activity之前将要启动的未注册的Activity替换成已经注册的某个Activity从而绕过验证;主要是通过ActivityManager中的单例获取到IActivityManager实例,然后通过反射和动态代理实现hook

    • 在ActivityThread的Handler中hook住启动Activity的消息,将要启动的Activity又换回要启动的未注册的Activity,从而启动未注册的Activity;主要通过ActivityThread获取到主线程Handler对象,然后利用了Handler里的callback优先于handleMessage方法执行,通过反射给Handler里的Callback赋值进而hook

  • Hook的关键主要是通过静态变量、静态方法、持有要hook的对象的对象找到hook点,缺点是不同Android版本源码有差异,需要适配不同版本系统

6. 在AMS等服务启动后会去启动SystemUI、Launcher桌面等

猜你喜欢

转载自blog.csdn.net/guangdeshishe/article/details/129962993