MacOS挂载Android设备的一些方法和比较

WARNING: This article may be obsolete
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%确定)

Airdroid

https://www.airdroid.com/

✅ 无需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

https://www.sync-mac.com/

$39.9付费软件,挂载MTP设备只是附带功能之一。主要功能是自动备份各种设备里的数据。

✅ 据官网的介绍文字,它能够挂载MTP作为硬盘(我没有购买这个软件,无法100%确定)

❌ 老掉牙的UI设计;连接Android设备时需要在手机里安装一个App作为辅助(毕竟还有备份通讯录短信等功能);付费购买并不是真正意义上的终身授权(仅仅是大版本免费更新,所以一次付费大概能更新1.5~2年)。

MacDroid

https://www.macdroid.app/

和上面的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(推荐)

项目地址: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).

(下面的命令仅供参考,如果有出入建议参考官方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.2.0 ):

...

require (
	github.com/hanwen/go-fuse/v2 v2.2.0

....

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 .


编译完成以后就可以直接使用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
或者
$  kill -9 xxxxx


$  umount ~/androidMTP

如果遇到了问题, ~/androidMTP 目录无法用umount卸载,可以先尝试强制卸载:

$    diskutil unmount force ~/androidMTP

如果强制卸载也不管用,重启系统一般都能解决问题。(懒人做法)

附录:在我的电脑上成功编译并运行的go-mtpfs环境:

macbook芯片macOS版本FUSE版本go-mtpfs版本go-fuse版本编译go-mtpfs的GO版本
intelCatalinaosxFUSE (v3)42254b11.x1.15.x
intelMontereymacFUSE (v4)42254b12.1.01.17.x
intelVenturamacFUSE (v4)42254b12.1.01.19.x
intelVenturamacFUSE (v4)42254b12.2.01.20.1
intelSonomamacFUSE (v4)42254b12.2.01.20.1
Apple Silicon (m3)SonomamacFUSE (v4)42254b12.5.11.22.2


 Last Modified in 2024-04-29 


Leave a Comment Anonymous comment is allowed / 允许匿名评论