banner
moeyy

moeyy

一条有远大理想的咸鱼。
github
mastodon
email

Androidの携帯電話でHTTPサーバーを構築する

タイトルを見て、少し戸惑ったかもしれませんね。Android スマートフォンで HTTP サーバーを構築する方法???

Android スマートフォンで HTTP サーバーを構築する方法

冗談じゃないでしょうね

そうです、私たちは Android スマートフォンで HTTP サーバーを構築することを目指しています。一般的に HTTP サーバーといえば Apache や nginx を思い浮かべるかもしれませんが、Android 上でも Apache や nginx を実行できるのでしょうか?

実は Android スマートフォンではこれらのサーバーを実行することはできません。今回は、Golang で書かれたシンプルな HTTP サーバーを Android 上で実行します。Golang はクロスプラットフォームでコンパイルできるため、システムを Linux、CPU アーキテクチャを arm に設定し、スマートフォン上で実行してみました。すると、Android スマートフォンで本当に HTTP サーバーが動作しました。

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 を入力してアクセスできるか確認してみましょう。

Android スマートフォンで HTTP サーバーを構築する方法

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 スマートフォンにコピーして試してみましょう。必要なソフトウェアは次の通りです。

Android スマートフォンで HTTP サーバーを構築する方法

Screenshot_2018-04-08-19-17-19.png

**"juiceSSH"は Linux のシェルコマンドをエミュレートするためのもので、"RE ファイルマネージャー"** はファイルの権限を変更するために使用します。Android では chmod コマンドが機能しないためです。

まず、ファイルをルートディレクトリにコピーし、次にファイルの権限を変更します。

Android スマートフォンで HTTP サーバーを構築する方法

Screenshot_2018-04-08-19-18-11.png

Android スマートフォンで HTTP サーバーを構築する方法

Screenshot_2018-04-08-19-18-20.png

次に、juiceSSH で実行し、ブラウザで URL を入力して確認してみましょう。

Android スマートフォンで HTTP サーバーを構築する方法

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 で実行し、エミュレータのブラウザでアクセスできるか確認してみましょう。

Android スマートフォンで HTTP サーバーを構築する方法

genymotion

さて、Android 上で HTTP サーバーを実行することができました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。