当前位置: 首页 > article >正文

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桌面等


http://www.kler.cn/a/6665.html

相关文章:

  • 微软开源GraphRAG的使用教程(最全,非常详细)
  • Windows重装后NI板卡LabVIEW恢复正常
  • 进阶——十六届蓝桥杯嵌入式熟练度练习(按键+LCD)
  • ant design vue的级联选择器cascader的悬浮层样式怎么修改
  • 换了城市ip属地会变吗?为什么换了城市IP属地不变
  • 移动端H5缓存问题
  • ChatGPT惨遭围剿?多国封杀、近万人联名抵制……
  • 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表
  • 如何使用LaTeX中的命令【博文生成:ChatGPT 3.5】
  • SpringBoot - 集成RestTemplate模板(二) - GET请求
  • 如何恢复回收站被清空的文件
  • Troubleshooting 专题 - 问正确的问题 得到正确的答案
  • fastDDS之Domain
  • 聊聊MyBatis缓存机制(一)
  • java this
  • 【数据结构篇C++实现】- 哈希表
  • impala set设置MEM_LIMIT
  • 【Java】【并发编程】Synchronized
  • 警惕,3月20日WOS目录更新,50本SCI/SSCI被剔除,这个出版社多达18本
  • PX4从放弃到精通(二十七):固定翼姿态控制
  • Java:5大最佳Java库
  • 跳表skiplist
  • Android12 Launcher3客制化:添加非抽屉模式(可动态切换)、图标自动补位功能
  • 使用C#中的Aspose Word 在对Word文档中的书签详细总结(包括增删改查等操作)
  • python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(十)(附python示例代码)
  • 2023年美赛春季赛 赛题浅析