为啥我不能从 Android 上的串行端口打开/写入?
Posted
技术标签:
【中文标题】为啥我不能从 Android 上的串行端口打开/写入?【英文标题】:Why can't I open/write from a serial port on Android?为什么我不能从 Android 上的串行端口打开/写入? 【发布时间】:2015-08-24 21:21:20 【问题描述】:我编写了一个在 android 4.4 Kitkat 设备上的自定义内核上运行的 Android 应用程序,它使用 Android 串行端口 API (https://code.google.com/p/android-serialport-api/) 来打开作为端口的串行端口“/dev/ttyACM0”与我的串行设备相关联。端口有正确的“666”权限(crw-rw-rw),应用本身甚至有WRITE_EXTERNAL_STORAGE权限。
但是,即使权限看起来正确,当我的应用程序尝试使用库打开所述串行端口时,它也会失败。在我的 java 代码中,如果我尝试执行“device.canWrite()”,它会返回 false,而“device.canRead()”会返回 true。我觉得这是更大权限问题的症状。
如果我使用与串行端口 api/库捆绑在一起的示例 apk,我会遇到同样的问题,即应用程序在 device.canWrite() 处失败并引发 SecurityException。
在自定义内核 ICS 设备上运行时,完全相同的代码确实可以成功运行并打开,该设备最初是为该设备开发的。但是,两者的内核都是由同一个开发人员编写的,至少从表面上看,端口上的权限似乎是相同的。
这可能是我可以在应用程序代码方面解决的问题吗?我尝试了其他一些串口库(USBSerial3.0,usb-serial-for-android-master),我似乎遇到了同样的问题。
无论问题出在哪里,是否有人知道问题可能出在哪里?对内核、应用程序和 api 进行更改都在桌面上。谢谢。
【问题讨论】:
【参考方案1】:问题出在 SELinux 上,大多数三星系列设备都将其用作安全执行策略。该安全策略被设置为强制执行,这样任何应用程序都无法访问其指定应用程序空间之外的文件,例如我试图打开的串行端口。
鉴于我们可以更改内核,我们能够向 SELinux 添加一个策略例外,该例外赋予我的应用提升的权限,从而允许它正确打开端口。
【讨论】:
最有帮助的帖子作为参考:***.com/questions/29844577/…【参考方案2】:Gabe,Google 在 Android 4.4 中将 SELinux 模式从 Permissive Mode 更改为 Enforce Mode,默认情况下,应用程序没有 (SELinux) 访问串行端口的权限。以下是解决此问题的几种方法: (1)。如果您的设备已植根,您可以将 SELinux 模式从强制模式切换到许可模式:“su setenforce 0”。每次重新启动设备时都需要运行该命令。见http://www.xda-developers.com/easily-change-your-android-selinux-mode/ (2)。如果您有权访问设备的内核框架文件,您 可以更改它们并授予对您的应用程序的串行端口访问权限。
【讨论】:
【参考方案3】:从 shell 运行 setenforce 0
以禁用 SELinux。它对我有用,我可以在 tty/ACM0
上读/写。
【讨论】:
更正:文件名/dev/ttyACM0和设备已root。以上是关于为啥我不能从 Android 上的串行端口打开/写入?的主要内容,如果未能解决你的问题,请参考以下文章
WINDOWS 上的 WebSerial API - “DOMException:无法打开串行端口。”