如何除錯 Android 上 HTTP(S) 流量

發表於2015-01-30

前面的話

在Android開發中我們常常會和API 打交道,可能你不想,但是這是避不開的。大部分情況下,除錯傳送網路請求和接收響應的過程都是十分痛苦的。

有多少次我們經過除錯發現API的呼叫失敗僅僅是因為我們的編碼錯了或者丟失了一個HTTP頭部引數?在除錯的過程中,我們發現出現錯誤的原因千奇百怪。總之我們要看到最終的請求是什麼樣子的不是一件容易的事情,響應也是如此。

如果碰到困難,請使用代理

解決這樣的問題有各種各樣的方法和門道,但是我今天要分享的是在我看來最快,最容易也是最可行的方法。

由於除錯HTTP請求和響應是相當繁瑣的(除錯HTTPS更加繁瑣),因此在這種前提下你能使用的最好工具就是代理。當然,你肯定知道什麼是代理,所以我就不囉嗦它的定義了。

現有的代理工具中它們的用法,特性以及作業系統的相容性都各不相同,如何選擇一款合適的代理呢?要我說,簡單點,就用mitmproxy。

mitmproxy

我已經無法用語言來形容mitmproxy的方便和強大了。用mitmproxy 官網上的介紹一句話,就是“an interactive, SSL-capable man-in-the-middle proxy for HTTP with a console interface”。沒錯,你可以通過控制檯來操作它;沒錯,它還支援HTTPS;沒錯,它允許“對流量進行攔截,檢測,修改和回放”;沒錯,它還是跨平臺的,因為它是用Python寫的。對了,我說了它是完全免費的這件事了嗎?

使用它也是相當容易的。一旦你安裝了它,便可通過在控制檯輸入以下命令啟動它:

代理已經在執行,你可以開始攔截網路流量了。接下來你就需要配置Android手機,將所有的流量都重定向到之前命令裡設定的代理伺服器地址上去(IP_ADDR + PORT)。

代理設定App: “Proxy Settings”

現在我們需要在Android手機上進行代理配置。具體步驟如下:

  1. 進入Android的Wi-Fi設定
  2. 長按當前連線的網路
  3. 選擇“修改網路”選項
  4. 勾選“顯示高階選項”
  5. 啟用代理伺服器並將代理設定為“手動”
  6. 輸入之前設定好的的IP地址和埠。

如果要禁用代理同理。現在Android端的設定就大功告成了。

是不是覺得上面的步驟有點頭疼?不急!幸虧還有Proxy Settings 這個App。用了Proxy Settings,上面繁瑣的步驟就變得異常簡單了。有了這個輕量級的App,你只需輕輕一點,便可輕鬆地開啟或禁用網路連線裡的代理設定。

通過Proxy Settings ,你可以建立多個代理配置。當你想要啟用其中一個,只需點選當前連線的網路,啟用代理,並選擇你需要的配置。如果你要禁用代理,點選連線,並禁用它。

就這麼簡單,對了,它還不需要root許可權哦?

那如何除錯 HTTPS?

正如前面所提到的,mitmproxy還支援HTTPS攔截。這個特性讓你在保持API endpoint 不變的情況下除錯生產環境裡的API變得異常方便。然而由於HTTPS的工作方式,我們需要安裝一個自定義的SSL證照,讓mitmproxy對所攔截的流量進行解密。

聽起來HTTPS攔截的步驟好像有點麻煩,其實很簡單。你只需按照mitmproxy官網的這篇設定指南便可輕易地完成設定。記得在啟動mitmproxy的時候需要額外新增一個引數,如下命令所示:

不過此處還有個小問題。Android是以一種加密的形式來儲存SSL證照的,而這種加密的形式即使用者設定的手機解鎖資訊。也就是說,你在Android上安裝任何SSL證照之前,系統都會提示你設定解鎖手機的方式,比如輸入PIN碼,密碼或者是某種圖案。

除錯3G/4G

3G/4G這種情況下設定代理更難了。系統設定中沒有為3G/4G連線提供代理設定介面。但是!你可以通過你的手機“移動熱點”功能來實現在3G/4G這種情況下設定代理。你要準備的就是:

  1. 一臺可以連線3G/4G網路的Android手機
  2. 一臺開啟了“開發者模式”的手機(另一臺了)
  3. 你的膝上型電腦

接下來的步驟就簡單啦:

  1. 在第一臺手機上啟用“移動熱點”功能
  2. 將你的膝上型電腦和第二臺手機(“開啟了開發者模式”)連上移動熱點
  3. 在膝上型電腦上啟動 mitmproxy,並將IP地址設為hotspot所對應的(通常是192.168.43.xxx 之類的)
  4. 在第二臺手機上使用Proxy Settings設定代理

OK,在3G/4G這種情況下設定代理就是這樣子的。

總結

到目前為止,我還試過其他兩種代理工具,CharlesFiddler。 但是mitmproxy完爆他們兩個。Charles 可能是在功能,靈活性以及作業系統支援這幾個方面和mitmproxy最接近的,但是它一不免費,二不開源。 對於 Fiddler, 它只能在Windows平臺上使用。

mitmproxy + Proxy Settings 的結合讓我省了不少心,我希望它們也能為你所用。

如果你有更好的解決方法,記得告訴我。☺

UPDATE:有同學反應對這個工具到底怎麼使用不是很清楚,於是我打算在本文基礎上再增加一些實踐相關的文字,後來發現篇幅過於臃腫,乾脆新寫了一篇關於mitmproxy實踐的文章,希望能給大家一些啟發。

相關文章