AndroidのスクショをMacに爆速転送するアプリを Rust + Tauri で作った
はじめに
「Androidでスクショ撮ったのに、Macに持ってくるのが面倒くさい」
Googleフォトの同期を待つ、自分宛にDMで送る、ケーブル繋いでMTPでコピー……どれも微妙にダルい。
そのストレスを解消するために、Hiyoko Shot を作りました。
USB または Wi-Fi で繋いでおくだけで、スクショを撮った瞬間に自動でMacへ転送されます。
この記事では、技術的な実装の面白いところをピックアップして紹介します。
アプリの概要
Hiyoko Shot はメニューバー常駐型のmacOSユーティリティです。
- 📱 AndroidのスクショをMacへ自動転送(USB / Wi-Fi対応)
- 🖼 ギャラリーUIでプレビュー・ドラッグ&ドロップ共有
- ⚡ ADB
exec-outを使った低オーバーヘッド転送 - 🦀 バックエンド: Rust、フロントエンド: React + Framer Motion、フレームワーク: Tauri

技術的なポイント
1. ADB exec-out による直接転送
Androidのスクショ転送で真っ先に思いつくのは adb pull ですが、Hiyoko Shotでは adb exec-out を採用しています。
adb exec-out screencap -p
adb pull はAndroid端末にファイルを一時保存してからPCへコピーするのに対して、exec-out はコマンドの標準出力を直接ホスト側にストリームします。
つまり:
| 方式 | フロー |
|---|---|
adb pull |
Android側に書き込み → 転送 → Mac側で読み込み |
exec-out |
直接ストリーム → Mac側で受け取り |
保存・転送・読み込みのオーバーヘッドを極限まで削減できます。
2. 5秒ポーリングによるインテリジェント監視
スクショの「撮った瞬間」を検知するために、ADBでAndroid側の /sdcard/DCIM/Screenshots/ を5秒おきに監視しています。
// 疑似コード
loop {
let current_files = list_screenshots_via_adb(&device)?;
let new_files = diff(&last_snapshot, ¤t_files);
for file in new_files {
transfer_file(&device, &file).await?;
}
last_snapshot = current_files;
sleep(Duration::from_secs(5)).await;
}
アプリがバックグラウンドに隠れているときはポーリング間隔を伸ばし、CPU/メモリ消費を最小化する低負荷モードも実装しています。
3. HEIC → JPG のリアルタイム変換
最近のAndroid端末はHEICで保存するケースがあります。Mac側で扱いやすいように、転送時にリアルタイムでJPGへ変換しています。
Rustの画像処理クレートを使い、転送パイプラインの中でシームレスに変換するため、ユーザーが意識することはありません。
4. Base64方式のギャラリー表示
TauriでフロントエンドからRust側の画像ファイルを表示するとき、ファイルパスをそのまま <img src> に渡す方法だと環境によって表示されないケースがありました。
解決策として Base64エンコードしてData URIとして渡す 方式を採用。
// Rust側
let bytes = fs::read(&image_path)?;
let base64 = general_purpose::STANDARD.encode(&bytes);
Ok(format!("data:image/jpeg;base64,{}", base64))
// React側
<img src={base64DataUri} alt="screenshot" />
環境に依存せず100%確実に表示できます。
5. ネイティブ ドラッグ&ドロップ
最重要機能です。
ギャラリーの画像をSlack・Discord・Finderへそのままドラッグ&ドロップできます。Tauriの startDrag APIを使い、macOSのネイティブなドラッグセッションを開始します。
Slackにスクショを貼るとき「ファイルを探してドラッグ」ではなく「ギャラリーから直接ドロップ」で済むのは、地味ながら毎日使うと体感が大きく違います。
6. Wi-Fi接続モード
USB接続で一度ペアリングした後、同じネットワーク内であればWi-Fiでも接続できます。ADB over TCP/IPを使っており、ケーブルなしでも自動転送が続きます。
# USB接続後にTCPモードへ切り替え
adb tcpip 5555
adb connect 192.168.x.x:5555
```

---
スタック まとめ
| レイヤー | 技術 |
|----------|------|
| バックエンド | Rust |
| フロントエンド | React + Framer Motion |
| フレームワーク | Tauri |
| ADB通信 | exec-out / TCP/IP |
| 設定永続化 | tauri-plugin-store |
| 画像変換 | Rustの画像処理クレート |
| UI | メニューバーポップオーバー(ダークモード対応)|
---
おわりに
「スクショをMacに持ってくる」という超ニッチな課題ですが、毎日使う人には刺さるツールだと思っています。
Tauri + Rust でネイティブ品質のmacOSアプリを作れる体験は非常に良く、特にADBとの低レベルな連携をRustで書けるのは気持ちいいです。
興味あれば使ってみてください🐤🌷
**Hiyoko Shot** は¥1,000 / $7の買い切りです。Android + Mac ユーザーの方はぜひ。
- 🇯🇵 日本円: https://hiyokoko.gumroad.com/l/hiyokoshot_jp
- 🌍 USD: https://hiyokoko.gumroad.com/l/hiyokoshot_en