Android主板RS485端口Modbus RTU开发遇AVC权限拒绝求助
解决方案
一、解决AVC串口权限拒绝问题
从Logcat日志看,你的应用处于untrusted_app SELinux域,无法访问serial_device类型的/dev/ttyS5设备,以下是几种解决方法:
临时测试用:直接修改设备文件权限
借助Root权限在终端执行命令,给串口文件开放全局读写权限,重启后失效,适合快速验证功能:su chmod 666 /dev/ttyS5永久生效:添加SELinux自定义规则
如果你需要长期生效,可自定义SELinux规则允许应用访问串口:- 创建规则文件
serial_app.te,内容如下:allow untrusted_app serial_device:chr_file { open read write }; - 编译规则(设备需预装
checkpolicy工具,或在PC端交叉编译):checkpolicy -M -o serial_app.pp serial_app.te - 加载规则到系统:
su semodule -i serial_app.pp
- 创建规则文件
二、签名后保留调试能力
厂商提供的签名会让应用获得系统级权限,但默认release包关闭了调试,可通过以下方式开启:
修改构建配置,让release包可调试
在Module级的build.gradle中,给release构建类型开启调试开关:android { buildTypes { release { signingConfig signingConfigs.your_vendor_sign // 替换成你配置的厂商签名 debuggable true minifyEnabled false // 先关闭混淆,方便调试 } } }用这个配置编译的release包,安装后可直接在Android Studio中调试,Logcat、断点功能都能正常使用。
双阶段测试:先调试再签名
先用默认调试签名编译APK,配合Root临时权限验证功能没问题后,再用厂商签名打包正式版本;或者用adb root后执行adb install -t your_debug_apk.apk安装调试包,快速验证逻辑。
三、绕开权限限制:Root层封装串口操作
如果不想修改SELinux或签名配置,可通过Root权限在底层执行串口操作,Java层仅调用命令:
public String readSerialData() throws IOException, InterruptedException { Process process = Runtime.getRuntime().exec(new String[]{"su", "-c", "cat /dev/ttyS5"}); BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuilder output = new StringBuilder(); String line; while ((line = inputReader.readLine()) != null) { output.append(line); } inputReader.close(); process.waitFor(); return output.toString(); }
这种方式绕开了应用层的SELinux权限检查,适合快速验证功能,但要注意Root操作的安全风险。
内容的提问来源于stack exchange,提问作者Burak Ogutken
相关产品推荐
相关产品推荐

