8.0以后,串口访问越来越麻烦,各种权限受限,把这两天遇到的麻烦Mark一下,希望同行看见后有所借鉴。
关于权限,我总结了下,主要有三点:
1、app 要有系统权限
在AndroidManifest.xml里加上
android:process=“system”
android:sharedUserId=“android.uid.system”
不过这样的话,app就要放到源码里编译了。
2、 /dev/ttyS4要有读写权限 (你的串口不一定是这个ttyS4)
ls -l /dev/ttyS4
如果没有读写权限,记得在init.rc里面添加
chmod 777 /dev/ttyS4
3、做完上面两步,本来想这会该有访问权限了吧,结果还是拒绝访问,一脸的懵逼。
后来想起来有可能是selinux搞得鬼,然后将selinux设为 permissive模式以后,终于可以通讯了。
不过每次adb shell输入setenforce 0 还是不爽,
我们在源码里访问权限加上。
可以参考 https://blog.csdn.net/huangyabin001/article/details/79290382
我这里具体的更改为
Rk3288/system/sepolicy/private/system_app.te
加上这么两句话
allow system_app serial_device:chr_file { open read write ioctl getattr };
allow system_app proc_stat:file { getattr };
这样那些自己驱动里创建的设备节点也就可以访问了。
然后mmm sepolicy。
串口的操作用的是android-serialport-api ,只不过我的代码里将ndk-build改成了cmake,如果不会操作,一搜一大把。
开发环境 androidStudio ndk cmake
1