requires INJECT_EVENTS permission
今天用一个洋气点的标题(不就是小学生也能看懂的英文吗),是因为 Android 自动化测试报了个错:Injecting to another application requires INJECT_EVENTS permission。为此我闹了点笑话。现在仍然是疫情期间,所以在家远程办公时收到同事发来的问题,于是在网上搜到一个答案
竟然是因为 USB 调试没打开呢?毕竟是在排查问题,只能先看看我远程的设备这一项是怎么样的。操作到开发者模式以后,发现远程设备的 USB 调试是打开的,那得关闭一下,然后自己跑跑看会不会报上面的问题吧。于是我毫无预兆的点了关闭,紧接着也收到了一条提醒“device not found”
纳尼?这可是我唯一能调试的远程设备,我赶紧 adb devices 发现设备列表里刚刚的设备确实没了,我去**的,网上这都什么回答,把我坑惨了。求人不如求代码呢,我怒把异常堆栈翻出来,决定开始分析
W System.err: java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
W System.err: at android.os.Parcel.readException(Parcel.java:2013)
W System.err: at android.os.Parcel.readException(Parcel.java:1959)
W System.err: at android.app.IUiAutomationConnection$Stub$Proxy.injectInputEvent(IUiAutomationConnection.java:288)
W System.err: at android.app.UiAutomation.injectInputEvent(UiAutomation.java:572)
从这个 IUiAutomationConnection$Stub$Proxy.injectInputEvent 方法开始 tracking,它的实现类是 UiAutomationConnection,最终是调用了 InputManagerService
// InputManagerService.javaprivate boolean injectInputEventInternal(InputEvent event, int displayId, int mode) {...try {result = nativeInjectInputEvent(mPtr, event, displayId, pid, uid, mode,INJECTION_TIMEOUT_MILLIS, WindowManagerPolicy.FLAG_DISABLE_KEY_REPEAT);} finally {Binder.restoreCallingIdentity(ident);}switch (result) {case INPUT_EVENT_INJECTION_PERMISSION_DENIED:Slog.w(TAG, "Input event injection from pid " + pid + " permission denied.");throw new SecurityException("Injecting to another application requires INJECT_EVENTS permission");case INPUT_EVENT_INJECTION_SUCCEEDED:return true;case INPUT_EVENT_INJECTION_TIMED_OUT:Slog.w(TAG, "Input event injection from pid " + pid + " timed out.");return false;case INPUT_EVENT_INJECTION_FAILED:default:Slog.w(TAG, "Input event injection from pid " + pid + " failed.");return false;}
}
Java 层调用了一个本地方法 nativeInjectInputEvent,如果返回 INPUT_EVENT_INJECTION_PERMISSION_DENIED 所表示的值就会抛出我在文首提到的那个异常,那么看看这个本地方法在什么情况下返回这个值
首先它在 com_android_server_input_InputManagerService.cpp 中实现,之后是通过调用关系中 InputDispatcher.cpp 的方法 checkInjectionPermission,看看这个方法
bool InputDispatcher::checkInjectionPermission(const sp<InputWindowHandle>& windowHandle,const InjectionState* injectionState) {if (injectionState&& (windowHandle == NULL|| windowHandle->getInfo()->ownerUid != injectionState->injectorUid)&& !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {if (windowHandle != NULL) {ALOGW("Permission denied: injecting event from pid %d uid %d to window %s ""owned by uid %d",injectionState->injectorPid, injectionState->injectorUid,windowHandle->getName().string(),windowHandle->getInfo()->ownerUid);} else {ALOGW("Permission denied: injecting event from pid %d uid %d",injectionState->injectorPid, injectionState->injectorUid);}return false;}return true;
}
这个方法返回 false 就会导致抛出本文提到的异常,我们分析一下,到底跟 USB 调试开关是否有关即可。在判断条件里用到的只有 2 类参数,一个是 Uid,一个是 Pid,很显然都只是跟应用本身的属性相关,跟通用设置无关,因此结论是,跟 USB 调试开关并无关联
总结起来就是,在对框架比较了解并且具备源码的情况下,看代码才是最直接了当的办法,不仅能多了解一点逻辑背后的内容,还能防止踩坑。咦?好像记起来一个事,我的远程设备已经被 USB 禁连了,这让远程办公还咋弄?!!!
附,从哪里去搜 Android 系统的代码?看这里:http://androidxref.com/8.1.0_r33/ (我也经常会在公号 henryWoo 里更新文章,欢迎提意见)
requires INJECT_EVENTS permission相关推荐
- 小米手机滑屏操作-appium自动化报错Injecting to another application requires INJECT_EVENTS permission...
APP自动化测试python+appium+selenium 滑屏操作练习 代码如下: # 等待元素出现loc = (MobileBy.ANDROID_UIAUTOMATOR,'new UiSelec ...
- Andriod自动化测试click事件报错:Injecting to another application requires INJECT_EVENTS permission解决
这个报错是在学习自动化测试时,基于weditor工具时报错,不过也适用于appium报这样的错,不过我用appium时没有打开click也是可以用的,看个人情况吧, 报错截图: 我手机是vivio x ...
- Appium 操作Android真机报错Injecting to another application requires INJECT_EVENTS permission解决方案
开发配置:红米手机 Redmi4A, Android:6.0.1 Appium: 1.9 进入开发者选项,打开USB调试(安全设置)
- 【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )
文章目录 一.报错信息 二.修改方案 一.报错信息 进程保活时 , 遇到的问题 , 手机 Pixel 2 , Android 10.0 系统 ; 2021-04-08 18:17:09.953 155 ...
- Permission Denial: requires android.permission.CHANGE_CONFIGURATION
切换字体过程报错:Permission Denial: updateConfiguration() requires android.permission.CHANGE_CONFIGURATION. ...
- Permission Denial: requires android.permission.INTERACT_ACROSS_USERS_FULL
今天在开发调试时,出现了奇怪的crash情况,在华为手机和google手机上会出现,在其他手机上却不会出现,报错日志如下: Caused by: java.lang.SecurityException ...
- Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
使用pycharm+appium运行程序时,报错: java.lang.SecurityException: Permission denial: writing to settings requir ...
- 【已解决】Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
用我自己的三星note10可以运行appium,换了台红米K30运行时就报错了... 以下是appiumServer报错信息 [W3C] Encountered internal error runn ...
- startForeground requires android.permission.FOREGROUND_SERVICE
在AndroidManifest.xml添加以下权限代码: <manifest> ... <uses-permission android:name="android.pe ...
最新文章
- Android文件系统深入剖析
- SQL注入不能多句执行时的一种突破方法(SA权限)
- 点击一次铵钮产生一个新文本框,分别输入值,然后获取
- (七)python3 只需3小时带你轻松入门——List与dict
- 【POJ - 3020】Antenna Placement (匈牙利算法,二分图最小边覆盖)
- android输入框圆形,GitHub - mylhyl/Android-CircleDialog: 仿IOS圆角对话框、进度条、列表框、输入框,ad广告框,支持横竖屏切换...
- python快速体验课-2020年2月
- (75)Xilinx Slice组成结构有哪些?
- 2010年3月份第二周51aspx发布源码
- 强制卸载Lync Server脱机的CMS并在新位置重建
- 极简的js点击组图切换效果
- 国庆假期程序员是这样给自己粉饰无限的逼格!
- [AHOI 2012]树屋阶梯
- python 贴吧调度器_简单的Python调度器Schedule详解
- char强制类型转换为int_数据类型专题之三: char类型和类型转换
- UML统一建模语UML2和EnterpriseArchitect
- ip地址是计算机设备在网络上的地址,如何查看主机ip 如何查看与自己电脑相连设备的IP地址...
- 【读书笔记】《正面管教》——我们都不完美,但我们相处的很快乐
- 华为云服务器查看备份文件,云服务器备份查看备份
- python-金字塔
热门文章
- mac更新系统后xcode-select --install使用问题
- 路由token验证和路由守卫~~狂徒李四
- java pdf 富文本_富文本编辑器保存的html内容使用itextpdf转PDF文件(css提取,内容重叠)问题解决...
- Java随机26位英文字母
- 财富管理技术服务商NewBanker完成千万级美元 Pre-C 轮融资...
- Python数据结构:哈希表
- dva的用法_dva基本用法
- 常见物联网无线组网方式
- gif原理+gifsicle压缩gif
- AVP的商业化之路还有多远?