Android Emulatorの/etc/hosts書き換え

投稿日:  更新日:

Androidエミュレータがブート時に用いるシステムイメージは、デフォルトで読み出し専用イメージです。

Androidシステムの起動後に、システムに深く関連するディレクトリやファイル(例えば、/etc/hosts)の書き込み(または書き換え)は出来ません。読み出しは出来ます。

書き込みを行いたい場合は、書き込み可能イメージを作成して、そのイメージをブートで用います。

書き込み可能イメージは、エミュレータの起動オプション「-writable-system」の指定で作成可能です。

Android StudioのDevice Managerからエミュレータを起動できますが、Android Studioは起動オプションを指定出来ません。昔は出来ていたと思うのですが…

ですので、ここではAndroid Studioは使わずに、ターミナル等のコマンドラインからエミュレータを起動しています。

※環境:Android Studio Otter | 2025.2.1
    Android emulator version 36.2.12.0
    Google APIs Inten x86 Atom System Image

スポンサーリンク

/etc/hostsの書き換え

API 28を境界に、書き換え方法が異なります。確認付きブート(後述)が生成するエラーの扱い方が違うためです。

API≦28

hostsの書き換えは、以下の手順で行います。

> emulator -writable-system -avd AVD名 &   # 書き込み可能イメージで起動
INFO         | Android emulator version 36.2.12.0 (build_id 14214601) (CL:N/A)
...
WARNING      | System image is writable
...
### 起動を待つ

> adb root                             # root権限でエミュレータへ接続
restarting adbd as root

> adb remount                          # ストレージを再マウント
remount succeeded

> adb pull /system/etc/hosts           # hostsをローカルへ読み出し
/system/etc/hosts: 1 file pulled, 0 skipped. 0.0 MB/s (56 bytes in 0.012s)

> vi ./hosts
### hostsを修正(ここではviを使用、お好みのエディタを使って下さい!)

> adb push ./hosts /system/etc/hosts   # hostsをエミュレータへ書き込み
./hosts: 1 file pushed, 0 skipped. 0.0 MB/s (56 bytes in 0.003s)
> adb shell "cat /etc/hosts"
127.0.0.1       localhost
::1             ip6-localhost
10.0.2.2        mywebsite.example.com

API>28

hostsの書き換えは、以下の手順で行います。

> emulator -writable-system -avd エミュレータ名 &   # 書き込み可能イメージで起動
INFO         | Android emulator version 36.2.12.0 (build_id 14214601) (CL:N/A)
...
WARNING      | System image is writable
...
### 起動を待つ

> adb root                               # root権限でエミュレータへ接続
restarting adbd as root

> adb shell avbctl disable-verification  # AVBの無効化
Successfully disabled verification. Reboot the device for changes to take effect.

> adb disable-verity                     # dm-verityの無効化
using overlayfs
Successfully disabled verity
Now reboot your device for settings to take effect

> adb reboot                # 端末の再起動
### 再起動を待つ

> adb root                               # root権限でエミュレータへ接続
restarting adbd as root

> adb remount                            # ストレージを再マウント
remount succeeded

> adb pull /system/etc/hosts             # hostsをローカルへ読み出し
/system/etc/hosts: 1 file pulled, 0 skipped. 0.0 MB/s (56 bytes in 0.010s)

> vi ./hosts
### hostsを修正(ここではviを使用、お好みのエディタを使って下さい!)

> adb push hosts /system/etc/hosts       # hostsをエミュレータへ書き込み
hosts: 1 file pushed, 0 skipped. 0.0 MB/s (87 bytes in 0.003s)
> adb shell "cat /etc/hosts"
127.0.0.1       localhost
::1             ip6-localhost
10.0.2.2        mywebsite.example.com
スポンサーリンク

確認付きブート

Android端末はブートする間に様々なステージを遷移していきます。

ステージが遷移するとき、各ステージでは実行を引き渡す前に、次のステージの整合性と信頼性を検証し、問題があればエラーを生成します。

これを「確認付きブート」と呼びます。

AVB(Android Verified Boot )とdm-verityは、この整合性と信頼性を検証するツールです。

dm-verity:ルートキットの改ざんと不正使用を検証
          Android 4.4(API 19)で追加
		  
AVB      :全パーティションの改ざんと不正使用を検証
          Android 8.0(API 26)で追加

※ルートキット:root権限で動作するツール群
※生成されたエラーの扱い(例:Bootを拒否、警告出力のみ)はAPIで異なる

/etc/hostsの書き換えはアンドロイドシステムの変更に当たり、整合性と信頼性を損ねる可能性のある行いです。

ですので、AVBとdm-verifyがエラーを生成します。

スポンサーリンク

注意1:Google Play System Image

システムイメージ「Google Play XXX System Image(Play Store対応)」は、「adb root」により、root権限でエミュレータへ接続する設定が出来ません。

システムイメージは「Google APIs XXX System Image」を利用して下さい。

スポンサーリンク

注意2:システムイメージは一時的なコピー

「書き込み可能イメージ」は「読み出し専用イメージ」の一時的なコピーです。

エミュレータ起動オプション「-writable-system」の指定で、初回にコピーされます。

以降は、この起動オプションを指定し続ける限り、書き込み可能イメージでブートします。

そして、起動オプション無しで起動した時点で、一時的なコピーは破棄されてしまいます。書き込みイメージを用いたブートは出来なくなります。

元に戻したければ、「Wipe Data」等でエミュレータのデータを初期化して下さい。

※エミュレータ起動オプションの詳細は「高度なオプション」を参照

スポンサーリンク

関連記事:

Androidエミュレーターが実行されると、仮想ネットワークが自動生成されます。 そして、エミュレーターは、仮想ネットワークに接続された一つのコンピュータとして扱われます。 仮想ネットワークは開発マシン(Android Studioが起動しているマシン)にも接続されてるので、エミュレーターから開発マシンへ、ネットワークを介した通信が可能です。 開発マシンへWebサーバーを構築すれば、サーバーと通信を行うアプリ開発が行えます。 開発者の机の上に、バックエンド(サーバ側)とフロントエンド(クライアント側)の開発環境が得られて、とても便利です。 ※環境:Android Studio Otter | 2025.2.1     Android emulator version 36.2.12.0 ...
WindowsもLinux(Unix)と同じように「/etc/hostsファイル」を持っています。 役割も同じで「ホスト名とIPアドレスの変換テーブル」です。ホスト名からIPアドレスへ変換する際に、DNSに先立って参照されます。 ですので、hostsファイルにホスト名とIPアドレスの対を登録すれば、任意のホスト名でネットアクセスが可能になります。 ただし、Windowsの一般ユーザ向けの機能というよりも、ヘビーユーザー向けの隠し機能のような存在です。 このような機能はトラブルの火種に成りかねないので、一時的な利用に止め、不要になったら設定を削除することをお勧めします。 ※環境:Windows 11 Pro Version 25H2 ...
開発マシンへローカルWebサーバー(Apache)を構築します。 これにより、Webサーバーと通信するアプリのテストが容易になります。 外部にWebサーバーを調達する必要がなく、机上のパソコン(開発マシン)内でテスト環境が完結します。 Webサーバーの構築にXAMPPを使いました。 XAMPPは、ファストフードならぬ、ファストツールです。インストールして直ぐに使える点が、いいですね! ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Chrome バージョン 142.0.7444.163 ...
2000年の初め頃、https(HTTPのSSLによる暗号化通信)は、Webサイトの一部のページやECサイトなど、機密情報を扱う部分のみで使われていました。 「ネット決済をするときは、URL横の鍵マークを確認しましょう!」と、注意喚起されていたのを覚えています。 現在は、機密情報を扱う・扱わないに関係なく、ほとんどのWebサイトがhttpsを採用しています。安全なサイトであることを証明するためです。 日本(2025年)におけるWebサイトのhttps使用率は95%に達しているそうです。ですから、httpsは必須と言えます。 ローカルWebサーバーのhttps化は不要ですが、アプリ開発環境であれば、実環境(一般ユーザにアプリを使ってもらう環境)に合わせて導入した方が良いでしょう! ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Chrome バージョン 142.0.7444.163 (Windows版) ...
Windows Chromeにおいて、自己署名証明書を「信頼できる証明書」として、Windowsへ意図的に取り込みます。 これにより、証明対象のホストへ、httpsによる接続が可能になります。 Windows Chromeは証明書を保持するので、Chrome内へインポートする形になります。Androidと違うので、注意して下さい。 ※詳細は「Chromeにおける自己署名証明書の扱い」を参照 ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Chrome バージョン 142.0.7444.163 ...
通常、UIコンポーネントのWebViewは自己署名証明書を「信頼できない証明書」と判断します。その結果、httpsによる接続は拒否されます。 しかし、自己署名証明書を「信頼できる証明書」として、Android StudioのProjectへ意図的に取り込むことで、httpsによる接続が可能になります。 ただし、自己署名証明書が信頼できない点は変わりません。 ですので、この方法を用いるのはDebug時に止め、Release時は正式なCA証明書を持つWebサーバーへ、運用を移行するようにして下さい。 ※環境:Android Studio Otter | 2025.2.1 Patch 1 ...
Android Chromeにおいて、自己署名証明書を「信頼できる証明書」として、Androidへ意図的に取り込みます。 これにより、証明対象のホストへ、httpsによる接続が可能になります。 Android Chromeは証明書を保持しないので、証明書マネージャーへインストールする形になります。Windowsと違うので、注意して下さい。 ※詳細は「Chromeにおける自己署名証明書の扱い」を参照 ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Emulator 10.0(Q) API 29      Chrome バージョン 74.0.3729.185     Emulator 14.0(U) API 34      Chrome バージョン 113.0.5672.136 ...
スポンサーリンク