别让 USB 传输速度影响 Android 开发效率

别让 USB 传输速度影响 Android 开发效率

概览

迭代速度是构建高质量 Android 应用的关键要素。处理的速度越快,应用程序的体验就越顺畅。这篇文章将和大家聊聊如何优化部署时间。

部署 101

在 Android Studio 3.5 版本中,我们在多个方面改进了迭代速度。开发者可以使用 Apply Changes: 根据代码结构,它可以替换更改的代码,并且重启当前 Activity; 如果代码和 Activity 生命周期无关,则会调用 "Apply Code Changes" 来仅替换代码而不会重启正在运行的 Activity。

△ Apply Changes 带来了两种全新的应用程序部署方式

△ Apply Changes 带来了两种全新的应用程序部署方式

基于 Apply Changes,Android Studio 3.5 新增了 "Delta Push",在下次调用 Run 的时候,他只会把 APK 中修改的部分推送到设备上。应用程序会通过 sendfile(2) 命令将新旧资源发送给 Package Manager 并且在设备上进行重构,以此来达到 "零拷贝" 安装。

这些机制组合起来减少了安装时间,不过要想得到较好的优化效果,开发者还需要注意设备数据线传输的速度和稳定性。

为什么 USB 传输速度很重要

无论 "Delta Push" 是否被启用,总会有数据传输到设备上。如果用的是模拟器,数据会通过 TCP/IP 进行传输,但是如果用的是真机则会用到 USB,USB 传输速度越快,等待时间越短,程序迭代速度也就越快。

好消息是 USB 传输速度现在越来越快了: 1996 年时,USB 仅能够提供 12 Mb/s 的传输速度,到了 2019 年 8 月发布 USB 4.0 版本的时候,已经可以达到几个 Gb/s 的速度了。

△ 从 1996 到 2019,USB 传输速率从 1.5Mbps 提高到了 40GBps

△ 从 1996 到 2019,USB 传输速率从 1.5Mbps 提高到了 40GBps

如果不去深究,USB 其实是一个较为简单的技术。只要两台设备所支持的 USB 版本相同,用 USB 连接线相连就可以用了,客户端层不用作出任何修改,用起来易如反掌。

对开发者来说,拥有高速的 USB 传输至关重要。传输速度达到一定程度以后,USB 传输速度和程序迭代速度就会关联起来,手机存储的写入速度可能无法达到 USB 3.2 的 20Gb/s,不过还是比 USB 2.0 要快,所以如果您安装调试一个 50M 大小的 APK,USB 3.0 协议的传输速度会比使用 USB 2.0 协议快 25%,一天下来能节省下的时间应该不少:

△ 安装一个 50 MB 的应用,USB 3.0 比 USB 2.0 快 30%

△ 安装一个 50 MB 的应用,USB 3.0 比 USB 2.0 快 30%

但坏消息是,USB 3.0 的设备常常以 USB 2.0 的速度在传输数据。有两种方式会导致这种情况,要么线出现问题,要么集线器出现问题。

避免降低 USB 连接的传输速度

有三个基本原则可以避免 USB 降速的问题:

  • 找蓝色接口
  • 了解 USB-C
  • 选择合适的 USB 集线器

找蓝色接口

如果您用的是 Type-A 或者 Type-B 接口,那就简单了。USB 3.0 标准里建议通过颜色来区分专门连接到 USB 3.X 硬件的接口。如果您看到下面图片中的接口,那么说明您接对接口了。

USB Type-A:

△ 左侧是 USB Type-A 母口,右侧是 USB Type-A 公口

△ 左侧是 USB Type-A 母口,右侧是 USB Type-A 公口

USB Type-B:

△ 左侧是 USB Type-B 母口,右侧是 USB Type-B 公口

△ 左侧是 USB Type-B 母口,右侧是 USB Type-B 公口

了解 USB-C

USB-C 接口和 USB 3.1 几乎同时发布。很多人以为他们之间有联系,但是其实他们毫不相干。

USB 2.0 数据线中有四根线缆。其中两根用于供电,另外两根用于数据传输。

△ 一条 USB 2.0 数据线中含四根线缆

△ 一条 USB 2.0 数据线中含四根线缆

USB 3.X 数据线完全向下兼容。它含有两条线缆用于 USB-2 信号传输,还有两组双绞线用于 USB-3 的上行和下行数据。

△ USB 3.0+ 数据线含有 8 根线缆

△ USB 3.0+ 数据线含有 8 根线缆

从传输数据角度看,USB Type-C 只是一种新的接口形态,并且它不会探测线缆连接的数量,换句话说就是,它并不关心另一端的传输协议是高速的 USB 3.X 协议还是相对低速的 USB 2.0 协议,加之其造价低廉,导致很多数据线用的虽然是 Type-C 接口,但数据传输还是走 USB 2.0 的协议。

△ Nexus 6P 标配的 Type-A 转 C 数据线

△ Nexus 6P 标配的 Type-A 转 C 数据线

上图所示是 Nexus 6P 手机标配的数据线,这台手机是使用 USB 2.0 协议,并通过 USB Type-C 接口连接,这些数据线中只有 4 根线缆。

如果您用的是这样的数据线接入开发环境的话,很有可能您在用低速连接 USB-3 兼容设备。原因是在开发过程中,如果您一直在使用 Nexus 6P 的这条数据线连接其他不同的手机 (部分手机的 Type-C 接口可能会使用 USB 3.0 协议,而这条数据线最高只能有 2.0 协议的速度),那您的整体开发体验和开发效率可能会降低不少。

所以当使用 USB Type-C 接口的时候,确保上面有 SS (SuperSpeed) 的标志。

△ USB Super-Speed 标志

△ USB Super-Speed 标志

对于手机接口使用哪个协议,可以查看设备的相关参数。即使是近期发布的手机也有可能使用 2.0 低速接口,比如 Pixel 3a 和 Pixel 3a XL。

选择合适的 USB 集线器

最后一个要避免的错误操作就是避免使用较差质量的 USB 集线器产品 —— 它的效果和用错线是一样的。USB 集线器可以把您所有的设备都串联到一起 (从键盘、鼠标、到开发设备)。但是很多集线器产品都是用于一些轻量级低速设备,比如键盘、鼠标和耳机,这些设备仅需要 USB 2.0连接。

确认一下您的 USB 集线器是否支持 USB 3.0,看一下它的接口是不是蓝色的,如果接口只有 Type-C,可以看一下说明书。

实用工具

如果您仍有疑虑,可以通过下面命令看一下您的 USB 设备和宿主机之间的速度。

  • Mac 系统: system_profiler SPUSBDataType
  • Linux 系统: lsusb -vvv
  • Windows 系统: USBView.exe

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗