ByteScope

Android Photo Transfer

只靠一條 USB 線把整個相簿備份下來、翻看手機的儲存空間,也能把檔案送回手機——兩端都不用安裝東西。

檔案只在手機和這個分頁之間走 USB 線。手機上不會安裝任何東西,也不會上傳到任何地方。

正在檢查瀏覽器支援…

關於這個工具、FAQ 與相關工具

關於這個工具

把 Android 用 USB 接上 Chromium 系瀏覽器,這頁就能讀它的儲存空間:相簿與其他媒體資料夾,依每個檔案的拍攝日期分組,大小與日期直接來自檔案系統。勾好要的東西,它會一邊組一邊寫進磁碟成為 ZIP,或是一個一個存下來。同一頁也能一層一層翻手機其他目錄,並把檔案往反方向送回去。手機上不會安裝任何東西,也不會上傳到任何地方——這只是一個靜態頁面透過線材跟 adbd 對話,關掉分頁就結束了。

為什麼抓照片用 ADB 比 MTP 可靠

把手機接上電腦、選「檔案傳輸」時走的是 MTP——2008 年為相機設計的協定,每一次檔案操作都要跟手機維護的資料庫來回一趟,而且沒有真正的檔案 handle。實際結果就是大家都很熟的那些症狀:資料夾顯示的張數不對、複製 3000 個檔案到 1700 個就無聲停住、縮圖把檔案總管卡死、同一條線同一批位元組的影片速度只有 ADB 的十分之一,還有非得拔插一次電腦才重新看得到手機。ADB 的 sync 協定小得多:開一條串流、講一個路徑、收位元組。它讀的是檔案系統而不是媒體資料庫,所以列出來的就是真的在那裡的東西;失敗時它會指名是哪個檔案失敗,而不是整批停下來。

scoped storage 並不會擋 shell 讀 DCIM

從 Android 11 起,*app* 沒有特殊權限就讀不到共用儲存空間裡其他 app 的檔案,這也是為什麼很多檔案管理與備份 app 變難用。但 ADB shell 不是 app:它以 shell 這個使用者身分執行,對主要共用磁碟區握有很大的讀取權限,所以 /sdcard/DCIM/sdcard/Pictures/sdcard/Movies/sdcard/Download 透過線材讀起來跟以前一樣。這頁能成立就是靠這件事。scoped storage 真正關上的那扇門是 /sdcard/Android/data,也就是 app 自己的私有檔案——那不是這頁在讀的地方;Storage Analyzer 有去碰的時候,也明白寫著 shell 在那裡讀不讀得到會隨版本與廠牌而異。

streaming ZIP 是什麼,為什麼不能在記憶體裡組

相簿動輒幾十 GB。任何「全部打包下載」卻先在瀏覽器把檔案收起來的做法,等於默默承諾要把全部塞進分頁的記憶體,遇到真手機就不可能撐住。所以這裡的做法是反過來的:照片以小塊從手機讀出,每一塊直接進壓縮編碼器,編好的每一塊又直接寫進你在傳輸開始前指定的磁碟檔案。不管總量多少,尖峰記憶體都只有幾百 KB。這個設計在畫面上留下兩個痕跡。壓縮檔是**儲存**而非壓縮——JPEG 與 H.264 本來就壓過了,再 deflate 一次只是花手機的時間換不到 1% 的縮減。另外,傳統 ZIP 的大小與位移都是 32 位元欄位,所以超過大約 4 GB 的選取會切成編號的多份,而不是變成「這台電腦打得開、換一台就說壞檔」的壓縮檔;單一檔案大到任何壓縮檔都裝不下時,就以原本的檔名寫在旁邊。要直接寫磁碟得靠 File System Access API,它只有 Chromium 系有,而且必須在點擊時詢問存放位置;沒有的時候這頁會改成一個一個存並講清楚,而不是偷偷改成在記憶體裡組 ZIP。

縮圖真的會吃傳輸量,所以預設關閉

手機上沒有這頁能用的縮圖:Android 把自己的預覽放在 app 私有的快取裡,shell 碰不到,而 sync 協定也沒有辦法只要一張解碼後圖片的一部分。所以「預覽」就等於把原檔整張拉過來——1200 萬像素一張 3 到 5 MB,4800 萬像素超過 10 MB,一個畫面十二張就是幾十 MB 走過那條線。因此相簿一開始就是關圖片的省流模式,捲到可視範圍才載入、同時最多三張、絕不預先抓、對已解碼縮圖保留量設上限,並持續顯示預覽到目前為止花掉多少。HEIC 會列出來但不預覽,因為桌面瀏覽器解不了那個格式。

這頁不會刪掉手機上任何東西。這套工具的刪除歸 Storage Analyzer 負責,而且只限它的掃描器找出來的目標——這裡沒有自由路徑刪除,也沒有任何路徑能走到那裡。相對地,把檔案送上手機確實改變了手機,所以它走的是這一家族同一套警告級確認,寫入之前先把確切的目標路徑一條條列出來。從這裡往下走:Web ADB 首頁有裝置儀表板與其他工具,Storage Analyzer 告訴你是什麼佔滿了手機,APK Installer 則負責把軟體往反方向送。

常見問題

怎麼一次把 Android 上所有照片抓到電腦?

先在手機開啟 USB 除錯並接上,讓這頁掃過媒體資料夾,然後用「這天之後全選」挑一個日期(或直接全選),按「選資料夾並開始」。你只要選一次電腦上的資料夾,這批檔案就會一邊從手機讀出、一邊以一個或多個 ZIP 寫進那個資料夾。大到壓縮檔裝不下的檔案,會以原檔放在同一個資料夾。如果瀏覽器沒有 File System Access API(也就是 Chrome、Edge 之外的非 Chromium 系),這頁會退回一個一個存:能用,但比較慢,而且每個檔案有大小上限。

備份 60 GB 照片會不會把瀏覽器記憶體吃爆?

不會,因為壓縮檔從來沒有留在瀏覽器裡。每個檔案以小塊讀出,每一塊直接餵給 ZIP 編碼器,編碼器的輸出又直接寫進磁碟上的檔案——不管備份是 600 MB 還是 60 GB,分頁同一時間只握著幾百 KB。真正存在的限制是 ZIP 格式本身:傳統壓縮檔只能定址 4 GiB,所以大批選取會切成編號的多份,而單一檔案超過這個大小時會以原檔名複製在壓縮檔旁邊,而不是硬塞進去弄壞。

為什麼有些資料夾看不到,像 WhatsApp 的媒體或 Android/data?

相簿檢視只會去探一份固定清單裡的知名媒體資料夾——DCIM/Camera、Screenshots、Pictures、Movies、Download,加上幾個常見通訊 app 的路徑——存在的才顯示,因為在一支塞滿的手機上遞迴走完整個 `/sdcard` 光來回就要好幾分鐘。不在清單上的資料夾,可以用「瀏覽」分頁,那裡你輸入任何目錄都能列。`/sdcard/Android/data` 是另一回事:那裡放的是 app 私有檔案,shell 能讀到多少在 Android 11 改過,而且各廠牌不一樣,所以這頁不會假裝自己涵蓋了它。

檔案推上手機了,但相簿看不到,怎麼辦?

檔案已經在磁碟區上了,只是還沒進 MediaProvider 的資料庫,而相簿類 app 讀的是那個資料庫而不是檔案系統——這就是為什麼檔案管理 app 馬上找得到、Google 相片卻沒有。推完之後這頁會廣播 `MEDIA_SCANNER_SCAN_FILE` 去推一下掃描器,並把廣播回的內容原樣印出來;但這個 intent 在 Android 10 已標為棄用,有些廠牌直接忽略。真的沒效時,誠實的做法是用檔案管理 app 把那個檔案打開一次(通常就會被建索引),或者重開機讓系統重新掃過共用儲存空間。