This post was published in 2021-02-19. Obviously, expired content is less useful to users if it has already pasted its expiration date.
MacOS连接Android设备其实算是一个比较老套的话题,而本文讨论的内容侧重于Android设备的MTP挂载问题,即:
1,需要在macOS上访问Android设备,并进行简单的文件复制、粘贴、删除等操作
2,需要将Android设备挂载在macOS Finder上,且能够进行Read / Write操作,就像Windows系统原生支持MTP一样
3,不需要对Android设备动手(比如Xposed框架)
结论:仅仅从“挂载MTP设备”的功能上来看:
免费方案:Go-mtpfs(见本文后面的内容):开源,可能会有轻微的bug和连接不稳定的风险;
付费方案:MacDroid(见本文后面的内容):一年$19.99(它应该管用,但我没买过,不能100%确定)
Table of Contents
Airdroid
✅ 无需USB连接,通过局域网就能访问相册、联系人等各种手机资源,自带一个文件管理器
❌ 无法挂载MTP作为硬盘
Android File Transfer
https://www.android.com/filetransfer/
❓ 多年不更新的老式软件,Android官方出品,使用的时候需要用USB线连接
❌ 屎一样的文件管理器页面,只有少数几个基本功能
❌ 无法挂载MTP作为硬盘
OpenMTP
https://github.com/ganeshrvel/openmtp
用electron写的UI,从功能设计上有一点类似于Android File Transfer,但是还在频繁加入新功能。
❌ 比起Android File Transfer要好一些,但还是无法挂载MTP作为硬盘
Handshaker
https://www.smartisan.com/apps/#/handshaker
❓ 需要在macOS和Android两边都安装特定软件
由于条件限制,我无法使用handshaker。根据一些网友的说法:现在还依旧能用,就是速度有的时候会打折扣。
Sync Mate
$39.9付费软件,挂载MTP设备只是附带功能之一。主要功能是自动备份各种设备里的数据。
✅ 据官网的介绍文字,它能够挂载MTP作为硬盘(我没有购买这个软件,无法100%确定)
❌ 老掉牙的UI设计;连接Android设备时需要在手机里安装一个App作为辅助(毕竟还有备份通讯录短信等功能);付费购买并不是真正意义上的终身授权(仅仅是大版本免费更新,所以一次付费大概能更新1.5~2年)。
MacDroid
和上面的Sync Mate出自同一家公司。但MacDroid的UI设计明显更“现代化”一些,看来是近几年剥离开发出的新品。可以看作是Sync Mate的“更纯粹版”,专注于Android设备在macOS上的挂载。
✅ 能够挂载MTP作为硬盘
❓免费版只能读,付费版才能读+写。这个软件是按年订阅付费制,每年$19.99
✅ 我试用了免费版,如果仅从 只读 这个功能上来看,MacDroid非常稳定可靠
看起来只使用免费版(只读)也能应对很多使用环境了。可惜我发现我日常使用的FreeFileSync在进行数据备份的时候需要能够写入sync.ffs_lock文件,和MacDroid免费版的“只读”冲突。
我猜,MacDroid是非常可靠的。只是我暂时还不想向付费和破解妥协,我想试试其他方案。
Simple-mtpfs
❌ 挂载、连接和读写非常不稳定,非常不可靠,容易出问题
https://github.com/phatina/simple-mtpfs
如果通过homebrew安装,它首先会检测osxfuse依赖,然后再进行接下来的安装步骤。所以:至少,在安装它的时候,需要用一个osxfuse 3.x萌混过关(它检测不出osxfuse 4.x),Simple-mtpfs安装完了以后实测可以卸载osxfuse 3.x,使用osxfuse 4.x .
✅ 能够挂载MTP作为硬盘
但它拥有一些令人难以忍受的bug。虽然通过命令可以挂载Android MTP设备:(在Catalina以及更高版本上面需要 $ mkdir ~/androidMTP ,因为系统限制了挂载路径)
$ simple-mtpfs -f -o rw,volname=myAndroid ~/androidMTP &
但是挂载出来的MTP设备几乎无法使用。举个例子,你进入目录~/androidMTP,看到一个txt文件,想右键打开它,然后整个Finder就卡死了。不仅仅是Finder卡死,Alfred、Activity Monitor、FAF等一连串软件都无法打开了。更为匪夷所思的是,在卡死的过程中甚至连Google Chrome也打不开网页。要想解除一连串的无响应,只能先把USB线强行拔下来,然后才能杀死simple-mtpfs进程。
当然,MTP挂载卡死的不止我一个人:https://github.com/phatina/simple-mtpfs/issues/81
Go-mtpfs(2024年更新)
项目地址:https://github.com/hanwen/go-mtpfs
注意:
运行go-mtpfs需要先安装macfuse或者osxfuse;没有试过/不知道m1/m2/m3的机器(Apple silicon)能不能正常使用;2024年更新:Apple silicon可以正常使用!
截止到2024-04-29,我在以下芯片和系统上成功编译并运行过:(详细表格贴在本文末尾)
Intel芯片的: Catalina(所有正式版本),Monterey(所有正式版本),Ventura(所有正式版本)和Sonoma(截止到14.4.1);不知道Mojave或者更低版本能不能正常使用(可能需要切换osxfuse和go-fuse的版本);
Apple silicon芯片(m3):Sonoma(14.4.1 ~ 14.6.1), Sequoia (15.0)
(下面的命令仅供参考,如果有出入建议参考官方README)
# 下面这些命令需要用到homebrew: https://brew.sh
# 如果已经通过其他途径安装则可以跳过部分brew install的命令
# 需要macFUSE,如果已经通过pkg安装则直接跳过
# 不支持macfuse的老系统可能需要 $ brew install osxfuse
$ brew install macfuse
# 需要golang
$ brew install go
# 需要libusb
$ brew install libusb
# 需要pkg-config
# 有很多奇怪报错的来源都是因为没安装pkg-config,见下面的解释
$ brew install pkg-config
$ git clone https://github.com/hanwen/go-mtpfs
$ cd go-mtpfs
# 除非遇到少见的老系统兼容问题,否则绝大多数情况下都推荐使用最新版本$ go get -u; go mod tidy,见后面的注解
$ go get -u; go mod tidy
$ go build ./
$ sudo cp ./go-mtpfs /usr/local/bin/go-mtpfs
注意:
如果你的macOS系统比较新(Monterey以及之后的macOS只能安装macFUSE而不是osxFUSE),那么go-mtpfs原有的老旧go-fuse依赖已经不能用了,在后续的使用中你可能会遇到类似 mount failed: fork/exec/Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs: no such file or directory 这样的错误,这个时候你就需要升级go-fuse依赖:在go-mtpfs代码目录下直接执行 $ go get -u; go mod tidy ,或者修改 go.mod 文件中的go-fuse依赖(目测go-fuse版本最低需要v2,当前我使用的版本是 v2.5.1 ):
...
require (
github.com/hanwen/go-fuse/v2 v2.5.1
....
然后重新编译go-mtpfs.
2024年4月补充:我在一台新的m3机器上编译时遇到了一些之前没遇到过的问题,比如这些报错:
1. pkg-config not found
2. error obtaining VCS status: exit status 1 ... use -buildvcs=false
3. cc: The build tool has reset ENV; --env=std required.
这些都来自于没有正确配置pkg-config(你可能会找到/opt/homebrew/Library/Homebrew/shims/mac/super/pkg-config,但直接引入这个$PATH会带来更多的问题),所以最简单的解决方法是用homebrew安装一个pkg-config: $ brew install pkg-config .
2024年9月补充:在升级Sequoia以后,原本在Sonoma上面能运行的go-mtpfs不能继续用了。需要解决这两个问题:
- macFUSE版本限制(需要升级到4.8.2才能支持Sequoia)
- golang.org/x/sys版本较低,导致MTP目录挂载不出来:我原本是v0.19.0,升级到了v0.25.0以后编译出来的go-mtpfs就能正常工作了。
编译完成以后就可以直接使用go-mtpfs了(如果你使用Catalina以及之后的macOS系统,那么你最好在home目录下挂载MTP设备,比如 $ mkdir ~/androidMTP ,因为系统限制了挂载路径):
* 接下来的一系列命令都默认挂载路径为 ~/androidMTP
$ /usr/local/bin/go-mtpfs ~/androidMTP &
然后就可以在Finder里面找到挂载好的MTP设备,开始体验像Windows MTP那样自然流畅的MTP挂载了。经过短暂的测试,go-mtpfs目前能够完美执行绝大多数Finder操作,包括复制粘贴剪切删除右键菜单等等。此外,Quicklook也能流畅使用。
vim和一些文本编辑器(比如textedit, coteditor)在挂载的MTP目录下编辑文本文件可能会报错(大部分情况下仍然能够成功写入,但不推荐)。VSCode的表现似乎要更好一些。
注意:不能指望这个开源软件提供非常稳定的MTP挂载服务,在使用过程中可能会遇到类似下面的报错:
GetStorageInfo 10001: mtp: cannot run operation GetStorageInfo, device is not open
GetObjectHandles failed: mtp: cannot run operation GetObjectHandles, device is not open
偶尔出现这样的报错是正常的,但如果只出现这样的报错(且无法进行任何文件操作)就说明出问题了。此时可能需要终止当前程序并unmount挂载目录,然后重新挂载MTP设备。
如果要移除手机,需要终止go-mtpfs进程,然后卸载目录 ~/androidMTP :
$ pkill go-mtpfs
$ umount ~/androidMTP
然后就可以拔掉手机数据线了。
如果遇到了问题(比如在连接过程中手机数据线被意外拔掉),导致 ~/androidMTP 目录无法用umount卸载,可以先尝试强制卸载:
$ diskutil unmount force ~/androidMTP
如果强制卸载也不管用,重启系统一般都能解决问题。(懒人做法)
附录:在我的电脑上成功编译并运行的go-mtpfs环境:
macbook芯片 | macOS版本 | FUSE版本 | go-mtpfs版本 | go-fuse版本 | 编译go-mtpfs的GO版本 |
intel | Catalina | osxFUSE (v3) | 42254b1 | 1.x | 1.15.x |
intel | Monterey | macFUSE (v4) | 42254b1 | 2.1.0 | 1.17.x |
intel | Ventura | macFUSE (v4) | 42254b1 | 2.1.0 | 1.19.x |
intel | Ventura | macFUSE (v4) | 42254b1 | 2.2.0 | 1.20.1 |
intel | Sonoma | macFUSE (v4) | 42254b1 | 2.2.0 | 1.20.1 |
Apple Silicon (m3) | Sonoma | macFUSE (v4) | 42254b1 | 2.5.1 | 1.22.2 |
Apple Silicon (m3) | Sequoia | macFUSE (4.8.2) | 42254b1 | 2.5.1 | 1.23.0 |