You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用通过JNI调用C库访问USB串口遇权限问题求助

Android 串口连接权限问题解决方案(API 13)

不需要ROOT设备即可解决这个问题,以下是针对你遇到的SELinux权限错误的可行方案:

错误分析

你遇到的avc: denied { search }错误是SELinux安全策略限制了应用对/dev/usb目录的访问权限——你的应用运行在untrusted_app_30安全上下文,而目标目录属于usb_device类型,SELinux默认禁止这种跨上下文的目录搜索操作。

可行解决方案

1. 直接访问具体串口设备节点

检查你传入的deviceName是否包含/dev/usb这类目录路径,尝试直接使用具体的串口设备节点(比如/dev/ttyUSB0、/dev/ttyACM0),跳过对/dev/usb目录的搜索操作,这样可以规避SELinux的目录权限检查。

2. 使用Android USB Host API替代JNI直接调用

API 13已支持USB Host API,通过框架层API操作串口可以绕过JNI层open调用带来的权限问题:

  • 在AndroidManifest.xml中添加USB Host特性声明:
    <uses-feature android:name="android.hardware.usb.host" android:required="true" />
    
  • 注册广播接收器监听USB设备连接事件,通过UsbManager向用户申请设备访问权限
  • 使用UsbDeviceConnection配合串口驱动逻辑(可自行实现或使用成熟的串口封装逻辑)完成数据读写

3. 调整SELinux策略(测试或特定场景)

  • 测试阶段可通过ADB临时将SELinux设为宽容模式:
    adb shell setenforce 0
    
    注意:该设置重启后失效,仅适合本地测试。
  • 若面向特定设备,可联系厂商申请应用签名授权,或在Manifest中添加系统级USB权限(如android.permission.ACCESS_USB_DEVICE),部分厂商允许非ROOT应用通过该方式获取权限。

内容的提问来源于stack exchange,提问作者Joterito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:27:35