2015年1月3日 星期六

adb: 手機平板連線傳檔必備工具

啟動除錯功能 你有沒有想過: 我的手機跟電腦距離十公分, 為什麼傳個檔案卻還需要用 e-mail 或 google drive 或 dropbox 繞一大圈上太平洋彼岸的雲端再繞回來? 電腦跟 android 手機或平板之間傳送/拷貝/複製檔案最私密的方式, 應該是直接 usb 連線的 adb 才對。 接上 usb 線, 任何廠牌的 android 手機/平板都可以用, 而且手機/平板那一頭不必安裝任何軟體。 此外, 跟 「把手機當成隨身碟讓電腦掛載」 比起來, adb 用起來也更安全。 我曾經把手機當成隨身碟掛載, 然後忘記安全移除, 最後毀了手機、 必須重新刷機 orz。 至於 adb, 如果傳輸過程當中拔除 usb 線, 大不了就只是有些檔案傳遞失敗而已。 又例如 adb 可以 scrcpy 可以透過 adb 把手機投影到電腦上, 連影片也能看!, 這是很多學科老師都用得到的實用功能啊, 怎麼會是開發者的特權呢! 這根本就是人人適用、 電腦出廠時理應預設的工具! 另外, 如果你跟我一樣得了一種沒有命令列就會死的病, 那麼更應該安裝 adb, 因為這個 android 原生的工具直接就可以讓你連進手機/平板的 shell, 不需要安裝 ssh server!

[2016/8/9 補充] 如果只是要傳檔, 改推薦不必 usb 線, 僅需要 wifi 區網的 primitive ftpd 無線傳檔!

使用之前最重要的第一步, 是克服心理障礙。 adb 全名是 android debug bridge。 不要被名字 (還有等一下的畫面跟訊息) 給嚇到了, 以為這是工程師才准用的。 廠商嚇唬你, 說 root 刷機很危險, 其實是想從你手中奪走最高控制權。 同樣地, 把這個好用工具歸類為開發者專用的目的, 其實只是要強迫你改用 Media Transfer Protocol 之類的弱雞協定、 實現 (android 上面不太嚴格的) 遙控數位枷鎖 DRM 而已。 此外, 使用 adb 並不需要 root 或刷機、 當然也更簡單更零風險。 貴哥向你保證: 允許自己對自己的手機使用 adb, 就跟允許自己把家裡的物品自由搬動/搬進搬出一樣安全。 (移動碗盤家俱不小心也會撞破啊! 你會因此而請警察代勞嗎? 就算不必花錢?) 如果你限定自己只用 adb push 與 adb pull 這兩個傳檔指令 (下詳), 那更是沒有問題。 重點是你搬了什麼檔案進來? 不要隨便把爆裂物 (惡意軟體) 搬進來就好。

給自己冠上開發者的頭銜 好的, 那就勇敢地進入 android 手機的 「settings」 最下面的 「about phone」 最下面的 「Build Number」, 按七下。 慢慢按, 每看到一次訊息就告訴自己: 「傳檔案不該是 developer 的特權! 這手機是我的財產, 我當然有權任意處置! (握拳) 至於我要不要真的寫程式? 以後再說。」

回到 「settings」 選單, 會多出一個 「{} Developer options」 選項。 點進去, 找到 「usb debugging」, 勾起來, 按 「OK」 確認。 (如第一張圖) 完全安全的, 沒問題。 但是基於安全考量, 建議不要勾選 「ADB over network」! 勇敢的人可以看這篇: 透過 wifi 無線網路用 adb 操控手機, 但這會讓你的 android 手機變得 跟 iPhone 一樣曝露在 wifi 入侵風險之中

在 linux 電腦上, 首先安裝 adb 工具: apt install android-tools-adb 。 至於 Windows 請見 這裡這裡

其次下 lsusb 指令, 查看所有 usb 裝置。 接著把手機跟電腦用 usb 線接起來, 再下一次 lsusb , 看多出來的那一列資訊。 例如我的新手機是 essential ph 1, 所以多出一列 Bus 001 Device 006: ID 2e17:c032 其中的 2e17 是廠商代號 (vendoer ID) , c032 是手機型號 (product ID)。 又例如我的舊手機 nexus 的代號是 18d1:4e22 。

再來用 root 的身份下載一個系統設定檔: wget -O /etc/udev/rules.d/51-android.rules https://raw.githubusercontent.com/M0Rf30/android-udev-rules/master/51-android.rules 這裡面記載著各家廠牌及各種型號手機的代號。 請確認其中包含你的手機的代號。 但是! 直接字串搜尋未必找得到, 例如在該檔案當中, 用 c032 無法找到我的 essential ph 1 , 但其實 linux 是有支援它的, 因為與它相關的那兩列是:

ATTR{idVendor}!="2e17", GOTO="not_Essential"
ATTR{idProduct}=="c03[02]", SYMLINK+="android_adb"

關於 udev 的設定檔, 詳見 android-udev-rules CyanogenMod 網頁備份

然後要叫 udev 重讀設定檔。 比較簡單的方式是電腦重開機。 或是:

  1. sudo udevadm control --reload-rules
  2. sudo adb kill-server
  3. 拔掉 usb 線、 再重新插入。

以上參考 這個問答

允許這部電腦 再來用 usb 線連接電腦與手機, 並且 以普通人的身份 下: adb shell cat /proc/cpuinfo 這時手機上會出現如右圖的訊息: 「允許 (這部電腦) 透過 usb 對你的手機除錯嗎?」 仔細想想, 這完全沒有具體防護措施。 這可以防範 BadUSB 偽充電器劫持。 既然這是我自己的電腦, 那就勾起來, 按 OK 就對了。 如果電腦等太久, 被手機拒絕, 可以再下一次相同指令, 應該會看到第一列顯示手機採用 arm 系列的 CPU 或是像我的 nexus s 舊手機刷成 cyanogenmod, 所以可以下: adb shell uname -a 並且會看到 Linux localhost 3.0.101-Cyanogenmod-g7421011 #1 PREEMPT Fri Jan 31 20:36:27 PST 2014 armv7l GNU/Linux 注意作業系統的名稱跟硬體類型: 這顯然是手機而不是電腦。 成功連線!

(電腦麻瓜可略過本段) 順便一提: 訊息當中的 「RSA key fingerprint」 從資訊安全的角度來看, 比較像是 加密 e-mail 時所用到的 GPG 金鑰 的公鑰部分, 是一個 「方便他人與你秘密聯絡」 的公開資訊, 比較不像是 (需要視為個資保護的) 身份證字號, 所以貴哥敢大方地展示。 (你的手機要拿來讓我 debug 嗎 ^_^) 這個數字是如何產生的呢? sed 's/ .*//' ~/.android/adbkey.pub | openssl base64 -A -d -a | openssl md5 -c 另一個私密的 ~/.android/adbkey 如果被偷了, 壞人就有可能騙你的手機信任 (偽裝成你的電腦的) 惡意電腦。 詳見 這篇

如果以普通用戶身份下 adb 指令失敗, 但以 root 卻成功, 那就是權限的問題。 可以用 root 的身份 把 ckhung 加入一個 「可以存取隨插即用裝置」 的特權群組 "plugdev": gpasswd -a ckhung plugdev 登出再登入以後就可以用普通用戶身份執行 adb。 此時會再被問一次是否允許 (因為剛剛被允許的是 root 的 adbkey.pub 而現在則是 ckhung 的) 再次勾選 「Always allow from this computer」 並點一下 OK 即可,

從此以後你就可以 (用這位普通用戶的身份) 從電腦裡 下 adb pushadb pull 這兩個指令自由傳檔啦! 如果你沒興趣探索手機、 如果你只關心自己的資料檔的話, 基本上你最常存取的會是 /sdcard 底下的檔案。 例如要把手機所拍的相片檔跟影片檔全部抓到電腦的 ~/photos/ 底下, 可以這樣下: mkdir ~/photos ; adb pull /sdcard/DCIM/Camera/ ~/photos (你的手機的路徑跟我的可能不太一樣。) 注意: Camera 後面一定要有 / 才會遞迴複製子目錄、 孫目錄。 又例如要把電腦的 ~/music/ 底下的所有音樂檔放入手機的 /sdcard/Music/ 底下, 可以這樣下: adb push ~/music /sdcard/Music/ 。 傳檔過程會剝掉一層目錄。 拿一個 [裡面只含三四個檔案] 的目錄測試一下, 就知道我的意思。

另一方面, 那些跟我一樣不怕把手機玩壞的讀者, 就直接 adb shell 進入手機的命令列開始探索吧! 打開這個溝通管道之後, 你可以 從電腦打字傳簡訊 把手機變身成實物投影機、... 做很多好玩的事。

用 「adb 傳檔」 可以搜尋到更多教學文:

  1. 阿舍的隨手記記
  2. H's 手札
  3. GiveMePasS's Android惡補筆記
  4. 史丹利部落格
  5. ...

至於貴哥所寫的這一篇, 主要的目的是做心理建設 ^_^ 還有為下一篇舖路 -- 長得有點像 ftp 或 winscp 的 圖形介面 android 傳檔工具 aafm!

5 則留言:

  1. 請問通過網路的adb的安全性問題嚴重嗎?
    網路上透過android的shell連上adb的方法:
    http://stackoverflow.com/questions/2604727/how-can-i-connect-to-android-with-adb-over-tcp
    http://forum.xda-developers.com/showthread.php?t=623828&page=3
    也有app可以自動完成上列事項:adbWireless(in f-droid)

    回覆刪除
    回覆
    1. 啊, 謝謝提醒! 已加入連結指向另一篇: http://newtoypia.blogspot.tw/2015/03/wifi-adb.html [透過無線網路 wifi 用 adb 操控手機]

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 上述Windows的adb工具連結已失效,煩請修正。

    回覆刪除
  4. ok 已更新,放兩個連結好了

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。