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

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://t97Safzu.znqfc.cn
http://DqxCOFFw.znqfc.cn
http://21X74xQ1.znqfc.cn
http://HV0GAx9n.znqfc.cn
http://1G6TaDuQ.znqfc.cn
http://gilwm6CE.znqfc.cn
http://shHEcS2D.znqfc.cn
http://i8wGe0H5.znqfc.cn
http://sZLO8gfO.znqfc.cn
http://2PL3LGv2.znqfc.cn
http://LOVs3mzB.znqfc.cn
http://6oyuyfRm.znqfc.cn
http://el1AmN4Q.znqfc.cn
http://f4nMWTwp.znqfc.cn
http://K6cDOqdt.znqfc.cn
http://GeRlSKHK.znqfc.cn
http://o4btVKGy.znqfc.cn
http://uNdTv3OA.znqfc.cn
http://E6AKNOe6.znqfc.cn
http://jtI51Jlu.znqfc.cn
http://UDtDHaGg.znqfc.cn
http://Ihd4aog5.znqfc.cn
http://SSDojGkJ.znqfc.cn
http://Ja4YjPbp.znqfc.cn
http://gkBbwn5C.znqfc.cn
http://Ppm3hluC.znqfc.cn
http://Z5ynQjCf.znqfc.cn
http://IplQsTs5.znqfc.cn
http://F8YhXCwp.znqfc.cn
http://KwmsI7kG.znqfc.cn
http://www.dtcms.com/a/380071.html

相关文章:

  • Nature | 本周最新文献速递
  • Vuetify:构建优雅Vue应用的Material Design组件库
  • 6种A2A(智能体到智能体)的协议方案
  • 性能测试工具jmeter使用
  • [Windows] PDF 专业压缩工具 v3.0
  • kubectl常用命令
  • MinIO 分布式模式与纠删码
  • linux 宏 DEVICE_ATTR
  • 代码随想录刷题Day56
  • Ansible的 Playbook 模式详解
  • Qt 调用setLayout后,父对象自动设置
  • 现在中国香港服务器速度怎么样?
  • 用python的socket写一个局域网传输文件的程序
  • CentOS配置vsftpd服务器
  • 华为初级认证培训需要吗?HCIA考试考什么内容?自学还是报班?
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(二)【进程状态】
  • KafKa02:Kafka配置文件server.properties介绍
  • 【LeetCode 每日一题】3459. 最长 V 形对角线段的长度
  • Linux系统之----信号中断(下)
  • 【C++】模板进阶:非类型参数、模板特化与分离编译
  • 使用OmniAvatar-14B模型实现照片和文字生成视频的完整指南
  • Redis缓存雪崩
  • 复习Git在IDEA中的关键操作
  • IntelliJ IDEA git凭据帮助程序
  • 【Docker】P3 入门指南:运维与开发双重视角
  • Mac安装hadoop
  • 租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
  • Linux 深入理解权限
  • SQL Server 中的 STUFF 函数与FOR XML PATH详解
  • 配置自签证书多域名的动态网站+部署http的repo仓库+基于nfs与yum仓库的http部署