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

Android Accessory Protocol传输速率仅3.7MB/s,求慢因排查

USB Accessory Protocol传输速率偏低的原因及优化方案

核心原因分析

1. AAP底层协议与USB模式限制

Android Accessory Protocol默认基于USB 2.0批量传输,理论最大速率480Mbps(约60MB/s),但实际受协议开销、设备驱动限制,很难达到上限。部分设备甚至会强制AAP工作在USB全速模式(12Mbps,约1.5MB/s),直接拉低传输效率。

2. 代码IO效率不足

你当前使用FileInputStream做同步阻塞读取,存在以下问题:

  • 该API是通用文件IO接口,未针对USB批量传输做优化,单次系统调用开销高
  • 固定16KB的缓冲区虽不算小,但同步等待单块数据接收会浪费USB总线的空闲时间
  • 未利用异步IO或批量传输的连续发包特性,总线利用率低

3. 主机端传输配置不合理

如果Mac端用libusb实现,若未开启批量流模式、缓冲区大小不匹配、超时设置过短,会导致频繁的ACK等待或重试,大幅降低传输速率。

4. 设备与线缆限制

  • 部分安卓设备的USB控制器硬件或系统固件对AAP做了带宽限制
  • 非全功能USB-C线缆仅支持充电或低速数据传输,无法发挥高速性能
  • 系统省电策略、USB调试限制模式可能会限制USB传输的带宽

优化方案

代码层面优化

替换通用IO为USB原生批量传输API,改用高效的连续读取逻辑:

// 前提:已获取UsbDeviceConnection和对应的批量输入端点
val inEndpoint: UsbEndpoint = ...
val bufferSize = 65536 // 64KB缓冲区,匹配USB高速批量传输的最优块大小
val targetBytes = ByteArray(totalLength) // 预先分配好的目标数组
var received = 0

val timeTaken = measureTime {
    while (received < totalLength) {
        val bytesRead = usbDeviceConnection.bulkTransfer(inEndpoint, buffer, bufferSize, 1000)
        if (bytesRead > 0) {
            System.arraycopy(buffer, 0, targetBytes, received, bytesRead)
            received += bytesRead
        } else if (bytesRead == -1) {
            // 处理传输错误
            break
        }
    }
}

// 计算并输出速率
val mbLength = totalLength / 1024.0 / 1024
val mbps = mbLength / (timeTaken.inWholeMilliseconds * 1e-3)
text_view.append("\nReading: ${mbLength} MB in ${timeTaken.inWholeMilliseconds} ms = ${mbps} MB/s")

主机端配置调整

  • 开启libusb的批量流模式,允许连续发送多包数据,减少ACK等待
  • 设置与安卓端匹配的缓冲区大小,避免数据碎片化
  • 调整传输超时时间至合理范围(比如1000ms),避免频繁重试

设备与环境检查

  • 使用全功能USB-C线缆(支持USB 3.0及以上)
  • 关闭安卓设备的USB限制模式、省电模式
  • 在开发者选项中确认USB配置为“文件传输”或“USB配件”模式,而非仅充电

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:37:01