Android系统分析

news/2024/4/17 17:41:26

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博客


https://www.xjx100.cn/news/3118914.html

相关文章

Rust多线程任务,发现有些线程一直获取不到锁【已解决】

问题描述 项目中用到rust&#xff0c;其中在多线程中用到了同一个对象的锁&#xff0c;然而发现其中一个线程一直拿不到这个锁。 解决过程 我先是在线程A中加入了sleep方法&#xff0c;这样做的效果就是&#xff0c;比最初好一些&#xff0c;但是拿到锁还是要较长时间&#xf…

PC企业微信http协议接口调用,发送小程序

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

Spring不再支持Java8了

在今天新建模块的时候发现了没有java8的选项了&#xff0c;结果一查发现在11月24日&#xff0c;Spring不再支持8了&#xff0c;这可怎么办呢&#xff1f;我们可以设置来源为阿里云https://start.aliyun.com/ 。 java8没了 设置URL为阿里云的地址

《尚品甄选》:后台系统——分类品牌和规格管理(debug一遍)

文章目录 一、分类品牌管理1.1 表结构介绍1.2 列表查询1.3 添加功能1.4 修改功能1.5 删除功能 二、商品规格管理2.1 表结构介绍2.2 列表查询2.3 添加功能2.4 修改功能2.5 删除功能 一、分类品牌管理 分类品牌管理就是将分类的数据和品牌的数据进行关联&#xff0c;分类数据和品…

【智能家居】面向对象编程OOP和设计模式(工厂模式)

面向对象编程 类和对象 面向对象编程和面向过程编程区别 设计模式 软件设计模式按类型分 工厂模式 面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种程序设计范式&#xff0c;其中程序被组织成对象的集合&#xff0c;每…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

springboot(ssm文学名著分享系统 文化交流平台Java(codeLW)

springboot(ssm文学名著分享系统 文化交流平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…

C#,数值计算——插值和外推,径向基函数插值(RBF_multiquadric)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class RBF_multiquadric : RBF_fn { private double r02 { get; set; } public RBF_multiquadric(double scale 1.0) { this.r02 Globals.SQR(scale); } publi…