看到標題是不是有點懵,在 Android 手機上搭建一個 http 伺服器???
你 TM 在逗我
沒錯,我們就是要在 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">hello I am go service</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 和端口,第二個填nil
就好了
然後編譯運行試試,在本機上運行的程式用默認的編譯參數就行go build service.go
然後運行./service
在瀏覽器中輸入 URL,成功訪問到
chrome
下一步我們把這個程式移植到 Android 上,Android 手機必須要有 root 權限,手機沒有 root,而又不想 root 的同學可以用模擬器,只要 CPU 的指令集參數改一下就行,先在手機上運行一下,我的手機是榮耀 6,CPU 是海思 920,百度到海思 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 的 shell 命令的,“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 nexus5 手機系統,我百度了一下,nexus5 用的是高通驍龍 800CPU,然後坑來了,驍龍 800 是 arm32 的指令集,按理說直接把那個程式複製進去就可以運行了,但是提示/system/bin/sh: ./service_arm32: not executable: 32-bit ELF file
後來想了想 CPU 用的是電腦上的,那編譯成X64
的試試。還是不行,換成X86
的試試。終於成功了。原來是指令要用電腦 CPU 的,多少位需要模擬器的。
執行GOOS="linux" GOARCH="386" go build service.go
複製到模擬器中,然後跟在手機一樣,複製到根目錄,添加權限。然後用 adb shell 運行,然後在模擬器的瀏覽器中發現可以訪問
genymotion
好了,我們已經在 Android 上運行一個 http 伺服器了.