home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Android/WiFi接続とHTTP-Proxyを取り巻く状況まとめ(2011-05現在)

技術/Android/WiFi接続とHTTP-Proxyを取り巻く状況まとめ(2011-05現在)

技術 / Android / WiFi接続とHTTP-Proxyを取り巻く状況まとめ(2011-05現在)
id: 966 所有者: msakamoto-sf    作成日: 2011-05-21 18:34:37
カテゴリ: Android 

Android実機でWiFi接続するときに、HTTP-Proxyを設定するには?についてアレコレ調べた時の参考資料メモです。
2011年5月中頃時点でGoogle検索で得られたURLを元にしています。
Android触り始めて三日しか経っていない状況での調査であるため、見落としや勘違いなどもあると思いますので注意してください。

前提:Androidの提供している設定メニューから設定できるか?

Android 3.1
WiFi接続に対してHTTP Proxy登録可能。
Android 3.0 以前
設定メニューには無い。ただし後述のとおりroot化を前提としたProxy設定アプリがAndroidMarket上に公開されており、これを使うとAndroid3.0以前の端末でもHTTP-Proxyを設定・利用できるらしい。


MotorolaのXOOMがAndroid 3.0だから、3.1にアップデート出来ないか?

  • 2011年5月20日 14:41:29 時点で日本のAmazonでVerizon版XOOM (MZ600) が在庫3個。海外携帯電話の専門業者が輸入してくれているようだ。
    • 頑張ってこれを購入して 3.1 にアップデートするという選択肢。

root化(rooting)前提のProxy設定アプリ for Android 3.0 以前

Android Marketで、3.0以前でもHTTP Proxyを設定できるAndroidアプリが公開されている。
いずれもroot前提と明記されている。iptablesも操作しているようだ。

root化(rooting)の法的リスク

  • AppleがiPhoneのJailBreakについて著作権の侵害などで訴訟云々の件
  • ただし、root化による影響で機器が誤動作し、許可されていない周波数の電波を発振したり、あるいはソフトウェアのバグで他人に危害を加えるのはNGそう。

基本的な考え方としては、「購入したものについてはどう扱おうと購入者の自由」とし、unroot/JailBreak自体は許されるという考え方。
ただしメーカー間との「保証契約」は無効化される(場合が大半だろう)。

その他参考にしたURL:

root化するためのAndroidアプリ

機種によって使える/使えないがあるらしい。

root化せずにAndroidが提供するAPIを正当に使用してProxyを設定できないか?

先に結論を書くと、

  • アプリが自分自身が行うHTTP通信に対してProxy設定を行うことはおそらく可能。
  • 他のアプリや、システム全体でのProxy設定をroot化せずに行うことはおそらく不可能。

「おそらく」と書いているのは、実際にアプリを作って検証してみないと本当のところは分からず、まだそこまで到達していないため。ただしProxy設定アプリが揃ってrootingを前提としていることから、少なくとも後者についてはほぼ確実と思われる。

JavaのHTTP通信とProxy設定

HTTP通信を行うAndroidアプリを想定する。NDKを使ったNativeアプリは考慮せず、現時点で主流となっているJavaだけを考える。
バージョンやAPIレベルの違いは考えない。とりあえずAndroid 2.x - 3.0位迄を対象に調べてみた。

AndroidのJava APIはJDKのサブセットになっている。主要なパッケージについてはJDKと同様のインターフェイスで提供されている。実装としてはApache Harmonyプロジェクトを初めとしたApacheプロジェクトの成果を取り込んでいる。

となれば、JavaでHTTP通信を扱う場合にProxyを使う方法がそのまま適用できると思われる。
"http.proxyHost"などのシステムプロパティを設定しておき、"new URL(...)"などプロトコルハンドラを使えば、後はJavaのランタイムライブラリが裏側で自動的にProxyを使うようになる。

システムプロパティを設定するには、二通りある。
1. Javaプロセス起動時にパラメータで渡す。

$ java  ... -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 ...

2. java.lang.System のsetProperty()を使って実行時に動的に設定する。

System.setProperty("http.proxyHost", "127.0.0.1");
System.setPropery("http.proxyPort", "8080");

調べた限りでは、Android において 1. は無理そう。使えるのは 2. の方法のみ。

AndroidでHTTP通信を行う方法としては三種類あるらしい。

  1. java.net 系
  2. org.apache.http 系
  3. android.net.http 系

これら全てが 2. の方法に対応しているか確実には言えないが、Android SDKのReference上にProxy設定について言及があるので、恐らく対応してくれていると思われる。

ただしこの方法では他のアプリやシステムの全体設定を変更することは出来ない。java.lang.System のsetProperty()はあくまでも当該VMに対する操作である。Androidにおいては一つのアプリは独立したDalvikプロセスとして動作しているため、他のアプリのVMに対して setProperty()を呼ぶことは出来ない(と思われる)。

システム全体あるいは他のアプリのHTTP-Proxyを設定するには

Androidの場合、JavaVMで閉じる"Property"とは別に、プラットフォーム全体で共有される"Property"もある。これは起動時に特定のファイルを読み込んで(SQLiteのdatabaseも対象となるかは不明)共有メモリ上に展開し、専用のサービスを介してAndroid専用のIPC(InterProceccCommunication)経由で呼び出す仕組み。

イメージ:

アプリ <> Android IPC <> サービス <> システムProperty

このプロパティをread/writeする方法として次の3種類がある。

  1. Nativeアプリ向けの property_get()/property_set() 関数
  2. Java クラス
    1. android.os.SystemProperties (1.5より前?)
    2. android.provider.Settings
  3. getprop/setpropコマンド (Android OSに含まれているシェルスクリプトで、adbのシェル上で実行出来る)

このプロパティの中に "HTTP_PROXY" というそのものズバリの項目がある。

ところがこの項目、通常のAndroidアプリの権限ではReadOnlyとなっており変更が出来ない。
"/system/"などに置かれている ".prop" はJava Propertyファイル形式のテキストファイルになっており、これにエントリを追加するにしても、当然ながら実機端末ではroot権限が要求される。

Nativeアプリについては未調査だが、もしシステムPropertyのRead/Write許可をサービス側で制御しているのであれば、Native/Javaに関わらずいずれにせよサービス側でブロックされるものと思われる(Nativeアプリの property_get()/property_set()の実体はJavaの場合と同様、IPCを介している)。

AndroidMarketで公開されているProxyアプリがrootを要求するのは、上記事情によりroot権限が必要なためではないかと思われる。

参考URL

Proxy設定関連全般:

"android.os.SystemProperties", "System.setProperty()" について:

Android自体のソースコードに手を入れて対処する手法:


AndroidはLinuxをベースとしています。
Linuxをベースとしていることは、モダンOSが備えているべき、ユーザー毎の資源へのアクセス制御機能を当然、備えています。
さて、「システム全体または他のアプリのProxy設定」を変更できるとしたら、それはLinuxベースのシステムに於いてはどのようなユーザー権限でしょうか?
・・・と考えると、これも当然のことながら root じゃないと駄目だろう、ってことです。

ただそうなると気になるのがAndroid 3.1からWiFi接続時のProxy設定が可能になる点です。
これがどうやって実現されているのか、こちらが気になるといえば気になります。
もしかしたら設定アプリが相応の権限で動くようになっているのかもしれません。

root化するのが怖い、保証外になるリスクを無視できない、そんな方向けの思い切った方法としては、root化専用の端末としてNexus Sを購入し、これを使用するという選択肢があります(人に指摘されてこの方法に気づきました)。
Nexus Sについては開発者向けに簡単にroot化できるようになっています。WiFi接続+Proxy利用に限ってroot化+Proxyアプリを入れたNexus Sを使う・・・贅沢な使い方ですが、そういう手法も有りだと思います。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2011-05-21 18:35:03
md5:f706bfd4a5feb19949bcda7429502be5
sha1:9bf429886479efa6696f69ce2152d9ed9daf8433
コメント
コメントを投稿するにはログインして下さい。