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にアップデート出来ないか?
- au KDDI のXOOMでは3.1のアップデートは未定。
- 米国Verizonから販売されているXOOM(日本国内では販売されていない)の場合は、5月中頃から3.1へのアップデートが配布されている。日本国内でも、個人輸入した人が「3.1にアップデート、WiFiでProxy設定できた」と報告している。
- Motorola、XOOM向けAndroid 3.1(Honeycomb)へのアップデートに関する詳細を発表 | juggly.cn
- Motorola XOOMのWi-Fi版へのAndroid 3.1アップデートの提供は今後数週間を目処に
- XOOM(Verizon版)を個人輸入する際の注意点と価格[もうすぐ到着]
- XOOM到着!ざっとレビューします。[写真・動画]
- Kazuyuki Eguchi Factory::XOOMにAndroid 3.1へのアップデート通知がやって来た。
- Kazuyuki Eguchi Factory::Android 3.1でWiFiの設定にProxy設定が追加された。
- 2011年5月20日 14:41:29 時点で日本のAmazonでVerizon版XOOM (MZ600) が在庫3個。海外携帯電話の専門業者が輸入してくれているようだ。
- 頑張ってこれを購入して 3.1 にアップデートするという選択肢。
- Verizon版XOOMをAndroid 3.1に無理やり or まっとうな方法でupdateする参考:
- How To Upgrade Motorola XOOM To Android 3.1 Honeycomb | Review Unit
- How to Upgrade / Update MOTOROLA XOOM to Android 3.1 - Internet Service Provider | Technology & Information
- How to Force Your Motorola Xoom Android 3.1 Update
root化(rooting)前提のProxy設定アプリ for Android 3.0 以前
Android Marketで、3.0以前でもHTTP Proxyを設定できるAndroidアプリが公開されている。
いずれもroot前提と明記されている。iptablesも操作しているようだ。
- ProxyDroid:無料
- ASProxy:有料
- 野良アプリであやしげ:
root化(rooting)の法的リスク
- AppleがiPhoneのJailBreakについて著作権の侵害などで訴訟云々の件
- → FCCによればroot化自体は問題ないらしい。ただし、メーカーの保証規定に反していれば保証は受けられなくなる。
- iPhone jailbreaking (and all cell phone unlocking) made legal - Yahoo! News
- → Androidの、少なくとも Nexus S については Android Securityチームの人が「fastboot oem unlockでrootを取得するのは設計上そうしているので、驚くことではない」とエントリで述べている。
- Androidセキュリティチーム、Nexus Sのroot化について語る - スラッシュドット・ジャパン
- Android Developers Blog: It’s not “rooting”, it’s openness
- ただし、root化による影響で機器が誤動作し、許可されていない周波数の電波を発振したり、あるいはソフトウェアのバグで他人に危害を加えるのはNGそう。
基本的な考え方としては、「購入したものについてはどう扱おうと購入者の自由」とし、unroot/JailBreak自体は許されるという考え方。
ただしメーカー間との「保証契約」は無効化される(場合が大半だろう)。
- Question about legality of rooting. - Android Forums
その他参考にしたURL:
- Rooting: Risk Vs. Rewards - Android Forums
- Jailbreaking or Rooting Your Phone Is Legal but Can Be Risky - NYTimes.com
- What is Rooting - Definition of Rooting for Android Users
- Interesting LEGAL question about ROOT - xda-developers
- Security risks of rooting your android smartphone - Android - Stack Exchange
- Are there any risks to rooting a device? - Android - Stack Exchange
root化するためのAndroidアプリ
機種によって使える/使えないがあるらしい。
- 多くの端末をワンクリックでroot化できる「z4root」、Androidマーケットからダウンロード可能 | juggly.cn
- 「Universal Androot」Androidマーケットに公開、23機種のroot化が可能(更新) | juggly.cn
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を使うようになる。
- Sun JDK : Java ネットワークとプロキシ
- Java Android Tutorials: Connect through a Proxy UnknownHost Solution
- Android SDK : ProxySelector | Android Developers
システムプロパティを設定するには、二通りある。
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通信を行う方法としては三種類あるらしい。
- java.net 系
- org.apache.http 系
- android.net.http 系
これら全てが 2. の方法に対応しているか確実には言えないが、Android SDKのReference上にProxy設定について言及があるので、恐らく対応してくれていると思われる。
- HttpRoute | Android Developers
ただしこの方法では他のアプリやシステムの全体設定を変更することは出来ない。java.lang.System のsetProperty()はあくまでも当該VMに対する操作である。Androidにおいては一つのアプリは独立したDalvikプロセスとして動作しているため、他のアプリのVMに対して setProperty()を呼ぶことは出来ない(と思われる)。
システム全体あるいは他のアプリのHTTP-Proxyを設定するには
Androidの場合、JavaVMで閉じる"Property"とは別に、プラットフォーム全体で共有される"Property"もある。これは起動時に特定のファイルを読み込んで(SQLiteのdatabaseも対象となるかは不明)共有メモリ上に展開し、専用のサービスを介してAndroid専用のIPC(InterProceccCommunication)経由で呼び出す仕組み。
- just do IT: android property system
イメージ:
アプリ <> Android IPC <> サービス <> システムProperty
このプロパティをread/writeする方法として次の3種類がある。
- Nativeアプリ向けの property_get()/property_set() 関数
- Java クラス
- android.os.SystemProperties (1.5より前?)
- android.provider.Settings
- getprop/setpropコマンド (Android OSに含まれているシェルスクリプトで、adbのシェル上で実行出来る)
このプロパティの中に "HTTP_PROXY" というそのものズバリの項目がある。
- Settings.Secure | Android Developers
ところがこの項目、通常の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設定関連全般:
- Let's talk about Google Android: Set proxy for android web browser
- How do I set a proxy on my Android browser? : Ask Owen
- How do I set a proxy in Android phones ??? - Stack Overflow
- anddev.org ? View topic - I want to configure proxy using code.
"android.os.SystemProperties", "System.setProperty()" について:
- Where is android.os.SystemProperties - Stack Overflow
- System.setProperty() cannot change system property in Android - Android Developers | Google グループ
- SystemProperties available to SDK developer? - Android Developers | Google グループ
- android.os.SystemProperties??? - Android Developers | Google グループ
- Can not access to the system properties store? - Android Developers | Google グループ
Android自体のソースコードに手を入れて対処する手法:
- AndroidアプリケーションのSSL通信をプロキシで解析する(1) ≪ JUMPERZ.NET Blog
- AndroidアプリケーションのSSL通信をプロキシで解析する(2) ≪ JUMPERZ.NET Blog
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を使う・・・贅沢な使い方ですが、そういう手法も有りだと思います。
プレーンテキスト形式でダウンロード
コメント