みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

hostsファイルを置き換える android

androidアプリで、hostsファイルを置き換える、ものを作ろうと思っています。
家でローカルサーバーへアクセスするのに、いちいちhosts editorを使わなければならないからです。
家のSSIDに接続したら、アプリディレクトリに準備してあるhostsファイルと置き換える、というだけのものです。「というだけのもの」と言いながらかなりレベルの高いものだと痛感しました。
なのでハードコードしたものでとりあえず、
アプリを起動したら
SSIDを検知して
hostsを「家用のもの」と「外用のもの」とを置き換える
までのものを作ろうと思っています。
root化されている前提での質問です。

以下は部分的な抜粋コードです。

WifiManager manager = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String[] apInfo = new String[4];
String s1 = new String(info.getSSID().trim());
String s2 = "\"exampleSSID\"";
if(s1.equals(s2)){
try {
_process = Runtime.getRuntime().exec("su");

srcChannel = new FileInputStream("/system/etc/hosts").getChannel();
destChannel = new FileOutputStream("hosts").getChannel();
srcChannel.transferTo(0, srcChannel.size(), destChannel);
//↑このあたりでとりあえずhostsファイルを取ってくるコードをやってみているのだけれど、できません。

_process.destroy();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (srcChannel != null) {
try {
srcChannel.close();
} catch (IOException e) {
}
}
if (destChannel != null) {
try {
destChannel.close();
} catch (IOException e) {
}
}
}else{
//ここに外用の置き換えコードを書いたらいいんじゃないかなあと考えています。
}

どうしたらよいでしょうか。ヒントでもご教授いただけたらと思います。

投稿日時 - 2014-01-08 19:46:36

QNo.8420841

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> 許可をすれば問題なくスルーします。

この文脈で「スルー」というのがどういうことを指すのかが分かりません。

> ということはroot権限は得ていることだと認識していますが、齟齬がありますでしょうか。

繰り返します。root権限を得るのは、suによって新たに作られるプロセス(だけ)です。
UNIX系OSの常識としては、exec("su")を呼んでいる質問者さんのアプリはroot権限を得られていないはずです。

投稿日時 - 2014-01-11 12:02:30

ANo.1

どうしたら望みのものを作れるかは分かりませんが、どうしてうまくいかないかは見当がつきます。

> _process = Runtime.getRuntime().exec("su");

Androidにおけるsuコマンドが他のUNIX系OSにおけるsuコマンドと同じように動作するものであれば、suによってroot権限を得られるのはsu経由で作成される新規のプロセスです。exec("su")を呼んでいる元のアプリにはroot権限は与えられません。
このため/system/etc/hostsにアクセスできないのは当然です。

投稿日時 - 2014-01-09 21:11:38

補足

確かに、
_process = Runtime.getRuntime().exec("su");

があるためにsuperUserの許可を与えるかどうかのウィザードが別のアプリによって展開されます。
許可をすれば問題なくスルーします。ということはroot権限は得ていることだと認識していますが、齟齬がありますでしょうか。

問題はそのあとで/system/etc/hostsにどうやってアクセスするかです。
chmodで権限を一度剥奪してから置き換え、権限を戻す、といったことをやるのかな、と思うのですが、その辺の記述がわかっていないのです。

投稿日時 - 2014-01-10 10:42:51

あなたにオススメの質問