AOD始终显示时间和信息(Dream)简析

news/2024/7/7 21:36:16/文章来源:https://www.cnblogs.com/luoliang13/p/18277084

AOD始终显示时间和信息(Dream)简析

DreamManagerService启动

在SystemServer的startOtherServices方法中会启动DreamManagerService服务

这里是调用SystemServiceManager的startService方法

显然,在SystemServiceManager的startService方法中首先将要启动的系统服务添加到其mServices列表中,这样后面方便添加系统服务的生命周期回调,然后调用了要启动的系统服务的onStart方法,查看下DreamManagerService的onStart方法

这里publishBinderService和publishLocalService方法都是将系统服务添加到一个集合中,以便在其他代码中获取对应的系统服务

例如publishLocalService如下

在publishLocalService后,就可以调用LocalServices的getService方法获取添加的对象

onBootPhase

前面在SystemServer调用了SystemServiceManager的startService方法后,在启动过程不同阶段还会调用mSystemServiceManager.startBootPhase方法,

显然这里会调用系统服务的onBootPhase方法,来知会各系统服务启动阶段并做相应的逻辑

查看DreamManagerService的onBootPhase方法

这里主要是注册了一个广播接收器(监听切换用户的广播,一般只涉及多用户场景),注册了一个Settings数据监听器,还有调用了下writePulseGestureEnabled方法

查看下writePulseGestureEnabled方法逻辑

这里几个逻辑可能涉及后面具体具体的功能流程,所以这里简单分析下

getDozeComponent

在判断功能启用时这里会返回对应实现功能的组件,这里mDozeConfig是AmbientDisplayConfiguration的对象,其ambientDisplayComponent只是返回一个字串,然后通过ComponentName的unflattenFromString方法返回一个字串对应的ComponentName对象,其表示功能对应的组件

查看下config_dozeComponent字串值,发现默认资源中其字串是空(frameworks/base/core/res/res/values/config.xml)

按理说如果配置是空应该不支持AOD的,但手中的一个手机却支持,dumpsys overlay命令看了下,发现其中有对应配置

将/vendor/overlay/framework-res__auto_generated_rro_vendor.apk导出来反编译查看发现有如下配置

那么该机器上getDozeComponent获取的则是systemui的DozeService组件

validateDream

这里是校验对应ComponentName的有效性,首先要确实是个服务,然后需要对应服务的的应用的目标SDK要大于等于L版本(21),还需要服务声明了android.permission.BIND_DREAM_SERVICE权限

InputManagerService.setPulseGestureEnabled

从上面的代码可以看出setPulseGestureEnabled方法主要是记录一个开关,按代码作用,其在config中对config_doubleTouchGestureEnableFile写入一个文件的路径,然后在调用setPulseGestureEnabled的时候,对文件写入1/0,不过从源码上看config_doubleTouchGestureEnableFile是空,所以这里代码并未实现

设置始终显示时间和信息

查看设置中对应字串

查看Settings中res/xml/security_lockscreen_settings.xml有如下代码:

查看AmbientDisplayAlwaysOnPreferenceController中相关逻辑

从这里可以看到,在开关始终显示时间和信息开关时会设置Settings.Secure表中设置doze_always_on的字段的值

AmbientDisplayConfiguration的alwaysOnEnabled

在框架和SystemUI等地方大部分不是直接获取Settings.Secure表中的doze_always_on的字段的值,而是通过AmbientDisplayConfiguration的alwaysOnEnabled方法来获取是否打开了AOD

其中boolSetting的代码就是获取Settings.Secure表中的doze_always_on的字段的值(缺省值为mAlwaysOnByDefault,是从系统资源中获取,系统资源源码中是true,overlay的apk中是false)

其中alwaysOnAvailable是获取是否支持AOD(如下面代码,通过系统资源或debug配置获取是否支持AOD,并判断系统资源配置的AOD组件是否不为空)

config_dozeComponent前面通过反编译的系统资源的overlay的apk获取到是com.android.systemui/com.android.systemui.doze.DozeService

config_dozeAlwaysOnDisplayAvailable同样源码中是false,查看反编译的overlay的apk获取是true

startDream

在灭屏的时候会调用DreamManagerService的startDream方法

这里分别查看下chooseDreamForUser和startDreamLocked方法

chooseDreamForUser

在doze为true时,走if中的逻辑,主要是getDozeComponent和validateDream方法,这两个方法前面已经介绍过了,手中机器返回的是systemui的DozeService的组件,而这里也是一般走的逻辑

在doze为flase时虽然自测并未走该分支,但也简单看下其逻辑,这里其实也是返回一个组件,不过是调用getDreamComponentsForUser方法

显然getDreamComponentsForUser方法是根据Settings.Secure.SCREENSAVER_COMPONENTS和Settings.Secure.SCREENSAVER_DEFAULT_COMPONENTS对应的字串值来获取组件的

startDreamLocked

这里主要是调用了DreamController的startDream方法

上面DreamController的startDream方法中主要做了两个事,

一是绑定了前面传过来的AOD组件(这里即systemui的DozeService),绑定后连接为DreamRecord(继承了ServiceConnection)

二是发送了个延时消息,如果5秒后仍没有绑定服务成功,则调用stopDream方法停止AOD

其主要逻辑还是在绑定DozeService服务上,而查看DozeService其实并没有什么具体的逻辑,也没有绑定服务的逻辑,其绑定相关逻辑其实在其父类DreamService中,而应用实现自己的AOD和屏保相关服务一般也都是继承DreamService

查看DreamController和DreamService的绑定服务相关逻辑:

在DreamController中绑定服务后主要调用了下attach方法,而其主要是调用DreamService的attach方法

在DreamService中查看绑定服务相关和attach方法

所以这里主要调用到了DreamService的attach方法,其中主要逻辑如下:

这里有个分支mWindowless,是调用DreamService的setWindowless方法可设置的

而在DozeService中的onCreate方法中其有调用setWindowless为true,所以上面显然走的是else的分支,即调用onDreamingStarted方法

onDreamingStarted和onDreamStopped是DozeService实现AOD功能的主要的一个生命周期,分别对应在进入和退出AOD模式

再看下DozeService的onDreamingStarted后的具体逻辑

这里有两个主要方法调用,

一是DozeMachine的requestState方法切换状态,设置屏幕状态、知会到应用内相关做一些变更等

一是调用startDozing方法

startDozing方法具体实现在其父类DreamService中

显然startDozing最后会调用到DreamManagerService的startDozing方法

显然这里会调用PowerManagerService的startDozeOverrideFromDreamManager方法,设置power的一些状态,然后申请一个power锁mDozeWakeLock

小节

AOD从代码分析和现象查看,其是一种介于亮屏和灭屏的状态,主要是power状态的变更,既希望能省电,又希望能时刻看到时间等信息,主要是希望以较小的耗电的代价来让用户能随时看到时间等信息,而不用去特别的亮屏后才能看到,一般灭屏进入AOD,亮屏退出AOD,前面主要讲了一些进入AOD的逻辑,退出的逻辑基本相似,上面分析的主要是一些框架和应用层的逻辑,其后面还有很多其他方面,比如doze状态应用的管理、屏幕显示和亮度的变更等,这些都是为了省电,这里不继续分析

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

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

相关文章

操作系统——学习笔记(2)CPU虚拟化

学习黑皮书的一些呆瓜行为hhhhh

免费的攻击面管理平台-森罗

产品简介 森罗是有安科技推出的一款全新综合网络安全攻击面管理平台,集网络空间测绘与漏洞扫描于一体。森罗自带万象漏洞扫描器,与Nessus和Nuclei等许多产品一样,但它更现代,具有免等待的OOB测试策略、高级漏洞PoC IDE和强大的VDSL(漏洞域特定语言)引擎,使您能够轻松快速…

Fake权限验证小例子

前言 关于本地测试如何进行Fake权限验证 正文 在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验证吧。上图可能是我们本地测试的时候需要填写的一个token位置,本地测试不方便。 那么…

41、linux-yum源管理-阿里云仓库配置

yum的管理1、清理原有的yum配置 把本地或者官方的/etc/yum.repos.d/路径下的所有repo配置文件移走确保/etc/yum.repos.d/这里没有其它文件2、下载配置阿里巴巴开源镜像站官网配置:https://developer.aliyun.com/mirror/在这个位置/etc/yum.repos.d/下载阿里云的yum源文件登陆…

vim基础使用

五、vim编辑器的使用 所有的Linux系统都默认有vi编译器,它就相当于Windows的记事本,当然,你也可以选择更好用的vim编译器,需要下载 yum install vim -y vim 有三种模式 使用vim filename wq!之后 这个命令如果filename不存在则 创建文件 [root@bogon opt]# vim zhanghaow…

【YOLOv8改进 - 注意力机制】NAM:基于归一化的注意力模块,将权重稀疏惩罚应用于注意力机制中,提高效率性能

**NAM: 提升模型效率的新颖归一化注意力模块,抑制非显著权重,结合通道和空间注意力,通过批量归一化衡量重要性。在Resnet和Mobilenet上的实验显示优于其他三种机制。源码见[GitHub](https://github.com/Christian-lyc/NAM)。**介绍摘要 识别较不显著的特征是模型压缩的关键。…

VP记录

我是真的红温了受打击了,他妈难受死了,遂记录这玩意儿,就算他妈没几个月就要退役。 ABC360 就是这场把我打击到了。之前15min切完ABCD,这回25min切B题,幽默🤡頑張って

视野修炼-技术周刊第90期 | 豆包AI IDE

① 豆包 MarsCode 正式发布 ② ECMAScript 2024 正式发布 ③ Mako 开源 - 蚂蚁的 Rust 力作 ④ CSDN批量搬运Github项目伪造开发者主页 ⑤ HTML 旋转图像实现示例 ⑥ 一组看着糙的组件库 ⑦ Chrome 126 中 DevTools 的新增功能 ⑧ 纯 CSS 实现环形文本欢迎来到第 90 期的【视野…

3.2

3.2 一键部署多台linux 1. 背景: 一般的机房的几十台甚至上百台电脑都需要统一部署操作系统。人工一个一个太费力,所以需要用到批量部署技术。 2. 实现原理:安装一台服务器后,通过交换机连接同一个网络方式还有结合自动应答文件的方式来实现。 ​ 网络拓扑图如下:这需要先…

ASRPRO语音控制开发板

近来想做语音控制,于是拼多多上淘了块语音控制开发板,记录下开发板相关的信息。 1.开发板信息 模块概述 开发板板载CH340K芯片,一根Type-C线就可以下载程序,并且开发板上有自动断电电路可以实现一键下载。 开发板需要外接喇叭,喇叭为PH2.0接口。 下图为开发板实物图开发板…

Prompt-Tuning、P-Tuning和Prefix-Tuning区别和代码实现【转】

原文:https://blog.csdn.net/weixin_43863869/article/details/134760405

OPP第三次博客作业

1.前言 这次博客不出意外是我们Java课程的最后一次博客了,不过这次博客pta只有两题,但真的挺难的,尤其是最后一个,我自己的设计也有很大的问题,第七次pta遗留下了一点点问题,导致第八次出现了很多问题,导致在后面要大篇幅的改,之后改完以后又不明白之前的写的代码有啥用…

Vue - 入门

零:前端目前形势 前端的发展史HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看Ajax的出现 -> 后台发送异步请求,Render+Ajax混合…

(线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改

题意:code: #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using i64 = long long; using u64 = unsigned long long; using PII = …

PTA第三阶段作业总结

前言 第三阶段的两次大作业明显对设计的要求进一步提高了。我两次作业一共得到了162分,最后一次作业只得到了62分,第7次作业得到了满分,但程序仍有许多不足,下面开始逐题分析。 7-1 家居强电电路模拟程序-3 这道题是一个全新的模拟场景,模拟一个家居电路。主要的类就是一个…

Django 笔记 - Django Shell

启动 Django Shell 交互式界面,具体命令如下:python manage.py shell具体实例 实例 1. 直接修改用户密码,无需原密码。 在 Django Shell 交互式界面下,修改 admin 用户密码的具体代码如下:from django.contrib.auth.models import User user = User.objects.get(username=…

用pipenv解决pyinstaller打包文件过大的问题

学会用pyinstaller打包python文件后,我发现直接大暴出来的文件内存特别大 于是我上网搜了一些压缩方法,试过用upx,用了之后感觉有点麻烦,后面又看到了pipenv,感觉还不错 首先用windows+r快捷键输入cmd打开命令管理器安装pipenv模块pip install pipenv -i https://pypi.tun…