English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android中のhostsファイルの修正手順詳細解説

前書き

開発中にAndroidのhostsファイルを変更する必要があることがあります。Androidのhostsファイルのパスは/system/etc/hosts、このファイルを変更する前にまずAndroidスマートフォンにルート権限を取得する必要があります。スマートフォンをルートする方法については詳しく説明しませんが、ネットワーク上で多くの情報があり、非常に簡単です。

本文では、コマンドラインでadbプログラムを使用してroot化された携帯電話にアクセスし、hostsをコンピューターにドラッグして修正し、その後携帯電話にコピーしてhostsの変更方法を実現する方法について説明します。

具体的な手順から始めましょう:

C:\tools>adb pull /system/etc/hosts hosts.mod
[100%] /system/etc/hosts

上記のコマンドは、hostsファイルを携帯電話からコンピューターにドラッグして修正し、その後携帯電話にコピーしてhostsの変更を実現する方法を説明します。10「0%]」はファイルが転送が完了したことを示し、hostsファイルを変更することができます。変更が完了したら、以下のコマンドを使用して携帯電話にアップロードしてください:

C:\tools>adb push hosts.mod /system/etc/hosts
既にすべて準備が整ったので、修正したhostsファイルをアップロードしてみましょう。/system/etc/adb: エラー: 'hosts.mod' を '-hosts': 読み取り

エコーからのメッセージを見ると、ファイルシステムが読み取り専用であるため、直接アップロードすることができません。

以下のコマンドを実行してみて、成功するかどうかを確認してください!

C:\tools>adb root # ヘルプ文書には、このコマンドがadbdデーモンプロセスにroot権限を与えると記載されています。
C:\tools>adb push hosts.mod /system/etc/hosts
既にすべて準備が整ったので、修正したhostsファイルをアップロードしてみましょう。/system/etc/adb: エラー: 'hosts.mod' を '-hosts': 読み取り

それでもうまくいかないようです。再びマウントする必要があります。/systemディレクトリのみが可能です。

C:\tools>adb remount
remount失敗:操作が許可されていません。

権限がない?これはshellの大法を唱える時のシグナルです!

C:\tools>adb shell
* デモンが動作していません。今すぐポートで起動します。 5037 *
* デモンが正常に開始されました。 *
shell@maguro:/ $ ls -al /system/etc/hosts
-rw-r--r-- root root  25 2013-08-14 07hostsファイルの属性を確認します。

最後の行から見て、hostsファイルは所有者のみが書き込めるもので、他のユーザーには読み取り専用です。他のユーザーも修正できるようにするには、以下のコマンドを使用して権限を引き上げ、hostsファイルの属性を変更する必要があります。

shell@maguro:/ $ su

このコマンドを最初に実行する場合、電話が明るくなり、SuperSUアプリが権限の割り当てに同意するかどうかを確認するポップアップが表示されます。もちろん、同意する必要があります!その後、ターミナルのプレースホルダーが$から#に、@の前にある文字がshellからrootに変わります。その後、hostsファイルの属性を変更することができます。

root@maguro:/ # chmod +666 /system/etc/hosts
Bad mode
root@maguro:/ # chmod 666 /system/etc/hosts
chmodを実行できません。 /system/etc/hosts: Read-hosts': 読み取り

また「Read」です。-読み取り専用のファイルシステムです!以下のコマンドを入力して確認してください。/systemディレクトリのファイルシステムの詳細はどうですか。

root@maguro:/ # mount | grep system
/dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...

extを見てください。4後ろのroはどうですか?これは「read only」の略で、読み取り専用を意味します。これは以下を示しています:/systemディレクトリは読み取り専用です。次に、読み取り・書き込み可能にする必要があります。

root@maguro:/ # mount -o rw,remount /system

上記の-オプションを指定するために「o」を使用します。これらのオプションには:

  • デバイスを再ロードするための「remount」を意味します。通常、デバイスの設定状態を変更するために使用されます。
  • ro 以只读模式加载。
  • ro で読み取り専用モードでロード

rw で読み書き可能モードでロード

root@maguro:/ # mount | grep system
/dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...

もう一度確認すると、元のroの位置がrwに変わったことが分かります。

C:\tools>adb push hosts.mod /system/etc/hosts
既にすべて準備が整ったので、修正したhostsファイルをアップロードしてみましょう。/system/etc/しかし、ここまではhostsファイルを携帯電話にコピーすることはできません。なぜなら、hostsファイルの権限属性がまだ変更されていないからです。強制的にアップロードすると、以下のようなエラーメッセージが表示されます:

hosts': 権限が拒否されました

root@maguro:/ # chmod 666 /system/etc/hosts

以下の命令を実行します:

root@maguro:/ # ls -al /system/etc/hosts
-rw-rw-rw- root  root   25 2013-08-14 07hostsファイルの属性を確認します。

:00 hosts

誰でもhostsファイルを読み書きできることが分かります。

C:\tools>adb push hosts.mod /system/etc/hosts
既にすべて準備が整ったので、修正したhostsファイルをアップロードしてみましょう。/system/etc/adb: エラー: 'hosts.mod' を '-hosts': 読み取り

ファイルシステムのみ

なぜかコピーが失敗しましたか?ファイルシステムは既に読み書き可能にしてありますよね?/そして、原因を探す過程で奇妙なことに気づきました。rootモードでは/systemは読み書き可能ですが、shellモードでは

root@maguro:/ # mount | grep system
/dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...
root@maguro:/ # exit
shell@maguro:/ # mount | grep system
/dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...

そして、携帯電話のTerminal Emulatorで/systemディレクトリが読み書き可能にマウントされた後、adb shellのrootモードで確認/systemの状態はまだ読み取り専用として表示されています。

ネットで探しまくって探しまくって、絶望的になりかけたところで、問題が解決する可能性のあるこの投稿を見つけました:shellでのユーザーやrootでのマウントでの異なる出力ある回答が「マウントネームスペース」というものについて言及していました。それから初めて知りました:

マウントネームスペースはプロセスに対して可见なファイルシステムのマウントのセットです。

各プロセスのマウントポイントは他のプロセスには見えません。Terminal Emulator内でmountしたマウントポイントはそのプロセスに属していますが、adb shell内のshellモードとrootモードのマウントポイントはそれぞれのプロセスに属しています。これが先ほどのrootモードでの変更/systemディレクトリが書き込み可能になった後でも、shellモードでまだ読み取り専用に表示される理由です。

問題の原因がわかったので、どのように解決しますか?

SuperSUアプリの設定に、mount namespace separationのオプションがあります。以下の図を参照してください:

チェックを外して、mountのマウントポイントはグローバルになります。これらのプロセスに特化したものではありません。ただし、この変更が有効になるのは、電話を再起動した後に限ります。忘れないでください。

以下は、mount namespace separationを解除した後のアップロード結果です:

C:\tools>adb push hosts.mod /system/etc/hosts
[100%] /system/etc/hosts

次のように見えます:100%]のエコーが返され、ファイルのアップロードが完了しました。

hosts ファイルの属性を確認してください:

root@maguro:/ # ls -al /system/etc/hosts
-rw-rw-rw- root  root  137679 2017-02-16 00:20 hosts

ファイルのサイズは、25に変わり137679、ファイルの交換が完了しました。

以下は、電話を元の状態に復元する方法です:

root@maguro:/ # chmod 644 /system/etc/hosts
root@maguro:/ # ls -al /system/etc/hosts
-rw-r--r-- root  root  137679 2017-02-16 00:20 hosts
root@maguro:/ # mount -o ro,remount /system

これで hosts ファイルの修正は完了です。

まとめ

これでこの記事のすべての内容が終わりました。この記事の内容が皆様の学習や仕事に少しでも役立つことを願っています。疑問がある場合は、コメントを残してください。

声明:この記事の内容はインターネットから取得しており、著作権者は所有者であり、インターネットユーザーが自発的に貢献し、アップロードしたものであり、本サイトは所有権を持ちません。また、人間による編集は行われていません。著作権侵害の疑いがある場合は、メールで notice#w までお知らせください。3codebox.com(メールを送信する際、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合、本サイトは直ちに侵害疑いの内容を削除します。)

おすすめ