概览
迭代速度是构建高质量 Android 应用的关键要素。处理的速度越快,应用程序的体验就越顺畅。这篇文章将和大家聊聊如何优化部署时间。
部署 101
在 Android Studio 3.5 中,我们在多个方面改进了迭代速度。开发者现在可以使用 Apply Changes 了: 根据代码结构,它可以替换更改的代码,并且重启当前 Activity; 如果代码和 Activity 生命周期无关,则会调用 "Apply Code Changes" 来仅替换代码而不会重启正在运行的 Activity。
△ 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
如果不去深究,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% 但坏消息是,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-B:
△ 左侧是 USB Type-B 母口 右侧是 USB Type-B 公口了解 USB-C
USB-C 接口和 USB 3.1 几乎同时发布。很多人以为他们之间有联系,但是其实他们毫不相干。
USB 2.0 数据线中有四根线缆。其中两根用于供电,另外两根用于数据传输。
△ 一条 USB 2.0 数据线中含四根线缆 USB 3.X 数据线完全向下兼容。它含有两条线缆用于 USB-2 信号传输,还有两组双绞线用于 USB-3 的上行和下行数据。
△ 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 手机标配的数据线,这台手机是使用 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 标志 对于手机接口使用哪个协议,可以查看设备的相关参数。即使是近期发布的手机也有可能使用 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