Android Emulator 26.0.3 の IPv6対応


サマリ

ほどほどに動くけど、いろいろ惜しい。

  • Android Emulator 25.3 からIPv6をサポート。Google配布の仮想デバイス (AVD: Android Virtual Device) イメージでは、IPv6はデフォルトON
  • http://test-ipv6.jp/ へのアクセスで 10/10 点が出る程度には動く。
  • エミュレータのホストOSがIPv6接続があれば、仮想デバイスから設定なしでIPv6接続ができた。
  • AVDにサイトローカルIPv6アドレス (fec0::ほげほげ/64) が割り当てられる。
  • AVDにグローバルスコープのIPv6アドレスがないのでIPv4優先で接続する。
  • 外部接続はサイトローカルIPv6アドレスをNAPT66する仮想ルータを通じで出ていく。

はじめに

2017年2月の Android Emulator 25.3 からIPv6がサポートされた。リリースノートによると

Initial IPV6 support.

と、まだ微妙な表現ではあるが、サポートしたと書いてある。実際に動かした例を見たことがなかったので

やってみた

環境

  • Android Studio 2.3.3
    • Android Emulator 26.0.3

Android Studio の 設定 (Preference -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools) から執筆時点で最新のAndroid Emulatr 26.0.3 を入れた。

AVD (Android Virtual Device) に付与されたIPv6アドレスの確認

AVD設定

  • Nexus 6P (x86)+ Android 7.1.1 (Google APIs)
  • root設定が簡単にできる、非Google Play版のイメージを選んだ

起動してみると、IPv6アドレスはサイトローカルアドレスがついていた。

host# adb root
host# adb shell
generic_x86:/ # ifconfig
eth0      Link encap:UNSPEC
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope: Link
          inet6 addr: fec0::5054:ff:fe12:3456/64 Scope: Site

ブラウザで外部アクセス

Chrome および WebView Browser Test を立ち上げて、http://test-ipv6.jp/ へアクセスすると、AVDにサイトローカルアドレスがついていることに対する警告は出るが、一応10/10点。IPv6インターネットアクセスにはQEMUが提供する仮想ルータがNAT変換を行っており、Webサーバから見ると、ホストOSのIPv6アドレスが見える。

次に、IPv6 only の https://ipv6.google.com/ へもサイトローカルアドレス+NAPT66でアクセスOK

しかし、宛先がデュアルスタックだとIPv4優先になってしまう。これはグローバルスコープのアドレスがないため。http://test-ipv6.com/ でIPv6/IPv4どちらが優先かテストの結果。

Android Emulatorが利用するQEMUの実装状況

Android EmulatorはQEMUを使っており、AVDを収容する仮想ネットワークはユーザモードネットワークと呼ばれるQEMUのソフトウェア機能で実現されている。QEMU自体は、IPv6にも対応しているが、現時点での実装では仮想ネットワークに割り当てるIPv6アドレスのデフォルトがfec0::/64、外部接続はNAPTとなっている。下図はQEMUのドキュメントにIPv6設定を加筆したもの(赤字部分)。

まとめ

  • グローバルアドレス再配布の仕組みはなく、またULAではなくサイトローカルアドレスを使っている
  • NPTv6でなくてNAPTを使っている。

など、QEMU実装由来のおかしなところはあるが、新たにIPv6アドレスを取得したり、特別な設定をすることなくIPv6接続が使えるのは開発者によっては手軽で、ローカルアドレスとNATのメリットかも知れない。