今天用一个洋气点的标题(不就是小学生也能看懂的英文吗),是因为 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相关推荐

  1. 小米手机滑屏操作-appium自动化报错Injecting to another application requires INJECT_EVENTS permission...

    APP自动化测试python+appium+selenium 滑屏操作练习 代码如下: # 等待元素出现loc = (MobileBy.ANDROID_UIAUTOMATOR,'new UiSelec ...

  2. Andriod自动化测试click事件报错:Injecting to another application requires INJECT_EVENTS permission解决

    这个报错是在学习自动化测试时,基于weditor工具时报错,不过也适用于appium报这样的错,不过我用appium时没有打开click也是可以用的,看个人情况吧, 报错截图: 我手机是vivio x ...

  3. Appium 操作Android真机报错Injecting to another application requires INJECT_EVENTS permission解决方案

    开发配置:红米手机 Redmi4A, Android:6.0.1 Appium: 1.9 进入开发者选项,打开USB调试(安全设置)

  4. 【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )

    文章目录 一.报错信息 二.修改方案 一.报错信息 进程保活时 , 遇到的问题 , 手机 Pixel 2 , Android 10.0 系统 ; 2021-04-08 18:17:09.953 155 ...

  5. Permission Denial: requires android.permission.CHANGE_CONFIGURATION

    切换字体过程报错:Permission Denial: updateConfiguration() requires android.permission.CHANGE_CONFIGURATION. ...

  6. Permission Denial: requires android.permission.INTERACT_ACROSS_USERS_FULL

    今天在开发调试时,出现了奇怪的crash情况,在华为手机和google手机上会出现,在其他手机上却不会出现,报错日志如下: Caused by: java.lang.SecurityException ...

  7. Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

    使用pycharm+appium运行程序时,报错: java.lang.SecurityException: Permission denial: writing to settings requir ...

  8. 【已解决】Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

    用我自己的三星note10可以运行appium,换了台红米K30运行时就报错了... 以下是appiumServer报错信息 [W3C] Encountered internal error runn ...

  9. startForeground requires android.permission.FOREGROUND_SERVICE

    在AndroidManifest.xml添加以下权限代码: <manifest> ... <uses-permission android:name="android.pe ...

最新文章

  1. Android文件系统深入剖析
  2. SQL注入不能多句执行时的一种突破方法(SA权限)
  3. 点击一次铵钮产生一个新文本框,分别输入值,然后获取
  4. (七)python3 只需3小时带你轻松入门——List与dict
  5. 【POJ - 3020】Antenna Placement (匈牙利算法,二分图最小边覆盖)
  6. android输入框圆形,GitHub - mylhyl/Android-CircleDialog: 仿IOS圆角对话框、进度条、列表框、输入框,ad广告框,支持横竖屏切换...
  7. python快速体验课-2020年2月
  8. (75)Xilinx Slice组成结构有哪些?
  9. 2010年3月份第二周51aspx发布源码
  10. 强制卸载Lync Server脱机的CMS并在新位置重建
  11. 极简的js点击组图切换效果
  12. 国庆假期程序员是这样给自己粉饰无限的逼格!
  13. [AHOI 2012]树屋阶梯
  14. python 贴吧调度器_简单的Python调度器Schedule详解
  15. char强制类型转换为int_数据类型专题之三: char类型和类型转换
  16. UML统一建模语UML2和EnterpriseArchitect
  17. ip地址是计算机设备在网络上的地址,如何查看主机ip 如何查看与自己电脑相连设备的IP地址...
  18. 【读书笔记】《正面管教》——我们都不完美,但我们相处的很快乐
  19. 华为云服务器查看备份文件,云服务器备份查看备份
  20. python-金字塔

热门文章

  1. mac更新系统后xcode-select --install使用问题
  2. 路由token验证和路由守卫~~狂徒李四
  3. java pdf 富文本_富文本编辑器保存的html内容使用itextpdf转PDF文件(css提取,内容重叠)问题解决...
  4. Java随机26位英文字母
  5. 财富管理技术服务商NewBanker完成千万级美元 Pre-C 轮融资...
  6. Python数据结构:哈希表
  7. dva的用法_dva基本用法
  8. 常见物联网无线组网方式
  9. gif原理+gifsicle压缩gif
  10. AVP的商业化之路还有多远?