タイトルを見て、少し戸惑ったかもしれませんね。Android スマートフォンで HTTP サーバーを構築する方法???
冗談じゃないでしょうね
そうです、私たちは Android スマートフォンで HTTP サーバーを構築することを目指しています。一般的に HTTP サーバーといえば Apache や nginx を思い浮かべるかもしれませんが、Android 上でも Apache や nginx を実行できるのでしょうか?
実は Android スマートフォンではこれらのサーバーを実行することはできません。今回は、Golang で書かれたシンプルな HTTP サーバーを Android 上で実行します。Golang はクロスプラットフォームでコンパイルできるため、システムを Linux、CPU アーキテクチャを arm に設定し、スマートフォン上で実行してみました。すると、Android スマートフォンで本当に HTTP サーバーが動作しました。
驚きですね
さて、Golang の開発を行うためには、まず Golang の開発環境を設定する必要があります。Golang の設定方法はこちらを参照してください。私は Ubuntu で開発していますので、service.go というファイルを作成します。
1 package main
2
3 import (
4 "net/http"
5 )
6
7 func main() {
9 http.HandleFunc("/",myResponse)
10 http.ListenAndServe("127.0.0.1:8888",nil)
11 }
12
13 func myResponse(w http.ResponseWriter,r* http.Request) {
14 w.Write([]byte("<html><center> <font size="40">hello I am go service</font></center></html>"))
15 }
Golang に慣れていない方は注意してください。改行やスペースを適当に入れないでください。Golang は Python のように **「;」** で終了しないためです。
簡単に説明します。http.HandleFunc("/",myResponse)
の最初のパラメータは登録する HTTP サービスの URL です。ここでは"/"
と入力し、アクセスする際はlocalhost:8888
でアクセスできます。もし"/test"
と入力した場合、アクセスする URL はlocalhost/test:8888
になります。
http.ListenAndServe("127.0.0.1:8888",nil)
の最初のパラメータは監視する IP とポート番号です。2 番目のパラメータはnil
で構いません。
それでは、コンパイルして実行してみましょう。ローカルで実行する場合はデフォルトのコンパイルパラメータを使用します。go build service.go
を実行し、./service
を実行します。ブラウザで URL を入力してアクセスできるか確認してみましょう。
Chrome
次に、このプログラムを Android に移植します。Android スマートフォンにはルート権限が必要ですが、ルート化したくない場合はエミュレータを使用することもできます。CPU の命令セットパラメータを変更するだけで済みます。まず、スマートフォンで実行してみましょう。私のスマートフォンは Honor 6 で、CPU は HiSilicon 920 です。HiSilicon 920 の命令セットは arm32 だとネットで調べました。それでは、コンパイルしてみましょう。コンパイルする前に、先ほどコンパイルしたプログラムの名前を変更します。GOOS="linux" GOARCH="arm" go build service.go
を実行し、実行可能なファイルを取得します。file
コマンドで確認してみましょう。file service
を実行します。
service: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
このファイルは 32 ビットの ARM プログラムであることがわかります。では、このファイルを Android スマートフォンにコピーして試してみましょう。必要なソフトウェアは次の通りです。
Screenshot_2018-04-08-19-17-19.png
**"juiceSSH"は Linux のシェルコマンドをエミュレートするためのもので、"RE ファイルマネージャー"** はファイルの権限を変更するために使用します。Android では chmod コマンドが機能しないためです。
まず、ファイルをルートディレクトリにコピーし、次にファイルの権限を変更します。
Screenshot_2018-04-08-19-18-11.png
Screenshot_2018-04-08-19-18-20.png
次に、juiceSSH で実行し、ブラウザで URL を入力して確認してみましょう。
Screenshot_2018-04-08-19-19-43.png
問題ありませんね。
次にエミュレータ上で実行してみましょう。私は genymotion を使用しており、Google Nexus 5 のシステムを実行しています。ネットで調べたところ、Nexus 5 は Qualcomm Snapdragon 800 CPU を使用していることがわかりました。しかし、エラーメッセージ「/system/bin/sh: ./service_arm32: not executable: 32-bit ELF file」と表示されます。後で考えてみると、CPU はコンピュータ上のものを使用しているため、X64
にコンパイルしてみましょう。それでもうまくいかない場合は、X86
に変更してみましょう。やっと成功しました。指令セットはエミュレータのものを使用する必要があるためです。
GOOS="linux" GOARCH="386" go build service.go
を実行し、ファイルをエミュレータにコピーし、スマートフォンと同じようにルートディレクトリにコピーし、権限を追加します。その後、adb shell で実行し、エミュレータのブラウザでアクセスできるか確認してみましょう。
genymotion
さて、Android 上で HTTP サーバーを実行することができました。