看到标题是不是有点懵,在 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 服务器了.