2015年1月3日 星期六

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

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

[2016/8/9 補充] 如果只是要傳檔, 改推薦更簡單的 primitive ftpd 無線傳檔!

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

[2016/4/24 建議製作 中文版 finnix 開機光碟/隨身碟, 用它開機, 就可以省略下面設定, 直接開始使用 adb shelladb pull /sdcard/檔案 等等指令。]

再來, 請在你的電腦上安裝 adb 工具。 Windows 請見 這裡這裡; Debian 系列 (含 ubuntu 及 antix 等等) 的 linux 請 (用 apt-get install 指令) 安裝 android-tools-adb 套件。 如果你是真正的工程師, 可以考慮改安裝 完整的開發環境 之類的。 (或是自由軟體替代品? 還沒研究...)

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

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

允許這部電腦 然後用 usb 線連接電腦與手機。 再 以 root 的身份 下: adb shell cat /proc/cpuinfo 這時手機上會出現如右圖的訊息: 「允許 (這部電腦) 透過 usb 對你的手機除錯嗎?」 理論上只應允許你自己的或你所信任的電腦執行 adb; 不過仔細想想, 這完全沒有具體防護措施。 (假設你並未勾選 「ADB over network」 的話) 其實重點根本不是 「是否允許」; 真正重要的問題是 「手機在誰手上?」、 「誰在使用 adb 對你的手機動手動腳?」 所以, 如果這是你所信任的電腦, 勾起來, 按 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 詳見 這篇

但是 「以 root 的身份做日常瑣事」 並不是個好習慣。 所以接下來要在電腦上把 「存取手機」 的權限開放給你自己常用的一般帳號 (以下拿我自己的 ckhung 為例)。

  1. 把 ckhung 加入一個 「可以存取隨插即用裝置」 的特權群組 "plugdev": gpasswd -a ckhung plugdev
  2. lsusb 查看你的手機製造商的代號。 例如我 (以 usb 連線) 的手機呈現: Bus 002 Device 007: ID 18d1:4e22 Google Inc. Nexus S (debug) 所以製造商代號就是 18d1。
  3. 編輯 (可能原先不存在的) 文字檔 /etc/udev/rules.d/51-android.rules 並且加入一句: SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0664", GROUP="plugdev" (全部貼在同一列) 其中手機製造商代號請換成你自己查到的(四位數)十六進位數字。 這句話允許特權群組 "plugdev" 存取 google 所推出的所有 usb 裝置。
  4. 重新開機

(以上摘要自 Cyanogenmod 的 udev 文件 [映射]; 其實可以直接把那一頁的所有廠商代號列表直接剪貼到 /etc/udev/rules.d/51-android.rules 裡面去, 裡面已經涵蓋絕大多數大廠。) 這次再 以普通用戶 ckhung 的身份adb shell cat /proc/cpuinfo 又會被問一次是否允許 (因為剛剛被允許的是 root 的 adbkey.pub 而現在則是 ckhung 的) 再次勾選 「Always allow from this computer」 並點一下 OK,

從此以後你就可以 (用這位普通用戶的身份) 從電腦裡 下 adb pushadb pull 這兩個指令自由傳檔啦! 如果你沒興趣探索手機、 如果你只關心自己的資料檔的話, 基本上你最常存取的會是 /sdcard 底下的檔案。 例如要把手機所拍的相片檔跟影片檔全部抓到電腦的 ~/photos/ 底下, 可以這樣下: mkdir ~/photos ; adb pull /sdcard/DCIM/Camera ~/photos (你的手機的路徑跟我的可能不太一樣。) 又例如要把電腦的 ~/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 已更新,放兩個連結好了

    回覆刪除