Android运行Golang程序

7,619 阅读5分钟

开篇啰嗦

         毕业至今已有两个多月了,在帝都和家乡的抉择下,我选择留在了家乡沈阳,同时也有幸找到了一份满意的工作(感谢公司前辈们的关照)。

        作为Android开发者,在目前IT圈环境下,我感觉只掌握一项(端)开发技能的话,无论是发展空间还是就业机会,都会越来越不理想,所以我一直想利于业余时间来学习一项后端开发技能,最后经朋友的推荐下(手动@晚餐的小牛排),我了解到了Golang。

Go/Golang

        Go/Golang是谷歌在2009年发布的一款开源的面向对象编程语言。至于为什么叫做Golang,我想大概是是因为“Go”这个单词太通用了,搜索引擎不能很好的辨认吧。(本文统称为“Golang”)

Golang特性

        1. 高性能,Golang编译的程序不需要虚拟机环境就可以运行,因此在绝大多数情况下Golang的效率仅次于C/C++。

        2. 高并发,Golang引入了goroutine概念,它是一种比线程更”轻盈“的协程,它使得并发编程变得简单粗暴,而且可以充分利用多核心的CPU(没有黑Python)。

        3. 垃圾回收,Golang自带GC,不需要像C++那样使用delete或者free()来释放内存。

        还有很多特性我就不一一列出了,仅凭以上这三点足以让我喜欢上Golang。

正文

        今天周末,起床便打开电脑在github上阅读《The Way to Go》继续学习Golang。奈何本人阅读障碍,看了一小时就看不下去了...便想着搞点事情。之前了解到Golang交叉编译很方便,正巧手中有个树莓派3B,试下在树莓派上跑下Golang程序吧。

        随之写了一行无脑代码

        func main()  {

            fmt.Println("Hello Golang!")

        }

        这需要注意下,树莓派3B虽然是arm64的CPU,但是目前官方Raspbian操作系统只有32位的(不考虑SLES),所以cd到源码目录下执行以下命令

    GOOS=linux GOARCH=arm go build

        这里GOOS表示操作系统,GOARCH表示CPU架构(表示交叉编译太方便了)。

        编译完成后在源码目录下会生成一个和包同名的文件,在我这里为main。之后通过scp推到树莓派上运行通过,一切都在意料之中

重点来了!!

        我突然间想到,既然arm架构的树莓派可以运行Golang程序,那我的等于四(一加手机3)没有理由不能!一不做二不休,直接撸一个HTTP服务器

    func main()  {

        http.HandleFunc("/hello", SayHello)

        http.ListenAndServe(":80", nil)

    }

    func SayHello(w http.ResponseWriter, req *http.Request) {

        w.Write([]byte("Hello Golang!"))

    }

        这是一个用Golang标准库写的HTTP服务器,每次请求返回一个“Hello Golang”的字符串。可以看出Golang标准库非常强大,仅需要几行代码,并且不需要Tomcat、Nginx等就可以写出并发接口程序。

        需要注意的是,一加手机3的CPU为骁龙820,是arm64架构,所以编译程序需要执行以下命令

    GOOS=linux GOARCH=arm64 go build 

        编译生成文件之后推送到手机上,在终端模拟器中运行main文件出现了一个问题,如图

        错误提示Permission denied。很明显是权限问题,随即执行命令

        chmod 777 main 

        再次运行,发现还是Permission denied。到Re文件管理器发现 main 文件没有被赋予777权限,而是771!

        猛然想起Android外部存储设备的文件系统不可修改用户组权限!

        继续执行命令 

        su root

        mv main / 

        su root 是切换到root用户,Android中访问系统根目录也就是 / 目录需要root权限(手机必须获取root权限)。

        mv main / 就是把main移动到 / 根目录(需要挂载system分区为可读写)。

        最后执行命令

        chmod 777 main

        ./main

        你会惊奇的发现运行成功了!打开手机浏览器,访问如下地址

        http//:127.0.0.1/hello

        大家都知道127.0.0.1是就是localhost,本机IP地址。最后是激动忍心的时刻!

        手机浏览器显示的请求结果正是我们在Golang代码中返回的“Hello Golang!”。

        经测试,在同一局域网下,PC浏览器也可访问Android手机中运行的服务端程序!

        这TM完全可以在Android上结合自带的SQLite3部署一个小型服务器啊!以后有时间绝对搞一个!

写在最后

        本文虽然没有什么技术含量,但是我相信会有同学了解到新的知识,我也算没有白写。第一次写文章,也是难为我这小学的写作水平了... 今后工作之余我会分享开发中的经验与趣事,非常感谢您的阅读!