Android12特性“不受信任的触摸事件被屏蔽”其他细节

android12-release
Android 12关于Input触摸事件的行为变更 这篇介绍了input实际的拦截findTouchedWindowTargetsLocked


“不受信任的触摸事件被屏蔽”相关属性

mBlockUntrustedTouchesMode

  • 三种属性值:DISABLED不拦截;PERMISSIVE拦截判断最后没拦截;BLOCK拦截
    frameworks\base\core\java\android\hardware\input\InputManager.java
    frameworks/native/libs/input/android/os/BlockUntrustedTouchesMode.aidl
    /** @hide */public static final int[] BLOCK_UNTRUSTED_TOUCHES_MODES = {BlockUntrustedTouchesMode.DISABLED,BlockUntrustedTouchesMode.PERMISSIVE,BlockUntrustedTouchesMode.BLOCK};

  • block_untrusted_touches设置/获取:Settings.Global.BLOCK_UNTRUSTED_TOUCHES_MODE改变 -- InputManagerService.java -- JNI -- InputDispatcher.cpp

    adb shell settings get global block_untrusted_touches
    adb shell settings put global block_untrusted_touches 0
  • 单个应用设置
    adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app
    adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

frameworks/base/cmds/am/src/com/android/commands/am/Am.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
frameworks/base/services/core/java/com/android/server/compat/PlatformCompat.java
frameworks/base/services/core/java/com/android/server/wm/InputMonitor.java
frameworks/base/services/core/java/com/android/server/wm/WindowState.java
frameworks/base/core/java/android/app/compat/CompatChanges.java
frameworks/base/core/java/android/app/compat/ChangeIdStateCache.java
frameworks/base/core/java/android/app/compat/ChangeIdStateQuery.java

TouchOcclusionInfo

frameworks/native/services/inputflinger/dispatcher/InputDispatcher.h

struct TouchOcclusionInfo {bool hasBlockingOcclusion;float obscuringOpacity;std::string obscuringPackage;int32_t obscuringUid;std::vector<std::string> debugInfo;
};
  • computeTouchOcclusionInfoLocked赋值
    frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
  1. hasBlockingOcclusion 界面InputWindowInfo属性touchOcclusionMode==BLOCK_UNTRUSTED时为true
  2. obscuringOpacity 界面InputWindowInfo属性touchOcclusionMode==USE_OPACITY时计算透明度
  3. obscuringUid、obscuringPackage 界面InputWindowInfo属性touchOcclusionMode!=ALLOW时会赋值
  4. debugInfo 当DEBUG_TOUCH_OCCLUSION打开时赋值界面信息InputWindowInfo
  5. canBeObscuredBy(windowHandle, otherHandle)当InputWindowHandle可见visible、不信任trustedOverlay等时赋值,否则,返回TouchOcclusionInfo默认值
InputDispatcher::TouchOcclusionInfo InputDispatcher::computeTouchOcclusionInfoLocked(const sp<InputWindowHandle>& windowHandle, int32_t x, int32_t y) const {const InputWindowInfo* windowInfo = windowHandle->getInfo();int32_t displayId = windowInfo->displayId;const std::vector<sp<InputWindowHandle>>& windowHandles = getWindowHandlesLocked(displayId);TouchOcclusionInfo info;info.hasBlockingOcclusion = false;info.obscuringOpacity = 0;info.obscuringUid = -1;std::map<int32_t, float> opacityByUid;for (const sp<InputWindowHandle>& otherHandle : windowHandles) {if (windowHandle == otherHandle) {break; // All future windows are below us. Exit early.}const InputWindowInfo* otherInfo = otherHandle->getInfo();if (canBeObscuredBy(windowHandle, otherHandle) && otherInfo->frameContainsPoint(x, y) &&!haveSameApplicationToken(windowInfo, otherInfo)) {if (DEBUG_TOUCH_OCCLUSION) {info.debugInfo.push_back(dumpWindowForTouchOcclusion(otherInfo, /* isTouchedWindow */ false));}// canBeObscuredBy() has returned true above, which means this window is untrusted, so// we perform the checks below to see if the touch can be propagated or not based on the// window's touch occlusion modeif (otherInfo->touchOcclusionMode == TouchOcclusionMode::BLOCK_UNTRUSTED) {info.hasBlockingOcclusion = true;info.obscuringUid = otherInfo->ownerUid;info.obscuringPackage = otherInfo->packageName;break;}if (otherInfo->touchOcclusionMode == TouchOcclusionMode::USE_OPACITY) {uint32_t uid = otherInfo->ownerUid;float opacity =(opacityByUid.find(uid) == opacityByUid.end()) ? 0 : opacityByUid[uid];// Given windows A and B:// opacity(A, B) = 1 - [1 - opacity(A)] * [1 - opacity(B)]opacity = 1 - (1 - opacity) * (1 - otherInfo->alpha);opacityByUid[uid] = opacity;if (opacity > info.obscuringOpacity) {info.obscuringOpacity = opacity;info.obscuringUid = uid;info.obscuringPackage = otherInfo->packageName;}}}}if (DEBUG_TOUCH_OCCLUSION) {info.debugInfo.push_back(dumpWindowForTouchOcclusion(windowInfo, /* isTouchedWindow */ true));}return info;
}
  • !isTouchTrustedLocked根据TouchOcclusionInfo判断是否拦截
  1. hasBlockingOcclusion 界面InputWindowInfo属性touchOcclusionMode==BLOCK_UNTRUSTED时拦截
  2. 模糊不透明度obscuringOpacity大于mMaximumObscuringOpacityForTouch时拦截(mMaximumObscuringOpacityForTouch为Settings.Global.getUriFor(Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH)属性值,默认0.8f)
bool InputDispatcher::isTouchTrustedLocked(const TouchOcclusionInfo& occlusionInfo) const {if (occlusionInfo.hasBlockingOcclusion) {ALOGW("Untrusted touch due to occlusion by %s/%d", occlusionInfo.obscuringPackage.c_str(),occlusionInfo.obscuringUid);return false;}if (occlusionInfo.obscuringOpacity > mMaximumObscuringOpacityForTouch) {ALOGW("Untrusted touch due to occlusion by %s/%d (obscuring opacity = ""%.2f, maximum allowed = %.2f)",occlusionInfo.obscuringPackage.c_str(), occlusionInfo.obscuringUid,occlusionInfo.obscuringOpacity, mMaximumObscuringOpacityForTouch);return false;}return true;
}

什么情况不拦截

回顾上边属性,并查看Android 12关于Input触摸事件的行为变更图代码:

// Drop events that can't be trusted due to occlusion
if (newTouchedWindowHandle != nullptr &&mBlockUntrustedTouchesMode != BlockUntrustedTouchesMode::DISABLED) {TouchOcclusionInfo occlusionInfo =computeTouchOcclusionInfoLocked(newTouchedWindowHandle, x, y);if (!isTouchTrustedLocked(occlusionInfo)) {if (DEBUG_TOUCH_OCCLUSION) {ALOGD("Stack of obscuring windows during untrusted touch (%d, %d):", x, y);for (const auto& log : occlusionInfo.debugInfo) {ALOGD("%s", log.c_str());}}onUntrustedTouchLocked(occlusionInfo.obscuringPackage);if (mBlockUntrustedTouchesMode == BlockUntrustedTouchesMode::BLOCK) {ALOGW("Dropping untrusted touch event due to %s/%d",occlusionInfo.obscuringPackage.c_str(), occlusionInfo.obscuringUid);newTouchedWindowHandle = nullptr;}}
}
  1. BlockUntrustedTouchesMode为DISABLED、PERMISSIVE不拦截
  2. 当窗口InputWindowHandle可见visible、信任trustedOverlay时TouchOcclusionInfo默认!isTouchTrustedLocked为false,不拦截
  3. 当窗口InputWindowInfo属性touchOcclusionMode=ALLOW时TouchOcclusionInfo默认!isTouchTrustedLocked为false,不拦截
  4. 设置adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app时com.example.app该应用不拦截(实质同第3种touchOcclusionMode=ALLOW一样)

拦截通知弹框

onUntrustedTouchLocked(occlusionInfo.obscuringPackage) -- JNI -- InputManagerService.java

  1. UNTRUSTED_TOUCHES_TOAST默认关闭Toast弹框
  2. PACKAGE_BLOCKLIST_FOR_UNTRUSTED_TOUCHES_TOAST 配置不弹框
private static final String[] PACKAGE_BLOCKLIST_FOR_UNTRUSTED_TOUCHES_TOAST = {"com.snapchat.android" // b/173297887
};

Android12特性“不受信任的触摸事件被屏蔽”其他细节相关推荐

  1. 移动开发:iphone开发之触摸事件详解

    转:http://blog.sina.com.cn/s/blog_8988732e01012eaf.html iPhoneOS中的触摸事件基于多点触摸模型.用户不是通过鼠标和键盘,而是通过触摸设备的屏 ...

  2. 你还在被触摸事件困扰吗?看看这篇吧

    在CoorChice的这篇文章<原来Android触控机制竟是这样的?>http://www.jianshu.com/p/b7cef3b3e703 中,CoorChice简要的介绍了一下A ...

  3. 关于精准打击自签名伪造SSL/TLS “受信任域名证书”的方案

    目前有两种方法可以实现精准打击 "自签名伪造SSL/TLS "受信任域名证书" 1.普通人可以实现的精准打击方案. 当 "SSL/TLS" 数据经过您 ...

  4. h5滚动时侧滑出现_HTML5移动端触摸事件以及滑动翻页效果

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  5. ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库

    11个处理触摸事件和多点触摸的JS库 触摸屏是现在所有智能手机的标配,还包括各种平板设备,而且很多桌面也慢慢在开始支持触摸操作.要开发支持触摸屏设备的Web应用,我们需要借助浏览器的触摸事件来实现. ...

  6. Android触摸事件传递分析与实践

    设计UI时,亲爱的交互设计师们总会有一些天马行空的想法,大多数情况下原生的控件已不能支持这些"看似简单"的交互逻辑,需要继承ListView.ViewPager.ScrollVie ...

  7. Gesture Recognizers与触摸事件分发

    一.Gesture Recognizers Gesture Recognizers是在iOS3.2引入的,可以用来识别手势.简化定制视图事件处理的对象.Gesture Recognizers的基类为U ...

  8. Android _实现SSL解决不受信任的证书问题

    介绍 网络安全已成为大家最关心的问题. 如果你利用服务器存储客户资料, 那你应该考虑使用 SSL 加密客户跟服务器之间的通讯. 随着这几年手机应用迅速崛起. 黑客也开始向手机应用转移, 原因有下列3点 ...

  9. 12306的SSL证书为何不受信任?

    今年1月9日,小年夜(1月28日)的火车票开售,12306网站当日点击量高达144亿次.然而,这同时意味着,IE已阻止该网站内容.该内容没有签署有效的安全证书等情况,在这天购票者打开12306时至少出 ...

最新文章

  1. java gif 帧_在Java中修复动画gif的帧速率
  2. pandas使用dropna函数删除dataframe中所有包含缺失值的数据行(drop rows which contain missing vlaues in dataframe)
  3. Dubbo源码分析(六)服务引用的具体流程
  4. ABAP string函数一览
  5. 在Linux环境下使用Apache部署ASP.NET Core
  6. 车主吐槽某电动车保养割韭菜,却遭其总裁公开恐吓?车主:必须视频道歉
  7. python 调用gpu算力_数据科学家需要算力,GPU 如何实现?-控制器/处理器-与非网...
  8. 简单实现系统托盘 - 回复 闪 的问题
  9. OpenCV——解决使用rectangle()函数时出现“TypeError: function takes exactly 4 arguments (2 given)”错误
  10. AngularJs中,如何在render完成之后,执行Js脚本
  11. ui设计移动端字体适配_UI设计师设计移动端界面要注意的字体规范有那些?
  12. zabbix监控打印机并自动更新监控项
  13. 黑苹果10.12.2驱动R9 270显卡成功一例
  14. 图文安装VMware Workstation教程
  15. springboot整合分布式任务调度 elastic-job
  16. vc 鼠标移动画直线
  17. java-learning:32. ArrayList类应用
  18. python如何将数组里的数提取出来_python [:3] 实现提取数组中的数
  19. Manifest 使用示例 - Msbuild 工程
  20. rapid Scada软件架构

热门文章

  1. Ubuntu20.04服务器连接WIFI设置
  2. web返回的数据集格式_SpringBoot RESTful API返回统一数据格式还不懂?
  3. C++ 万能转换函数:不限string转double,也不限double转string
  4. 【Android高级进阶】论一个普通大学电子商务大三学生,flutter项目案例
  5. 国二c语言程序,国家二级计算机考试题库c语言
  6. html5实现DisuzX论坛手机版ucenter头像修改
  7. JavaMail实现邮箱激活功能
  8. python怎么输出图像测试_如何在python中对作为输入和输出的图像进行单元测试?...
  9. 3.JVM内存区域划分
  10. Java 基础知识测试-3