Android系统分析

Android工程师进阶第八课 AMS、WMS和PMS

一、Binder通信

【Android Framework系列】第2章 Binder机制大全_android binder-CSDN博客

Android Binder机制浅谈以及使用Binder进行跨进程通信的俩种方式(AIDL以及直接利用Binder的transact方法实现)_binder通信_低调网友的博客-CSDN博客 Android Binder通信原理--02:Binder入门篇 - 简书

androidbinder面试详解简书 androidbinder机制原理_flyingsmiling的技术博客_51CTO博客

百度安全验证

Android 面试必备:高工必问Binder机制~ - 知乎

**二、**AMS启动流程

【Android Framework系列】第5章 AMS启动流程-CSDN博客

android 的AMS是什么 android ams原理_mob6454cc745a10的技术博客_51CTO博客

Android系统组件------AMS,App启动中的AMS流程 - 知乎

透视Android系统AMS、PMS和WMS,了解开发中的重要角色 - 知乎

Android系统重要组件AMS_android ams_Just_Paranoid的博客-CSDN博客

AMS android ams android 介绍_mob64ca1417b0c6的技术博客_51CTO博客

Android之AMS原理分析 - 简书

深入分析AMS启动流程-ams启动流程

面试官: AMS在Android起到什么作用,简单的分析下Android的源码

三、Android应用启动流程分析

android 应用进程 android 进程启动流程_mob6454cc6acccd的技术博客_51CTO博客

三分钟带你了解Android 系统启动流程详解

Android应用启动流程分析 - 知乎

Android开发Launcher进程启动流程_Android_脚本之家

四、Activity创建/启动流程;

Activity 启动主要涉及到3个进程。

  • 系统进程 SystemServer (负责管理整个framework,是Zygote孵化的第一个进程)
  • App进程(App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的)
  • Zygote进程(所有进程孵化都由Zygote完成,而Zygote是init进程的子进程,也由init进程孵化)
  • 如果点击桌面icon启动还会涉及到 Launcher进程(Zygote孵化的第一个应用进程)

1、根Activity的启动流程。

(1)点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的AMS(ActivityManagerService)发起startActivity的请求。

(2)system_server进程接收到请求后,会检查要启动的Activity所在的进程是否已经启动了,如果已经启动了就打开,如果未启动则采用Socket IPC向Zygote进程发出创建APP进程的请求;

Zygote进程fork出新的进程,即APP进程;

(3)APP进程通过Binder IPC向system_server进程发起attachApplication请求;

system_server进程在接收到请求后,进行一系列的准备工作后,再通过Binder IPC向APP进程发送scheduleLaunchActivity的请求:

(进程创建好以后,会调用ActivityThread.main(),初始化MainLooper,并创建Application对象。然后Instrumentation.newApplication()反射创建Application,创建ContextImpl通过Application的attach方法与Application进行绑定,最终会调用Instrumentation.callApplicationOnCreate执行Application的onCreate函数进行一些初始化的工作。完成后会通知AMS进程已经启动好了。)

(4)APP进程接收到请求后,通过Handler向主线程发送LAUNCH_ACTIVITY消息,创建目标Activity,进入Activity的生命周期

ActivityManagerProxy是AMS的远程接口,ApplicationThreadProxy是ApplicationThread的远程接口。

2、进程内启动Activity。

普通Activity启动过程涉及AMS所在进程(system_server)和APP进程

APP进程通过Binder IPC向system_server进程发起请求

system_server在接收到请求后,进行一系列准备工作(解析Activity,处理启动参数),再通过Binder IPC向APP进程发送消息

APP进程在接收到请求后,创建目标Activity,进入Activity的生命周期。

3、源码分析链路:

启动一个Activity一般通过startActivity()

startActivity(new Intent(OneActivity.this,TwoActivity.class));
  • Activity

    startActivity()

    startActivityForResult()

  • Instrumentation 用于实现应用程序检测代码的基类。当在打开程序指令的时候运行,这个类将在任何应用程- 序代码之前为您实例化,可以监视系统与应用程序的所有交互。在AndroidManifest.xml文件的<instrumentation>标记。

    execStartActivity()

  • ActivityManagerService

    startActivity()

    startActivityAsUser()

  • ActivityStarter 用于解释如何启动活动。此类记录所有逻辑,用于确定如何将意图和标志转换为Activity以及关联的任务和堆栈。

    execute()

    startActivity()

    startActivityUnchecked()

  • ActivityStackSupervisor

    resumeFocusedStackTopActivityLocked()

  • ActivityStack 单个Activity堆栈的状态和管理

    resumeTopActivityUncheckedLocked()

    resumeTopActivityInnerLocked()

  • ActivityStackSupervisor Activity堆栈管理

    startSpecificActivityLocked()

    realStartActivityLocked()

  • ClientTransaction 一种容器,它保存一系列消息(比如声明周期的状态),这些消息可以发送给client。

    ClientTransaction.obtain(app.thread, r.appToken)//初始化

    addCallback((LaunchActivityItem.obtain(new Intent(r.intent),...)

  • ClientLifecycleManager //该类能够组合多个client生命周期转换请求/回调,并将它们作为单个事务执行

    scheduleTransaction(clientTransaction)

  • ClientTransaction

    schedule()

  • ApplicationThread

    scheduleTransaction()

  • ActivityThread 它管理应用程序进程中主线程中执行的调度和执行活动、广播以及活动管理器请求的其他操作。

    scheduleTransaction()

    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

  • ClientTransactionHandler //ActivityThread 继承 ClientTransactionHandler,所以调用了父类scheduleTransaction()

    scheduleTransaction()

  • TransactionExecutor 以正确的顺序管理事务执行

    execute()

    executeCallbacks()

    transaction.getCallbacks().get(i).execute()

  • LaunchActivityItem 请求启动Activity

    execute()

  • ActivityThread

    handleLaunchActivity()

    performLaunchActivity()

  • Instrumentation

    callActivityOnCreate()

  • Activity

    onCreate()

Activity的启动流程_activity启动流程_ErwinNakajima的博客-CSDN博客

Activity的启动流程这一篇够了 - 简书

Activity启动流程-基于Android API31 - 简书

Android Activity的创建流程(Android-10)_mb648c1d58d9d6b的技术博客_51CTO博客

Android Activity学习笔记------Activity的启动和创建_wx63b644a53b596的技术博客_51CTO博客

Android Activity的创建流程(Android-10)_activity创建流程_Misdirection_XG的博客-CSDN博客

https://blog.51cto.com/u_16163480/6991935

Activity创建流程-CSDN博客

Activity 之 Window 创建过程_activity window-CSDN博客

五、Android WMS的解析 (UI渲染显示)

【Android Framework系列】第7章 WMS原理_android wms___Yvan的博客-CSDN博客

Android开发中的WMS详细解析

【Android】WMS(四)WMS职责_android wms-CSDN博客

Android---WMS核心分析_android wms-CSDN博客

Android---WMS核心分析_android wms-CSDN博客

Android WMS工作原理浅析(一)_惜许的博客-CSDN博客

Android WMS工作原理浅析(二)_惜许的博客-CSDN博客

WMS启动流程分析 | Skytoby

WMS---启动过程 - Gityuan博客 | 袁辉辉的技术博客

Android Framework底层原理之WMS的启动流程 - 知乎

【安卓12源码】WMS的作用及其启动流程_android wms_蜘蛛侠不会飞的博客-CSDN博客

关于一些Android WMS的解析 - 简书

【Android Framework系列】第7章 WMS原理_android wms___Yvan的博客-CSDN博客

相关推荐
zhangphil8 分钟前
Android简洁缩放Matrix实现图像马赛克,Kotlin
android·kotlin
m0_512744648 分钟前
极客大挑战2024-web-wp(详细)
android·前端
lw向北.25 分钟前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
不爱学习的啊Biao33 分钟前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
Clockwiseee1 小时前
PHP伪协议总结
android·开发语言·php
mmsx8 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
众拾达人10 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌11 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
_Shirley13 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei14 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576