タイトルを見て少し戸惑っていますか?Android スマートフォンで HTTP サーバーを構築する???
あなたは私をからかっているのですか?
その通り、私たちは Android スマートフォンで HTTP サーバーを構築するのです。HTTP サーバーといえば、一般的には Apache や nginx を思い浮かべます。
Android でも Apache や nginx を実行できるのでしょうか???
Android スマートフォンではこれらのサーバーを実行することはできませんが、今回は Android 上で Golang で書かれたシンプルな HTTP サーバーを実行します。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">こんにちは、私はGoサービスです</font></center></html>"))
15 }
Go に不慣れな方は注意してください。無闇に改行しないでください 無闇に改行しないでください 無闇に改行しないでください。Go は 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 スマートフォンは root 権限が必要です。スマートフォンが root 化されていない場合、または root 化したくない方はエミュレーターを使用できます。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 プログラムであることがわかります。OK、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 の OS を実行しています。調べたところ、Nexus 5 は Qualcomm Snapdragon 800 CPU を使用していることがわかりました。ここで問題が発生しました。Snapdragon 800 は arm32 の命令セットで、理論的にはそのプログラムを直接コピーすれば実行できるはずですが、/system/bin/sh: ./service_arm32: not executable: 32-bit ELF file
というエラーが表示されました。
考えた末、CPU が PC のものであるため、X64
にコンパイルしてみましたが、うまくいきませんでした。次にX86
に変更してみました。ついに成功しました。実は、命令は PC の CPU を使用し、ビット数はエミュレーターのものである必要がありました。
GOOS="linux" GOARCH="386" go build service.go
を実行します。
エミュレーターにコピーし、スマートフォンと同様にルートディレクトリにコピーして権限を追加します。その後、adb shell で実行し、エミュレーターのブラウザでアクセスできることを確認しました。
genymotion
さて、私たちは Android 上で HTTP サーバーを実行することができました。