为什么我不能从 Android 上的串行端口 open/write?

Why can't I open/write from a serial port on Android?

我写了一个 Android 应用程序,它 运行 在 Android 4.4 Kitkat 设备上的自定义内核上运行,它使用 Android 串行端口 API (https://code.google.com/p/android-serialport-api/) 以打开串行端口“/dev/ttyACM0”,这是与我的串行设备关联的端口。该端口具有适当的“666”权限(crw-rw-rw),应用程序本身甚至具有 WRITE_EXTERNAL_STORAGE”权限。

但是,即使权限看起来正确,当我的应用程序尝试使用该库打开所述串行端口时,它也会失败。在我的 java 代码中,如果我尝试执行 "device.canWrite()" 它 returns 错误,而 "device.canRead()" returns 正确。我觉得这是更大权限问题的征兆。

如果我使用与串口捆绑的示例 apk api/library,我会遇到同样的问题,应用程序在 device.canWrite() 处失败并抛出 SecurityException。

完全相同的代码在自定义内核 ICS 设备上成功 运行 并在 运行 时打开,该应用程序最初是为其开发的。然而,两者的内核是由同一个开发人员编写的,至少从表面上看,端口的权限似乎是相同的。

这可能是我可以在应用程序代码方面解决的问题吗?我尝试了其他一些串口库(USBSerial3.0、usb-serial-for-android-master),我似乎遇到了同样的问题。

不管问题出在哪里,有人知道问题出在哪里吗?更改内核、应用程序和 api 都在 table 上。谢谢。

问题原来出在 SELinux 上,大多数三星设备系列都将其用作安全强制策略。该安全策略设置为强制执行,这样任何应用程序都无法访问其指定应用程序之外的文件 space,例如我试图打开的串行端口。

鉴于我们可以更改内核,我们能够向 SELinux 添加策略例外,从而为我的应用程序提升权限,从而使其能够正确打开端口。

Gabe,Google 在 Android 4.4 中将 SELinux 模式从许可模式更改为强制模式,默认情况下,应用程序没有访问串行端口的 (SELinux) 权限。以下是解决此问题的几种方法: (1).如果您的设备已获得 root 权限,您可以将 SELinux 模式从强制模式切换到许可模式:“su setenforce 0”。每次重新启动设备时,您都需要 运行 命令。见 http://www.xda-developers.com/easily-change-your-android-selinux-mode/ (2).如果您有权访问设备的内核框架文件,您 可以更改它们并授予对您的应用程序的串行端口访问权限。

运行 setenforce 0 从 shell 禁用 SELinux。它对我有用,我能够在 tty/ACM0.

上 read/write