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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于web宠颐生宠物医院系统设计与实现

基于web宠颐生医院系统开发与实现 摘要&#xff1a;时代飞速发展&#xff0c;网络也飞速发展&#xff0c;互联网许多的行业都可以用互联网实现了&#xff0c;互联网已经成为了人们生活中重要的一部分&#xff0c;或多或少的影响着我们的生活&#xff0c;互联网在给我带了方便的…

【Node.js】笔记整理 2 - 常用模块

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

Linux mesg命令详解:如何设置终端机的写入权限并阻止或允许其他用户的信息显示(附实例教程和注意事项)

Linux mesg命令介绍 Linux mesg命令用于设置终端机的写入权限。当mesg设置为y时&#xff0c;其他用户可以利用write指令将信息直接显示在您的屏幕上。如果设置为n&#xff0c;则不允许其他用户将信息直接显示在你的屏幕上。 Linux mesg命令适用的Linux版本 mesg命令在大多数…

ESP32通过IIC同时驱动mpu6050和OLED

mpu6050 //安装库MPU6050_tockn1.5.2 //接线 供电3.3V scl--引脚22 sda----引脚21 #include <MPU6050_tockn.h> #include <Wire.h>MPU6050 mpu6050(Wire);void setup() {Serial.begin(115200);Wire.begin();mpu6050.begin();mpu6050.calcGyroOffsets(true);de…

Bert-VITS2本地部署遇到的错误

关于Bert-VITS2本地部署遇到的错误 1、在下载python中相关依赖时报错 building ‘hdbscan._hdbscan_tree’ extension error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-bu…

【安全-SSH】SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及…

SH文件介绍

SH文件介绍 介绍SH文件示例执行SH文件具体用法 介绍 SH文件通常指的是 Shell 脚本文件&#xff0c;文件后缀名为.sh&#xff0c;其中包含一系列要由操作系统的命令解释器执行的命令。 在 Unix 和类 Unix 操作系统中&#xff0c;通常使用 Bourne Shell&#xff08;sh&#xff…

RabbitMQ消息模型之Routing-Direct

Routing Direct 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能是任意…

刷题笔记(第九天)

1. 求最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”]输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“…

C++面试的一些总结day1:指针和引用的区别

文章目录 指针和引用的区别和作用定义区别作用 指针和引用的区别和作用 定义 指针&#xff1a;指针是一个变量&#xff0c;其值为指向对象的内存地址&#xff0c;而不是值本身。引用&#xff1a;可以理解为对象的别名&#xff0c;是另外一个变量的直接别名&#xff0c;用于创…

Spring不再支持Java8了

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

【Vue3】源码解析-虚拟DOM

【Vue3】源码解析 系列文章什么是虚拟DOMVue 3虚拟DOM获取<template>内容生成AST语法树生成render方法字符串得到最终VNode对象 系列文章 【Vue3】源码解析-前置 【Vue3】源码解析-响应式原理 【Vue3】源码解析-虚拟DOM 什么是虚拟DOM 在浏览器中&#xff0c;HTML页面…

vue实现左侧固定菜单栏锚点及滚动高亮(组件封装)

vue实现左侧固定菜单栏锚点及滚动高亮 先上总代码&#xff1a; 子组件&#xff1a; <!-- LeftSidebar.vue --> <template><div class"left-sidebar"><a v-for"(item, index) in sidebarItems" :key"index" click"s…

WordPress(9)宝塔配置Redis

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、宝塔安装Redis2、安装好先关闭Redis1、Redis密码默认是没有的二、安装php、Redis扩展1.启动Redis三.WordPress 安装Redis1.安装Redis插件2.启动Redis前言 提示:这里可以添加本文要记录的…

Linux ubuntu20.04 安装使用 Intel sgx

文章目录 前言一、简介二、安装Intel SGX Software Stack2.1 安装Intel SGX driver2.2 Build the Intel SGX SDK and Inte SGX PSW Package2.3 Build the Intel SGX SDK and Intel SGX SDK Installer2.4 Install the Intel(R) SGX SDK2.5 Build the Intel SGX PSW and Intel SG…

5 面试题--redis

伪客户端&#xff1a; 伪客户端的 fd 属性值为 -1&#xff1b;伪客户端处理的命令请求来源于 AOF ⽂件或者 Lua 脚本&#xff0c;⽽不是⽹络&#xff0c;所以这种客户端不需要套接字连接&#xff0c;⾃然也不需要记录套接字描述符。⽬前 Redis 服务器会在两个地⽅ ⽤到伪客户端…

ThermalLabel SDK for .NET 13.0.23.1113 Crack

ThermalLabel SDK for .NET 是一个 .NET 典型类库&#xff0c;它允许用户和开发人员创建非常创新的条码标签并将其发布在 zebra ZPL、EPL、EPSON ESC、POS 以及 Honeywell intermec 指纹中通过在 VB.NET 或 C# 上编写 .NET 纯代码来实现热敏打印机&#xff0c;以实现项目框架的…

BiLSTM-CRF的中文命名实体识别

项目地址&#xff1a;NLP-Application-and-Practice/11_BiLSTM-ner-bilstm-crf/11.3-BiLSTM-CRF的中文命名实体识别/ner_bilstm_crf at master zz-zik/NLP-Application-and-Practice (github.com) 读取renmindata.pkl文件 read_file_pkl.py # encoding:utf-8import pickle# …

分享一些基于php商城案例

案例1&#xff1a; ​​​​​​http://www.9520.xin/ 案例2&#xff1a; http://ptll.hasbuy.com/ 案例3&#xff1a; http://likeshop.9520.xin/mobile 案例4&#xff1a; http://www.hasbuy.com/

Ubuntu Linux玩童年小霸王插卡游戏

1.下载安装模拟器 在Windows平台模拟器非常多&#xff0c;而且效果也很优秀&#xff0c;Linux平台的用户常常很羡慕&#xff0c;却因为系统的缘故&#xff0c;无法使用这样的模拟器&#xff0c;但是随着时代的发展&#xff0c;Linux平台也出现了许多优秀的模拟器&#xff0c;现…