dポイントプレゼントキャンペーン実施中!

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{
//ここに外用の置き換えコードを書いたらいいんじゃないかなあと考えています。
}

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

A 回答 (2件)

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



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

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

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

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



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

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

この回答への補足

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

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

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

補足日時:2014/01/10 10:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!