OpenMTP | macOS 安卓文件传输工具
- 作者:Ganesh Rathinavel
- 许可证:MIT
- 系统要求:macOS 11.0 (Big Sur) 或更高版本
- 官网:https://openmtp.ganeshrvel.com
- 代码仓库:https://github.com/ganeshrvel/openmtp
- 联系方式:ganeshrvel@outlook.com
简介
macOS 上的高级安卓文件传输应用。
在 macOS 和安卓或其他 MTP 设备之间传输文件一直是一场噩梦。市面上有一些 MTP 文件传输应用,但它们要么价格昂贵,要么用户界面和体验很差。谷歌官方为 macOS 提供的"Android File Transfer"应用存在诸多问题和限制,比如无法传输大于 4GB 的文件、频繁断开连接、无法重命名安卓/MTP 设备上的文件夹或文件等。其他大多数在线应用则使用 WiFi 或 ADB 协议传输文件,这是一个极其耗时的过程。
无数次搜索寻找解决这些问题的应用却一无所获,这让我倍感焦虑。于是,我决定自己开发一个应用,帮助我们实现从 macOS 到安卓/MTP 设备的流畅无忧的文件传输过程。本着回馈社区的初衷,我们都可以在今后免费使用这个应用。
特性
- 安全、透明、开源
- 通过 USB 即插即用。无需繁琐设置,连接简单快速
- 可选择内部存储或 SD 卡
- 支持传输多个大于 4GB 的文件
- 深色模式
- 支持拖放操作
- 本地电脑和安卓设备的分屏视图
- 可选择网格或列表视图
- 使用键盘快捷键浏览文件
- 不收集任何个人身份信息
Kalam 内核
OpenMTP 3.0 采用了全新的 MTP 内核,该内核是从零开始编写的。它在中低端设备上可实现 30 到 40 MB/s 的文件复制速度,在高端设备上可达到 100 到 120 MB/s。这个全新强大的 MTP 内核以 A. P. J. Abdul Kalam 博士 的名字命名。
欢迎查看我为构建 Kalam 内核而编写的 Go 包:github.com/ganeshrvel/go-mtpx。欢迎提交 PR。
系统要求和支持
- 为了支持 Big Sur 以下的 macOS 版本,每次更新时都需要在旧版 macOS 机器上编译 Kalam 内核,这在实际操作中非常困难
- 只有最新的 3 个 macOS 版本会收到
Kalam
内核更新,包括新设备支持、修复和稳定性改进。macOS Big Sur (11.0) 及以上版本将收到上述更新 - 我们现已正式停止对 macOS 10.13 (OS X El High Sierra) 及更低版本的
Kalam
内核支持。这些过时机器上只能继续使用"旧版"MTP 模式 - 我们将继续为
Intel
和ARM64
机器发布更新
安装
- 下载 Mac Apple Silicon 版本
- 下载 Mac Intel Silicon 版本
- 使用 Homebrew Cask
# 新版本:
brew install openmtp --cask
# 旧版本:
brew cask install openmtp
- 从 GitHub Releases 下载最新的 dmg 文件
截图
键盘快捷键
命令 | 键盘快捷键 |
---|---|
删除 | backspace |
新建文件夹 | command (⌘)+n |
复制 | command (⌘)+c |
复制到队列 | command (⌘)+shift+c |
粘贴 | command (⌘)+v |
刷新 | command (⌘) +r |
返回上级文件夹 | command (⌘)+b |
全选 | command (⌘)+a |
重命名 | command (⌘)+d |
切换标签 | command(⌘)+1 |
打开 | enter |
向左导航 | left |
向右导航 | right |
向上导航 | up |
向下导航 | down |
向前选择多个项目 (网格视图) | shift+left |
向后选择多个项目 (网格视图) | shift+right |
向前选择多个项目 (列表视图) | shift+up |
向后选择多个项目 (列表视图) | shift+down |
选择多个项目 (使用鼠标) | command (⌘)+click 或 shift+click |
从源代码构建
要求:Node.js v16、Git 和 Yarn 包管理器
克隆
$ git clone https://github.com/ganeshrvel/openmtp.git
$ cd openmtp
# 安装 yarn
npm install -g yarn
# 安装 sentry cli
npm -g i @sentry/cli
$ yarn
运行
新克隆的项目可能会抛出"未定义状态"错误。运行以下命令一次以解决该问题。
# 对于 Mac 和 Linux
$ UPGRADE_EXTENSIONS=1 npm run dev
# 对于 Windows
$ set UPGRADE_EXTENSIONS=1 && npm run dev
# 开发环境
$ yarn dev
# 预生产环境
$ yarn start
调试已打包的应用
# 在终端运行
$ "/path/to/OpenMTP.app/Contents/MacOS/OpenMTP" --remote-debugging-port=6363
- 打开 Chromium 浏览器
- 在地址栏输入 "about://inpsect"
- 添加新连接
localhost:6363
- 在端口
6363
检查 OpenMTP
使用 CI/CD 发布:
- CodeMagic.io
- 创建新应用(选择其他 -> 输入 Electron)
- 环境变量:
APPLEID
:<Apple 开发者账号用户名>
APPLE_APP_SPECIFIC_PASSWORD
:<应用特定密码>
- 登录你的 Apple 账号
- 前往 登录和安全 > 应用特定密码
- 点击 生成密码...,输入密码标签并点击 创建
- 复制显示的 应用特定密码
APPLE_TEAM_ID
:<Apple 团队 ID>
- 要获取团队 ID,请前往 Apple 开发者账号
- 然后点击"会员资格详情",你将在那里找到你的团队 ID。
SENTRY_URL
:https://sentry.io/
SENTRY_ORG
:<Sentry 组织名称>
SENTRY_PROJECT
:<Sentry 项目>
SENTRY_TOKEN_ID
:<Sentry 认证令牌>
- 在这里找到:认证令牌
- 作用域:
event:admin, event:read, member:read, org:read, project:read, project:releases, team:read
GITHUB_TOKEN
:个人访问令牌
- 有两个选项可用:
- 精细的个人访问令牌
- https://github.com/settings/tokens?type=beta
- 权限:
内容 - (读取和写入代码的访问权限)
- 个人访问令牌(经典)
- https://github.com/settings/tokens
- 作用域:
admin:gpg_key, admin:public_key, repo, user, workflow
- 有两个选项可用:
CSC_LINK
:- 钥匙串访问 -> 左侧菜单中的
默认钥匙串
-> 登录 -> 我的证书 - 在顶部搜索栏搜索
Developer ID Application
- 如果组织没有
Developer ID Application
的搜索结果,请从这里创建一个:Apple 开发者证书 - 按照这些步骤在本地机器上安装 Apple 开发者证书 获取用于 macOS 配置的 Apple 开发者 ID 证书
- 如果组织没有
- 在顶部搜索栏搜索
Developer ID Application
- 展开
Developer ID Application: <用户名> (XXXYYYZZZ)
- 检查私钥名称是否匹配:
Mac Developer ID Application: <用户名>
- 否则重命名私钥(右键点击 -> 获取信息)为
Mac Developer ID Application: <用户名>
- 关闭窗口
- 否则重命名私钥(右键点击 -> 获取信息)为
- 右键点击私钥 ->
Mac Developer ID Application: <用户名>
- 导出
Mac Developer ID Application: <用户名>
- 文件名:
CERTIFICATE_PRIVATE_KEY.p12
- 输入密码。这是
CSC_KEY_PASSWORD
,请记下 - 运行(如果你使用 fig 或 ohmyzsh,此步骤可能不起作用,请使用原始终端):
base64 -i CERTIFICATE_PRIVATE_KEY.p12 -o CERTIFICATE_PRIVATE_KEY.txt
- 复制
CERTIFICATE_PRIVATE_KEY.txt
文件的全部内容 - 将内容粘贴为
CSC_LINK
字段的值
- 钥匙串访问 -> 左侧菜单中的
CSC_KEY_PASSWORD
是上一步中的密码CODEMAGIC_AUTH_TOKEN_ID
:<CodeMagic API 令牌>
CODEMAGIC_INTEL_X64_WORKFLOW_ID_PROD
:<生产环境 codeMagic 工作流 ID>
- 从
codemagic.yaml
中找到相关的工作流 ID(通常是macos-intel-x64-build-prod
)
- 从
CODEMAGIC_INTEL_X64_WORKFLOW_ID_DEV
:<开发环境 codeMagic 工作流 ID>
- 从
codemagic.yaml
中找到相关的工作流 ID(通常是macos-intel-x64-build-dev
)
- 从
PUBLISH_PROD_REPOSITORY
:<用于发布生产应用的仓库>
PUBLISH_DEV_REPOSITORY
:<用于发布开发应用的仓库>
CODEMAGIC_PUBLISH_PROJECT_ID
:<Codemagic intel 项目 ID>
PUBLISH_EMAIL
:接收发布更新的电子邮件地址
- 参考:
本地打包和发布
设置 代码签名 以构建、本地打包和发布应用。
macOS 应用公证(非 macOS 构建请跳过此部分)
- 将 sample.env 文件重命名为 .env
- 在 .env 文件中更新
APPLEID
和APPLE_APP_SPECIFIC_PASSWORD
- 登录你的 Apple 账号
- 前往 登录和安全 > 应用特定密码
- 点击 生成密码...,输入密码标签并点击 创建
- 复制显示的 应用特定密码
- 运行
security add-generic-password -a "<apple-开发者账号用户名>" -w <应用特定密码> -s "APPLE_APP_SPECIFIC_PASSWORD"
- 登录您的Apple App Store Connect账户并接受所显示的条款和条件
- 状态应变为_活跃_
Sentry
npm install -g @sentry/wizard
sentry-wizard --integration electron
# 上传调试信息
# 每次升级electron.js版本时运行:
node sentry-symbols.js
sentry-cli login
打包 说明:https://www.electron.build/code-signing
$ export GH_TOKEN="<github token>"
# 针对本地平台
$ yarn package
# 针对多个平台
$ yarn package-all
技术特性
- 使用Electron v17和React v18构建
- 使用Loadables、动态reducer注入、选择器进行代码拆分和性能优化
- 热模块重载(HMR)以获得即时反馈
- 内置错误日志记录和配置文件/设置管理
- 行业标准状态管理
- JSS、SASS/SCSS样式
- 分配的端口:4642
配置
- _config/env/env.dev.js_和_config/env/env.prod.js_包含应用程序的端口号。
- _config/dev-app-update.yml_文件包含_electron-updater_所需的GitHub仓库变量。
- _config/google-analytics-key.js_文件包含Google Analytics跟踪ID。
- _package.json_的build.publish对象包含发布打包应用程序的值。
- _app/constants_文件夹包含应用程序所需的所有常量。
调试
调试指南
https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/400
从主进程分发redux操作
https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/118
https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/108
VM112:2 Uncaught TypeError: Cannot read property 'state' of undefined 错误
# 对于Mac和Linux
$ UPGRADE_EXTENSIONS=1 npm run dev
# 对于Windows
$ set UPGRADE_EXTENSIONS=1 && npm run dev
故障排除
您的设备未被识别
node-mac-permissions抛出Speech framework is not compatible with macOS < 10.15
- 在macOS <= 10.14.x (mojave)上,
yarn install
将抛出npm-rebuild错误 - 要在macOS mojave上"测试"或"调试"应用程序:
- 从
package.json
中移除node-mac-permissions
依赖 - 在文件
webpack/config.base.js
中的default.plugins
添加ignorePlugin行new webpack.IgnorePlugin({ resourceRegExp: /^(node-mac-permissions)$/u }),
- 警告:不要将这些更改提交到上游!!
- 从
NODE_MAC_PERMISSIONS_MIN_OS
常量定义了显示macOS使用访问权限弹出窗口所需的最低操作系统版本- 对于分发,请确保在至少10.15(Catalina)的机器上构建应用程序
- 如果您的设备未被检测到,请提出问题:https://github.com/ganeshrvel/openmtp/issues/new?template=contribute.md
尝试连接三星设备时应用程序变为空白
- 如果安装了Samsung SmartSwitch,请卸载:https://farazfazli.medium.com/how-i-reverse-engineered-keis-and-sidesync-and-fixed-mtp-8949acbb1c29,https://github.com/ganeshrvel/openmtp/issues/212。
公证Electron应用程序时抛出 - "You must first sign the relevant contracts online. (1048)" 错误
更多仓库
- npm: electron-root-path
- Electron React Redux Advanced Boilerplate
- Tutorial Series by Ganesh Rathinavel
致谢
-
特别感谢CodeMagic和Kevin Suhajda赞助他们的CI/CD虚拟机,使应用程序发布变得更加流畅和容易。🎊🎊 请查看他们的产品部分以了解更多。
-
感谢Ayushi Bothra女士为文档和页面做出贡献。
-
应用程序logo由Shubhendu Mitra贡献。请务必在Behance上查看他的更多作品。
-
感谢Vladimir Menshakov开发的android-file-transfer-linux(MTP旧版内核)
-
特别感谢@yennsarah、@h0tk3y、@riginoommen、@AjithKumarvm、@kiranshaji555、Dick Cowan、Kjell Dankert、Thorolf E.R. Weißhuhn以及所有其他帮助我测试应用程序的社区成员。
-
这个应用程序基于https://github.com/ganeshrvel/electron-react-redux-advanced-boilerplate构建,该项目是https://github.com/electron-react-boilerplate/electron-react-boilerplate的一个经过大量修改的分支。
-
应用程序中使用的图标由flaticon、good-ware和kiranshastry制作,遵循CC 3.0 BY许可。
-
"未找到图片"图标由Phonlaphat Thongsriphong制作。
贡献
如果您有兴趣修复问题并直接贡献代码,请参阅指南。
支持OpenMTP
帮助我保持应用程序对所有人免费开放。
- 通过PayPal支持我们:paypal.me/ganeshrvel
- 给我买杯咖啡(UPI、PayPal、信用卡/借记卡、网上银行):buymeacoffee.com/ganeshrvel
联系方式
如有任何问题,请随时通过ganeshrvel@outlook.com与我联系。
许可证
OpenMTP | Android File Transfer for macOS 根据MIT许可证发布。
版权所有 © 2018-至今 Ganesh Rathinavel