如何調試 Android 上 HTTP(S) 流量

jopen 9年前發布 | 37K 次閱讀 Android Android開發 移動開發

前面的話

在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寫的。對了,我說了它是完全免費的這件事了嗎?

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

$ mitmproxy [-b IP_ADDR] [-p PORT]

  • 1
    </div> </td>

    $ mitmproxy [ - b IP_ADDR ] [ - p PORT ]
    </div> </td> </tr> </tbody> </table> </div> </div>

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

    代理設置App: “Proxy Settings”

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

    1. 進入Android的Wi-Fi設置
    2. 長按當前連接的網絡
    3. 選擇“修改網絡”選項
    4. 勾選“顯示高級選項”
    5. 啟用代理服務器并將代理設置為“手動”
    6. 輸入之前設置好的的IP地址和端口。
    7. </ol>

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

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

      </div>

      如何調試 Android 上 HTTP(S) 流量Proxy Settings 的使用截圖
      </div>
      </div>

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

      就這么簡單,對了,它還不需要root權限哦?

      那如何調試 HTTPS?

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

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

      $ mitmproxy -a IP_ADDR -p PORT —-no-upstream-cert

      1
      </div> </td>

      $ mitmproxy - a IP_ADDR - p PORT- no - upstream - cert
      </div> </td> </tr> </tbody> </table> </div> </div>

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

      調試3G/4G

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

      1. 一臺可以連接3G/4G網絡的Android手機
      2. 一臺開啟了“開發者模式”的手機(另一臺了)
      3. 你的筆記本電腦
      4. </ol>

        接下來的步驟就簡單啦:

        1. 在第一臺手機上激活“移動熱點”功能
        2. 將你的筆記本電腦和第二臺手機(“開啟了開發者模式”)連上移動熱點
        3. 在筆記本電腦上啟動 mitmproxy,并將IP地址設為hotspot所對應的(通常是192.168.43.xxx 之類的)
        4. 在第二臺手機上使用Proxy Settings設置代理
        5. </ol>

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

          總結

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

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

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

          本文翻譯自音樂App musiXmatch 公司高級Android工程Sebastiano Gottardo。原文地址:https://medium.com/@rotxed/how-to-debug-http-s-traffic-on-android-7fbe5d2a34

          </div> </div> 來自:http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/

       本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
       轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
       本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色