安卓如何实现双击触摸唤醒点亮屏幕功能-源码分析linage os高通平台

背景:

前面文章已经有讲解过双击亮屏在一些方案调研情况,刚好linage os手机本身也有这个功能,刚好也有整体开源源码,所以今天带大家来对双击亮屏的源码部分进行剖析,本篇文章会一直分析到hal操作驱动节点。

设置作为切入点分析

根据字符tap to wake尝试grep相关字符在Settings这个代码中

nx563j_aosp14/packages/apps/Settings$ grep "tap_to_wake" ./ -rn
./src/com/android/settings/display/TapToWakePreferenceController.java:28:    private static final String KEY_TAP_TO_WAKE = "tap_to_wake";

看看相关代码

@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean value = (Boolean) newValue;Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, value ? 1 : 0);return true;}

这里PowerManagerService会监听settings值的变化然后进行设置
frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

  private final class SettingsObserver extends ContentObserver {public SettingsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange, Uri uri) {synchronized (mLock) {handleSettingsChangedLocked();}}}

具体对DOUBLE_TAP_TO_WAKE的处理

if (mSupportsDoubleTapWakeConfig) {boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver,Settings.Secure.DOUBLE_TAP_TO_WAKE, DEFAULT_DOUBLE_TAP_TO_WAKE,UserHandle.USER_CURRENT) != 0;if (doubleTapWakeEnabled != mDoubleTapWakeEnabled) {mDoubleTapWakeEnabled = doubleTapWakeEnabled;mNativeWrapper.nativeSetPowerMode(Mode.DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled);}
}/** Wrapper for PowerManager.nativeSetPowerMode */public boolean nativeSetPowerMode(int mode, boolean enabled) {return PowerManagerService.nativeSetPowerMode(mode, enabled);}

java代码就最后调用到了nativeSetPowerMode

native层面分析

frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp

static jboolean nativeSetPowerMode(JNIEnv* /* env */, jclass /* clazz */, jint mode,jboolean enabled) {return setPowerMode(static_cast<Mode>(mode), enabled);
}static bool setPowerMode(Mode mode, bool enabled) {android::base::Timer t;auto result = gPowerHalController.setMode(mode, enabled);if (mode == Mode::INTERACTIVE && t.duration() > 20ms) {ALOGD("Excessive delay in setting interactive mode to %s while turning screen %s",enabled ? "true" : "false", enabled ? "on" : "off");}return result.isOk();
}

这里在native代码最后调用到了setPowerMode再接下来调用到PowerHalController的setMode

frameworks/native/services/powermanager/PowerHalController.cpp

HalResult<void> PowerHalController::setMode(Mode mode, bool enabled) {std::shared_ptr<HalWrapper> handle = initHal();auto result = handle->setMode(mode, enabled);return processHalResult(result, "setMode");
}

这里的initHal明显可以看出其实是返回一个hal的接口来进行后面的setMode调用

std::shared_ptr<HalWrapper> PowerHalController::initHal() {std::lock_guard<std::mutex> lock(mConnectedHalMutex);if (mConnectedHal == nullptr) {mConnectedHal = mHalConnector->connect();}return mConnectedHal;
}

这里进行了connect调用返回hal接口

std::unique_ptr<HalWrapper> HalConnector::connect() {sp<IPower> halAidl = PowerHalLoader::loadAidl();if (halAidl) {return std::make_unique<AidlHalWrapper>(halAidl);}sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0();sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1();if (halHidlV1_1) {return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_0, halHidlV1_1);}if (halHidlV1_0) {return std::make_unique<HidlHalWrapperV1_0>(halHidlV1_0);}return nullptr;
}

可以看出这里会依次加载aidl,hidl等接口,正常有aidl就会直接返回,没有就再加载hidl接口,这里的就需要结合具体设备上power hal的提供情况

power的aidl hal分析

我的机器设备是aidl的hal类型,hal代码是lineage os开源的,属于高通的通用一套8998代码
具体路径:
vendor/qcom/opensource/power

大家注意哈,这个hal代码路径大家自己根据情况确定,这种方式适合lineage os自带了高通开源代码
那么知道了路径后,继续分析上面提到的handle->setMode方法最后调用到了如下方法
hal实现代码路径:vendor/qcom/opensource/power/Power.cpp


ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) {LOG(ERROR) << "Power setMode: " << static_cast<int32_t>(type) << " to: " << enabled;
#ifdef MODE_EXTif (setDeviceSpecificMode(type, enabled)) {return ndk::ScopedAStatus::ok();}
#endifswitch (type) {
#ifdef TAP_TO_WAKE_NODE//可以看到这里有一个宏,而且是根据mk中变量确定编译宏case Mode::DOUBLE_TAP_TO_WAKE://直接把enabled的值写入到TAP_TO_WAKE_NODE这个路径::android::base::WriteStringToFile(enabled ? "1" : "0", TAP_TO_WAKE_NODE, true);break;
#elsecase Mode::DOUBLE_TAP_TO_WAKE:
#endifcase Mode::LOW_POWER:case Mode::DEVICE_IDLE:case Mode::DISPLAY_INACTIVE:case Mode::AUDIO_STREAMING_LOW_LATENCY:case Mode::CAMERA_STREAMING_SECURE:case Mode::CAMERA_STREAMING_LOW:case Mode::CAMERA_STREAMING_MID:case Mode::CAMERA_STREAMING_HIGH:case Mode::VR://省略}return ndk::ScopedAStatus::ok();
}

上面的#ifdef TAP_TO_WAKE_NODE这个宏已经在前面文章给大家剖析过,所以很容易知道这里的TAP_TO_WAKE_NODE值

TARGET_TAP_TO_WAKE_NODE := "/sys/class/touch/tpnode/synaptics/wake_gesture"

实际上到这里就很清楚hal中干的事情,就是对/sys/class/touch/tpnode/synaptics/wake_gesture写入对应的值0或1,具体也可以通过设置中开关,然后验证/sys/class/touch/tpnode/synaptics/wake_gesture的值

在这里插入图片描述

adb shell cat /sys/class/touch/tpnode/synaptics/wake_gesture
1

在这里插入图片描述

 adb shell cat /sys/class/touch/tpnode/synaptics/wake_gesture
0

那么剩下的事就是驱动层面实现的事情,本篇文章就不对驱动部分进行深入剖析了。

更多framework详细代码和资料参考如下链接
投屏专题部分:

https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

重学SpringBoot3-集成Redis(二)之注解驱动

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;二&#xff09;之注解驱动 1. 为什么选择 Redis 作为缓存&#xff1f;2. 如何在 Spring Boot 中启用 Redis 缓存&#xff1f;2.1 …

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、滑动窗口第5天、贪心算法第6天、二分查找第7天、分治递归 六、集训总结 大家好&#xff0c;我是哪吒。 最…

Qt程序打包(解决找到dll问题)

1、运行Qt程序找不到dll 在Qt Creator外&#xff0c;运行Qt编译的exe程序&#xff0c;常常出现找不到xxx.dll而无法运行的问题。 解决的办法之一是找到Qt安装目录下bin文件夹中的dll文件&#xff0c;将该路径添加到系统环境变量path中去。 第二种办法就是对Qt程序进行打包&…

来了,使用YOLOv11目标检测教程

来了&#xff0c;使用YOLOv11目标检测教程 概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布&#xff1a;https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本&#xff0c;结合了尖端的准确性、速度和效率&#xff…

【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

动态规划—72. 编辑距离 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 编辑距离问题是字符串处理中的经…

threejs-模型贴图颜色与图片存在色差 问题解决方案

我使用的是obj模型&#xff0c;然后加载的话使用的是texturelLoader加载器&#xff0c;效果是这样的 使用的场景是&#xff1a;能够将图片贴到衣服上&#xff0c;并且能够移动旋转等操作贴图&#xff0c;但是这存在很明显的色差问题&#xff0c;具体的解决方案是&#xff1a; 我…

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

LeetCode 48 Rotate Image 解题思路和python代码

题目&#xff1a; You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …

桥水基金、贝莱德、摩根士丹利选择极狐GitLab 的五大理由!

疯狂上涨的 A股、港股 节前一周&#xff0c;上证指数累计上涨超 12%&#xff0c;创下2008年11月以来最大单周涨幅&#xff1b;深证成指累计上涨超17%&#xff0c;创下1996年4月最大单周涨幅&#xff1b;创业板指上涨超22%&#xff0c;创下史上最大单周涨幅。 过去两周&#x…

1688代采系统-反向海淘系统详细介绍

Onebound凡邦1688代采系统-反向海淘系统是一种专为海外买家及跨境电商提供一站式采购解决方案的平台。其核心功能和服务旨在解决跨境采购中的语言、货币等常见问题&#xff0c;并优化采购流程&#xff0c;提高采购效率。以下是对该系统的详细介绍。 一、核心功能 商品采集与展…

基于Java(Jsp+Sevlet)+MySql 实现的(Web)成绩管理系统

1 概述 1.1 开发背景 随着学生数量的日渐增多&#xff0c;学生教务系统的数据量也不断增加&#xff0c;这无疑大大增加了教务系统的负担。如果能把负责学生成绩管理的模块独立出来形成一个独立的系统&#xff0c;便可以有效降低教务系统的数据量&#xff0c;不仅可以方便管理…

2003-2023年上市公司政府补助明细数据

2003-2023年上市公司政府补助明细数据 1、时间&#xff1a;2003-2023年 2、来源&#xff1a;通过整理和筛选于企业财务报表附注“营业外收入”下的“政府补助明细”得到 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、省份、城市、区县、上市状态、政府补助金额、…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中&#xff0c;为了有效地规划和管理架构的变更与实施&#xff0c;通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角&#xff1a;项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系&#xff1a;关注项目本身…

基于ResNet50模型的船型识别与分类系统研究

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

获取时隔半个钟的三天

摘要&#xff1a; 今天遇到需求是配送时间&#xff0c;时隔半个钟的排线&#xff01;所以需要拼接时间&#xff01;例如2024-10-08 14&#xff1a;30&#xff0c;2024-10-08 15&#xff1a;00&#xff0c;2024-10-08 15&#xff1a;30 <el-form-item label"配送时间&a…

AP8505固定5V输出5V0.2A,SOP7/DIP7非隔离开关电源IC

AP8505基于高压同步整流架构&#xff0c;集成PFM控制器以及500V高可靠性MOSFET&#xff0c;用于外部元器件极精简的小功率非隔离开关电源。AP8505无线门铃芯片内置500V高压启动&#xff0c;实现系统快速启动、超低待机功能。5V非隔离无线门铃芯片AP8505提供了完整的智能化保护功…

海报制作用什么软件?快速搞定年末各种节日借势海报设计

厌倦了自己动手从零开始做宣传海报&#xff1f; 想要找AI智能工具&#xff0c;却又觉得生成的图片太假&#xff0c;不够的宣传格调&#xff1f; 想要找海报制作模板免费下载的平台&#xff0c;还总找不到自己想要的那一个风格的模板&#xff1f; 有没有想过&#xff0c;是你…

fastdfs下的doc文件可以访问,但是图片无法访问报错404,解决记录

fastdfs下的doc文件可以访问,但是图片无法访问报错404 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 第1项:查看Nginx的日志 可以先去查看Nginx的日志,在你Nginx的安装目录下的lo…

N1从安卓盒子刷成armbian

Release Armbian_noble_save_2024.10 ophub/amlogic-s9xxx-armbian (github.com) armbian下载&#xff0c;这里要选择905d adb 下载地址 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 提示信息 恩山无线论坛 使用usb image tool restet a…

探索创新宝库:一站式免费专利检索工具揭秘!

在这个知识爆炸的时代&#xff0c;专利不仅是创新成果的保护伞&#xff0c;更是技术发展的指南针。对于研究者、发明家、企业乃至普通爱好者&#xff0c;专利检索成为了探索技术前沿、规避侵权风险、激发创新灵感的重要手段。今天&#xff0c;我们将带您了解一款集多功能于一身…