golang开发android app小记

Google和Oracle打过Java的官司以后就开始慢慢转kotlin了。从JVM虚拟机打官司,改成android用JVM从堆栈平衡转寄存器模式,再到语言更新kotlin,够折腾。kotlin,勉强可以接受吧,就是开发的时候各种stackoverflow/google oriented programming。最近写了不少go了,想起来以前有本书是说skype的android应用是怎么用c++开发的;前些年也看到过android的ruby sdk;还有cordova和phonegap用js一套全开发;于是想着,go可以开发android app吗?琢磨着go的wasm的支持,google一下,我去,果然android已经可以用go开发了。

其实gomobile什么都封装好了,就往里写业务代码就好了,它不但可以generate android app,连ios和macosx都一并包揽了。我们按照教程做就好了:

go get golang.org/x/mobile/cmd/gomobile
go get -d golang.org/x/mobile/example/basic
# 先搞个android sdk+ndk
# export ANDROID_HOME=/path/to/sdk # (ndk=/path/to/sdk/ndk-bundle)
./bin/gomobile build -target=android golang.org/x/mobile/example/basic

弄完了,它就不停报错:

"Unexpected unclosed action in template clause"

但是我直接 go build golang.org/x/mobile/example/basic 然后 ./bin/basic 这个程序是可以跑在我的mac上的。

android build里,哪个template出问题了?版本不兼容?搜索了一下 template.New 没有几个地方,在 Execute 的地方都加个 fmt.Println 然后啥都没有打印出来;于是就从 main.go 顺藤摸瓜,在函数入口一个一个加 fmt.Println,最后发现,这个错误是从 cmd/gomobile/env.go 里抛出来的;go list 的错误,好像网上不少人遇到了 go list 的问题,这里是 go list -e -f '{{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}}' runtime 报错。我只想让它pass,不求甚解。所以看了一眼,这不就是如果有 go1.14 这项把这个string输出来么,干嘛这么复杂,直接 out := "go1.14" 就好了。改完,再跑一遍build,好了,出了个apk文件。 adb install 到模拟器上,哔哔,可以运行了。虽然用OpenGL这个UI得自己画,JNI也可以调标准UI库,后面就是一点点积累go的android代码库了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐