Android ASE (Android Scripting Environment)でntlmapsを動かしてみる

Android SDKのネットワークアダプタには何らかの問題があり、私のように背後にNTLM認証を用いたProxyServer(主にMS謹製)が鎮座している環境では、Androidはプロキシを超えて通信することができない。そこで、ntlmapsというNTLM認証を実行してくれるリバースプロキシを使うことでNTLM認証を迂回することを以前に試した訳だ。

ntlmaps (NTLM Authorization Proxy Server)でNTLM認証を迂回する

この件はあくまでAndroidエミュレータをWindowsデスクトップで使用する場合の話であり、ARMのCPU上でLinuxが動作しているAndroidの実機上では使えないとばかり思っていたのだが、どうやそうでもないことが最近解った。(最近まで知らなかったのが情けない)

というのもPythonを含む各種スクリプトを実行できるAndroidアプリケーションがあると聞いたからだ。

Android ASE (Android Scripting Environment)

Android Scripting Environment(以降ASE)はAndroid上で各種スクリプトを編集/実行するための環境であり、Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl,等、巷の殆どのスクリプトを実行することができるという神のようなアプリケーションだ。

ntlmapsをWindowsデスクトップ上に導入した際にはPythonの有無に関わらず動作するバイナリパッケージをインストールしたが、元々ntlmapsの実装はPythonで書かれており、ならばASE上で動作するのではないか。これは試さずにはいられない。

  • ASEのインストール

上記リンクからAndroidパッケージ(今日現在の最新版で"ase_r22.apk")をダウンロードするか、QRCodeを読み込んでインストールする。(予め提供元不明のアプリケーションのインストールを許可しておく必要がある)

インストールが成功すると

このようなアイコンが追加されているので、これを起動すると

このように表示されるはずだ。

メニューボタンから「View」を選択し、更に「Interpreters」を選択すると

とこの状態で使用できるスクリプトはshellだけなので、ここから更にメニューを開き「Add」から追加したいスクリプトを選択する。(今回はPython 2.6.2)

この段階でインターネットに接続できる環境であれば、ASEは以下のファイルを自動的にダウンロードして、/sdcard/ase/scripts/と、/sdcard/ase/extras/ディレクトリに展開してくれる。
python_scripts_r6.zip
python_extras_r6.zip
python_r6.zip
(ネットワークに接続できない環境でも、マウントされているSDカードのルートに上記の3つのファイルを置いておけばダウンロードしたのと同じように扱われる)

以上が上手くいけばPythonが使えるようになっているはずだ。

ここでPython 2.6.2を選択するとインタプリタが起動する。ここまで確認できればASEのインストールは成功。

ここからすぐにでもスクリプトを入力することができる。

  • ASEによりPythonスクリプトが動作している様子(Test.py)

ちなみに、ここまでの動作確認はNexus one(Android 2.1)とHT-03A(Android 1.6)上で行ったが、同じバージョンのSDKを使用したエミュレータでは、以下の例外が発生し、Pythonインタプリタの起動に失敗してしまう。

: Uncaught handler: thread main exiting due to uncaught exception
: java.lang.ExceptionInInitializerError
:     at com.google.ase.AseProcess.start(AseProcess.java:73)
:     at com.google.ase.interpreter.InterpreterProcess.start(InterpreterProcess.java:53)
:     at com.google.ase.ScriptLauncher.launch(ScriptLauncher.java:62)
:     at com.google.ase.terminal.Terminal.startInterpreter(Terminal.java:146)
:     at com.google.ase.terminal.Terminal.onCreate(Terminal.java:141)
:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
:     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
:     at android.os.Handler.dispatchMessage(Handler.java:99)
:     at android.os.Looper.loop(Looper.java:123)
:     at android.app.ActivityThread.main(ActivityThread.java:4363)
:     at java.lang.reflect.Method.invokeNative(Native Method)
:     at java.lang.reflect.Method.invoke(Method.java:521)
:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
:     at dalvik.system.NativeStart.main(Native Method)
: Caused by: java.lang.UnsatisfiedLinkError: Library com_google_ase_Exec not found
:     at java.lang.Runtime.loadLibrary(Runtime.java:489)
:     at java.lang.System.loadLibrary(System.java:557)
:     at com.google.ase.Exec.<clinit>(Exec.java:67)
:     ... 18 more

UnsatisfiedLinkErrorということなので、エミュレータにはcom_google_ase_Execがインストールされていないのだろうか。
ASEはエミュレータにインストールできるものの、結局はスクリプトを実行できないようだ。(単に.soが無いのならば解決できるかもしれんが今は時間が無い)

  • ntlmapsのインストール

ntlmapsは以前にインストールしたバイナリパッケージではなく、元々の全てスクリプトで書かれたアーカイブをダウンロードして、ASEのスクリプトディレクトリに展開すれば良い(/sdcard/ase/scripts/)

あとは、パッケージ中のmain.pyを適当な名前に直して実行するか、シェルが得意な場合はシェルから起動すれば良い。
ASEからスクリプトを起動する場合、長押しをすることでスクリプトをバックグラウンドプロセス(実際にはAndroidのService上で)起動できる。

Android上で動作するアプリケーションのプロセスはOSの都合(主にリソース不足)で割と簡単に停止させられるが、ntlmapsのように常駐するタイプのアプリケーションは簡単に停止させられると困るので、バックグラウンドで起動することにする。

起動が成功するとASEはNotificationを利用してシステムに該当のスクリプトが自身のサービスから起動されたことを通知する。

さあ、これで全ての準備が整った。ntlmapsはポート8888※でHTTP接続を待ち受けて、NTLM認証をプロキシサーバに対して行い、リクエストをサーバに届けてくれるはずだ。

しかし、実際にはいくつかのURLで試してみたが、上手くいかない。せっかくntlmapsは動いている(ようだ)のに、Android 2.1 update1のWebkitはそのポートを利用して通信をしてくれないようだ。

と、今回はここで時間切れ。

結局、ASEのインストールは成功し、Pythonスクリプトが動く所までは確認できたのだが、肝心のntlmapsが動作しないという寂しい結果となってしまった。しかし、ASEにより手軽にAndroid上でスクリプトを実行できることが解ったので、今回の件も含めていろいろと試せそうだ。

Android上でのアプリケーションの開発の主体はSDKJava言語だが、ちょっとしたことをスクリプトに任せることができるようになれば、更に引出しが広がるだろうと思う。

※私の環境設定での話。ntlmapsの設定ファイルのついては以前の私のエントリを参照のこと