Skip to content

Go mobile Android

李小明 edited this page Nov 14, 2022 · 11 revisions

安装

go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init

设置

需要SDK和NDK的支持才能进行编译,SDK和NDK可在.profile中设置:

#go mobile
export ANDROID_HOME=$HOME/app/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/20.1.5948944

使用 NDK r20b 版本以获得良好兼容性.

重启系统让设置生效。

从GoLang包生成aar

gomobile现在支持模块(go.mod), 不用再像以前只支持GOPATH, 需要手动把模块引用放到GOPATH中!

新建GoLang项目,添加一个hi包:

package hi

import (
	"fmt"
	"strings"
)

func Hi(name string) string {
	fmt.Println("你好", name)

	return strings.Join([]string{"你好", name}, ":")
}

生成aar

go get -d golang.org/x/mobile/cmd/gomobile
gomobile bind -v -androidapi 21 -target=android -o hi.aar ./hi/

go get用于自动在go.mod中增加间接引用, 否则gomobile bind会报错, 最好每次执行gomobile bind前执行go get.

使用aar

  1. 参考文档 以依赖项形式添加您的库 将上面生成的hi.aar添加到Android项目中.
  2. 调用 Hi.hi("小明") ,Run日志中可见Tag为GoLog的日志打印:"你好 小明".

示例

https://github.com/alx696/go-mobile-android


通过Termux运行GoLang

测试发现http服务通过上面mobile的形式不能正常提供服务,但是用Termux运行GoLang可以,可能还能做更多的事情.

参考 https://dev.to/kataras/how-to-turn-an-android-device-into-a-web-server

安装Termux

访问 https://termux.com/ 从F-Droid下载并安装, 然后打开. 下面执行的命令都在Termux中.

安装GoLang环境

$ pkg install golang

准备GoLang源码

GoLang示例源码(main.go)如下:

package main

import (
	"log"
	"net/http"
)

func main() {
	log.Println("web服务")

	http.HandleFunc("/hi", func(writer http.ResponseWriter, request *http.Request) {
		writer.WriteHeader(200)
		writer.Write([]byte("你好"))
	})

	http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("/sdcard/Download"))))

	http.ListenAndServe(":8090", nil)
}

按GoLang的源码结构创建lilu.red域, web工程. 将示例源码放到一个下载服务中, 然后使用wget下载到Android设备中:

$ mkdir -p $HOME/go/lilu.red/web
$ cd $HOME/go/lilu.red/web
$ wget http://下载服务地址/main.go

运行GoLang源码

$ export GOPATH=$HOME/go
$ cd $HOME/go/lilu.red/web
$ go run main.go

验证

在Android设备的浏览器中打开 http://127.0.0.1:8090, 或在与Android设备可以联通的局域网内其它设备浏览器中打开 http://android设备ip:8090. 此时网页中会显示Android设备的下载文件夹中的内容.

结语

看起来Termux就是一个Linux! 如果不希望每次都以源码形式运行GoLang(每次都要设置GOPATH), 可以直接构建应用:

$ go build -o web main.go

然后将web移动到HOME中, 以后每次进入Termux后执行 ./web 就可以启动服务了.