mitmproxyでAndroid Studioのエミュレーター上で動作するアプリの通信内容を確認する

フリーのHTTPSプロキシツールであるmitmproxyでAndroid Studioエミュレーターの通信内容を確認できるようにする。

確認に使用したAndroid Studioのバージョンは以下の通り。

Android Studio Dolphin | 2021.3.1 Patch 1

1. mitmproxyのインストール

MacでHomebrewが入っている場合は以下のコマンドでインストールできる。

brew install mitmproxy

その他の環境でのインストールはこちら

インストールしたら以下のコマンドで起動する。

mitmproxy

2. プロキシ設定

Android StudioのPreferencesの Tools > Emulator で下の赤枠のチェックボックスのチェックを外す(これをしないとエミュレーターでプロキシ設定のメニューが表示されないため)。

次にエミュレーターを起動させ、[...] をクリックする。

Settings > Proxy を開いて以下の設定を行う。

  • Use Android HTTP proxy settings のチェックを外す。
  • Manual proxy configuration を選択して以下の内容を指定する。
項目
Host name PCのIPアドレス
Port number 8080

3. 証明書のインストール

エミュレーターのブラウザでmitm.itにアクセスする。

"If you can see this, traffic is not passing through mitmproxy." のようなメッセージが表示される場合は、プロキシ設定を見直す。

赤枠のAndroidの証明書をクリックする。

クリックすると証明書のインストール画面が表示される。

以下の内容で設定を行い、OKをクリックする(これで証明書がインストールされる)。

項目
Certificate name mitmproxy
Credential Use VPN and apps(デフォルトでOK)

4. コードの変更

Android 7以降はデフォルトではユーザー証明書は使用できない。そのため、アプリ側の設定を変更する。

  • ディレクトapp/src/main/res/xmlを作成する。
  • 上のディレクトリにnetwork_security_config.xmlという名前で以下の内容のXMLファイルを作成する。
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <!-- Additionally trust user added CAs -->
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>
  • app/manifests/AndroidManifest.xml (debug) のapplicationタグの中に以下のように属性android:networkSecurityConfig="@xml/network_security_config"を追加する。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.cookpad.android.storetv">

    <application android:networkSecurityConfig="@xml/network_security_config">
    <!-- 省略 -->
    </application>
</manifest>

上記の方法だとアプリごとに設定を変更する必要があるが、それを避ける方法もある(ここでは説明しない)。

5. ビルドして確認

ビルドしてエミュレーター上でアプリが立ち上がると、mitmproxyを起動しているターミナルで通信が確認できるようになっている。