我编写了一个Android应用程序,该应用程序运行在Android 4.4 Kitkat设备上的自定义内核上,该设备使用Android串行端口API(https://code.google.com/p/android-serialport-api/)来打开串口" / dev / ttyACM0& #34;这是与我的串行设备关联的端口。港口有适当的" 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进行更改都在桌面上。谢谢。
答案 0 :(得分:1)
Gabe,Google将SELinux模式从Permissive Mode更改为Android 4.4中的Enforce Mode,默认情况下,应用程序没有(SELinux)访问串行端口的权限。以下是解决此问题的几种方法: (1)。如果您的设备已植根,则可以将SELinux模式从强制模式切换到允许模式:“su setenforce 0”。每次重启设备时都需要运行该命令。见http://www.xda-developers.com/easily-change-your-android-selinux-mode/ (2)。如果您可以访问设备的内核框架文件 可以更改它们并授予对应用程序的串行端口访问权限。
答案 1 :(得分:1)
从shell运行setenforce 0
以禁用SELinux。它对我有用,我能够在tty/ACM0
上读/写。
答案 2 :(得分:0)
问题最终发生在SELinux上,而大多数三星系列设备都将其用作安全执行政策。该安全策略已设置为强制执行,因此任何应用程序都无法访问其指定应用程序空间之外的文件,例如我尝试打开的串行端口。
鉴于我们可以更改内核,我们可以向SELinux添加一个策略例外,为我的应用程序提升了特权,从而允许它正确打开端口。