Android SystemServer 系列专题【篇五:UserController用户状态控制】

本篇接着SystemServer的启动流程,围绕SystemServer最后阶段关于主用户的启动和解锁的流程,作为切入点,来看看SystemServer是如何讲用户状态同步到所有的系统级服务中。

  • ssm.onStartUser
  • ssm.onUnlockingUser
  • ssm.onUnlockedUser

本篇先介绍UserController是如何管理用户状态,SystemServiceManager是如何把用户状态通知到所有的系统级服务,如上三个场景的触发条件来分别介绍。

1、UserController

UserController从命名来看,就是用户控制器,他仅仅是一个控制器,即不是进程,不是系统服务,仅仅用来封装用户状态的对象。先看看他的定义:

1)UserController持有者

从构造函数都可以看到传递了ams,即ams和他息息相关。这里值得注意的是存在一个Injector,这其实就是一个典型的依赖注入设计模型。

usercontroller的持有者不用怀疑就是ams,如下搜索在fw的源码中,除了ams,就没有谁敢去实例化它。

2)UserController提供的三大方法

UserController完成的事情比较多,概括了多用户切换,用户解锁等方方面面相关逻辑。这里只针对主用户的启动、解锁、解锁完成来进行说明。

A onSystemUserStarting启动主用户

USER_SYSTEM就是主用户又叫系统用户,userid为0

B finishUserUnlocking用户解锁过程中

C finishUserUnlockedCompleted用户解锁完成

在判断用户解锁完成之后,该方法做了如下两件事情:

  • 发送USER_UNLOCKED_MSG

  • 发送ACTION_BOOT_COMPLETED广播

3)mInjector回调到ssm

UserController提供了如上三大方法,用来启动用户,用户解锁过程中,用户解锁完成。接下来我们看看mInjector是如何把这三个操作通知到SystemServiceManager的。

A onSystemUserStarting启动主用户

这里传递的userId就是前文中的USER_SYSTEM,即userid=0。系统主用户

B USER_UNLOCK_MSG用户解锁中消息处理

用户解锁过程中的消息处理主要也分为两个操作:

  • 通过injector通知ssm回调onUserUnlocking方法

  • 调用finishUserUnlocked方法去完成解锁:这又回到了UserController的finishUserUnlockedCompleted消息处理完成方法

C USER_UNLOCKED_MSG用户解锁完成消息处理

通过通过injector通知ssm回调onUserUnlocked方法

4)UserController其他操作

前文针对三大场景来介绍UserController是如何通知到ssm,其实还可以理解为ams是如何通知到ssm的。除了这三大回调之外,其实还有很多ssm也需要的其他接口:

  • ssm.onUserSwitching
  • ssm.onUserStopping
  • ssm.onUserStopped
  • ssm.onUserCompletedEvent

这里就暂时不一一介绍了。值得注意的是, 后续可以在研究一下哪个开机完成广播是怎么回事。

2、SSM对所有SystemServer回调

1)ssm.onUserXXX

SystemServiceManager在实现onUserXXX的时候,统一调用了onUser方法,传递了不同的状态值进去,如下代码:

2)onUser遍历前的日志准备

如上代码,ssm在接收到ams的UserController的回调,在遍历所有服务之前,先进行Calling on关键日志打印,并且决定是否使用线程池,从后续的异步日志来看,肯定是使用了线程池。日志如下:

    #流程1:AMS启动系统主用户Line 18973: 09-02 03:40:32.080  2207  2207 D SystemServerTiming: getCurrentUserLine 18975: 09-02 03:40:32.080  2207  2207 D SystemServerTiming: ActivityManagerStartAppsLine 18976: 09-02 03:40:32.080  2207  2207 D SystemServerTimingAsync: ssm.StartUser-0Line 18977: 09-02 03:40:32.081  2207  2207 I SystemServiceManager: Calling onStartUser 0Line 18975: 09-02 03:40:32.080  2207  2207 D SystemServerTiming: ActivityManagerStartAppsLine 18976: 09-02 03:40:32.080  2207  2207 D SystemServerTimingAsync: ssm.StartUser-0Line 18977: 09-02 03:40:32.081  2207  2207 I SystemServiceManager: Calling onStartUser 0#流程2:阶段1000Line 22129: 09-02 03:40:34.622  2207  2231 I SystemServiceManager: Starting phase 1000#流程3:主用户解锁过程中Line 22364: 09-02 03:40:34.689  2207  2231 D SystemServerTiming: finishUserUnlocking-0Line 22368: 09-02 03:40:34.690  2207  2228 D SystemServerTiming: UM.onBeforeUnlockUser-0Line 22369: 09-02 03:40:34.690  2207  2228 D SystemServerTiming: prepareUserData-0Line 22563: 09-02 03:40:34.808  2207  2228 D SystemServerTiming: reconcileAppsData-0Line 23124: 09-02 03:40:35.348  2207  2237 D SystemServerTimingAsync: ssm.UnlockingUser-0Line 23125: 09-02 03:40:35.348  2207  2237 I SystemServiceManager: Calling onUnlockingUser 0#流程4:主用户解锁完成Line 23424: 09-02 03:40:35.506  2207  2237 D SystemServerTiming: finishUserUnlocked-0Line 23427: 09-02 03:40:35.508  2207  2237 V SystemServerTiming: SystemUserUnlock took to complete: 818msLine 23521: 09-02 03:40:35.612  2207  2224 D SystemServerTiming: getUserSwitchability-0Line 23522: 09-02 03:40:35.612  2207  2224 D SystemServerTiming: TM.isInCallLine 23525: 09-02 03:40:35.612  2207  2224 D SystemServerTiming: hasUserRestriction-DISALLOW_USER_SWITCHLine 23526: 09-02 03:40:35.612  2207  2224 D SystemServerTiming: getInt-ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKEDLine 23530: 09-02 03:40:35.613  2207  2612 D SystemServerTiming: isUserUnlocked-USER_SYSTEMLine 23562: 09-02 03:40:35.656  2207  2237 D SystemServerTimingAsync: ssm.UnlockedUser-0Line 23563: 09-02 03:40:35.656  2207  2237 I SystemServiceManager: Calling onUnlockedUser 0

3)onUser遍历所有SystemServer

如上代码,获取所有服务并进行遍历,依次解析ssm的这几个状态,因此在开机过程中有如下日志打印:

3、AMS开机完成

接着如上的话题研究,我们了解到主用户启动是ams调用,那么用户解锁是不是也是ams调用的呢?答案真的是。跟读代码这段调用流程的开端是在ams的finishBooting方法中。

1)ams.finishBooting

2)UserController.onBootComplete

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

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

相关文章

推荐使用 pnpm 而不是 npm

npm 的局限性 磁盘空间浪费在 npm 早期版本中,每个项目的node_modules目录都会完整复制所有依赖包,即使多个项目依赖同一个包的相同版本,也会重复存储。这导致磁盘空间被大量占用,随着项目数量的增加,存储成本显著上升…

Transformer实战(18)——微调Transformer语言模型进行回归分析

Transformer实战(18)——微调Transformer语言模型进行回归分析0. 前言1. 回归模型2. 数据处理3. 模型构建与训练4. 模型推理小结系列链接0. 前言 在自然语言处理领域中,预训练 Transformer 模型不仅能胜任离散类别预测,也可用于连…

【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell

前言:欢迎各位光临本博客,这里小编带你直接手撕,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!! IF’Maxue:个人主页🔥 个人专栏…

linux常用命令 (3)——系统包管理

博客主页:christine-rr-CSDN博客 ​​​​​ ​​ hi,大家好,我是christine-rr ! 今天来分享一下linux常用命令——系统包管理 目录linux常用命令---系统包管理(一)Debian 系发行版(Ubuntu、Debian、Linux …

YOLOv8 mac-intel芯片 部署指南

🚀 在 Jupyter Notebook 和 PyCharm 中使用 Conda 虚拟环境(YOLOv8 部署指南,Python 3.9) YOLOv8 是 Ultralytics 开源的最新目标检测模型,轻量高效,支持分类、检测、分割等多种任务。 在 Mac(…

【高等数学】第十一章 曲线积分与曲面积分——第六节 高斯公式 通量与散度

上一节:【高等数学】第十一章 曲线积分与曲面积分——第五节 对坐标的曲面积分 总目录:【高等数学】 目录 文章目录1. 高斯公式2. 沿任意闭曲面的曲面积分为零的条件3. 通量与散度1. 高斯公式 设空间区域ΩΩΩ是由分片光滑的闭曲面ΣΣΣ所围成&#x…

IDEA试用过期,无法登录,重置方法

IDEA过期,重置方法: IntelliJ IDEA 2024.2.0.2 (亲测有效) 最新Idea重置办法!: 方法一: 1、删除C:\Users\{用户名}\AppData\Local\JetBrains\IntelliJIdea2024.2 下所有文件(注意:是子目录全部删除) 2、删除C:\Users\{用户名}\App…

创建用户自定义桥接网络并连接容器

1.创建用户自定义的 alpine-net 网络[roothost1 ~]# docker network create --driver bridge alpine-net 9f6d634e6bd7327163a9d83023e435da6d61bc6cf04c9d96001d1b64eefe4a712.列出 Docker 主机上的网络[roothost1 ~]# docker network ls NETWORK ID NAME DRIVER …

Vue3 + Vite + Element Plus web转为 Electron 应用,解决无法登录、隐藏自定义导航栏

如何在vue3 Vite Element Plus搭好的架构下转为 electron应用呢? https://www.electronjs.org/zh/docs/latest/官方文档 https://www.electronjs.org/zh/docs/latest/ 第一步:安装 electron相关依赖 npm install electron electron-builder concurr…

qt QAreaLegendMarker详解

1. 概述QAreaLegendMarker 是 Qt Charts 模块中的一部分,用于在图例(Legend)中表示 QAreaSeries 的标记。它负责显示区域图的图例项,通常包含区域颜色样例和对应的描述文字。图例标记和对应的区域图关联,显示区域的名称…

linux 函数 kstrtoul

kstrtoul 函数概述 kstrtoul 是 Linux 内核中的一个函数&#xff0c;用于将字符串转换为无符号长整型&#xff08;unsigned long&#xff09;。该函数定义在 <linux/kernel.h> 头文件中&#xff0c;常用于内核模块中解析用户空间传递的字符串参数。 函数原型 int kstrtou…

LLM(三)

一、人类反馈的强化学习&#xff08;RLHF&#xff09;微调的目标是通过指令&#xff0c;包括路径方法&#xff0c;进一步训练你的模型&#xff0c;使他们更好地理解人类的提示&#xff0c;并生成更像人类的回应。RLHF&#xff1a;使用人类反馈微调型语言模型&#xff0c;使用强…

DPO vs PPO,偏好优化的两条技术路径

1. 背景在大模型对齐&#xff08;alignment&#xff09;里&#xff0c;常见的两类方法是&#xff1a;PPO&#xff1a;强化学习经典算法&#xff0c;OpenAI 在 RLHF 里用它来“用奖励模型更新策略”。DPO&#xff1a;2023 年提出的新方法&#xff08;参考论文《Direct Preferenc…

BLE6.0信道探测,如何重构物联网设备的距离感知逻辑?

在物联网&#xff08;IoT&#xff09;无线通信技术快速渗透的当下&#xff0c;实现人与物、物与物之间对物理距离的感知响应能力已成为提升设备智能高度与人们交互体验的关键所在。当智能冰箱感知用户靠近而主动亮屏显示内部果蔬时、当门禁系统感知到授权人士靠近而主动开门时、…

【计算机 UTF-8 转换为本地编码的含义】

UTF-8 转换为本地编码的含义 详细解释一下"UTF-8转换为本地编码"的含义以及为什么在处理中文时这很重要。 基本概念 UTF-8 编码 国际标准&#xff1a;UTF-8 是一种能够表示世界上几乎所有字符的 Unicode 编码方式跨平台兼容&#xff1a;无论在哪里&#xff0c;UTF-8 …

4.6 变体

1.变体简介 2.为什么需要变体 3.变体是如何产生的 4.变体带来的麻烦 5.multi_compile和shader_feature1.变体简介 比如我们开了一家餐厅, 你有一本万能的菜单(Shader源代码), 上面包含了所有可能的菜式; 但是顾客每次来点餐时, 不可能将整本菜单都做一遍, 他们会根据今天有没有…

猿辅导Android开发面试题及参考答案(下)

为什么开发中要使用线程池,而不是直接创建线程(如控制线程数量、复用线程、降低开销)? 开发中优先使用线程池而非直接创建线程,核心原因是线程池能优化线程管理、降低资源消耗、提高系统稳定性,而直接创建线程存在难以解决的缺陷,具体如下: 控制线程数量,避免资源耗尽…

【网络通信】IP 地址深度解析:从技术原理到企业级应用​

IP 地址深度解析&#xff1a;从技术原理到企业级应用​ 文章目录IP 地址深度解析&#xff1a;从技术原理到企业级应用​前言一、基础认知&#xff1a;IP 地址的技术定位与核心特性​1.1 定义与网络层角色1.2 核心属性与表示法深化二、地址分类&#xff1a;从类别划分到无类别路…

grafana实践

一、如何找到grafana的插件目录 whereis grafana grafana: /etc/grafana /usr/share/grafana插件安装目录、默认安装目录&#xff1a; 把vertamedia-clickhouse-datasource-3.4.4.zip解压到下面目录&#xff0c;然后重启就可以了 /var/lib/grafana/plugins# 6. 设置权限 sudo …

uniapp 文件查找失败:main.js

重装HbuilderX vue.config.js 的 配置 有问题main.js 框架能自动识别 到&#xff0c;不用多余的配置