- 締切済み
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{ //ここに外用の置き換えコードを書いたらいいんじゃないかなあと考えています。 } どうしたらよいでしょうか。ヒントでもご教授いただけたらと思います。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- salsberry
- ベストアンサー率69% (495/711)
> 許可をすれば問題なくスルーします。 この文脈で「スルー」というのがどういうことを指すのかが分かりません。 > ということはroot権限は得ていることだと認識していますが、齟齬がありますでしょうか。 繰り返します。root権限を得るのは、suによって新たに作られるプロセス(だけ)です。 UNIX系OSの常識としては、exec("su")を呼んでいる質問者さんのアプリはroot権限を得られていないはずです。
- salsberry
- ベストアンサー率69% (495/711)
どうしたら望みのものを作れるかは分かりませんが、どうしてうまくいかないかは見当がつきます。 > _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で権限を一度剥奪してから置き換え、権限を戻す、といったことをやるのかな、と思うのですが、その辺の記述がわかっていないのです。