打包Golang并在Android环境下运行

2018年01月01日 23:14:42 immortalCockroach 阅读数:1761
https://blog.csdn.net/lszy24/article/details/78948130

打包在android下的可执行程序

打包的代码如下,作用是输出运行的操作系统的信息:

  1. func main() {
  2. fmt.Print("Go runs on ")
  3. switch os := runtime.GOOS; os {
  4. case "darwin":
  5. fmt.Println("OS X.")
  6. case "linux":
  7. fmt.Println("Linux.")
  8. default:
  9. // freebsd, openbsd,
  10. // plan9, windows...
  11. fmt.Printf("%s.", os)
  12. }

其中打包的文件只有上面的一个,文件名为android.go

当Mac或者Linux环境下有Go以及adb的环境即可编译运行,在Go文件所在的目录下执行打包的命令,命令如下:

  1. CGO_ENABLED=0 GOARCH=arm GOOS=linux go build -o target-android android.go

运行该命令后可以得到target-android的可执行文件。

其中GOARCHGOOS指定了目标的CPU和操作系统类型
GOARCH和GOOS`相关。

如果分别指定amd64和darwin则打包的结果可以直接在mac下运行。

在android下运行

在此之前需要保证安装了adb以及手机开启了调试模式。
使用命令adb devices可以查看pc端连接的设备。

确定了打包和设备连接没问题后,使用adb push命令将打包的结果传到手机上,并执行响应的程序。具体的命令步骤为:

  1. adb push ./target-android /data/local/tmp
  2. adb shell # 进入android设备的shell环境
  3. cd /data/local/tmp
  4. chmod +x ./target-android #赋予执行的权限
  5. ./target-android #运行打包的程序

输出的结果为Go runs on Linux.


把Golang写的程序部署到Android上运行

2014-07-20 http://weilin.me/articles/applyGoProgramOnAndroid.html

最近项目需要,想把GO写的web服务器重用,部署在Android环境中,在理论上是可以的,因为Go语言支持linux系统,并且支持arm,而Android底层支持是linux,我们选用的硬件也是arm架构的,这就对了。于是乎先查询了一下对应的资料,刚好找到了Dennis Forbes的一篇文章:Go (“golang”) and Android, 在这篇文章里面,作者详细阐述了GoLang和Android两者之间的结合。鉴于是英文的,并且在实践上的细节没有比较详细的列出,我在此记录一下我的实践。

开发环境使用的是Ubuntu系统,x86, 32位(用的虚拟机),GoLang1.3,Sublime Text 2作为开发工具。

先从官网上下载golang 1.3源码,如果你没有梯子,可以在国内的网站GoLang中国上面下载。下载完成后,按照标准的安装流程,假设解压到了/home/go, 则进入/home/go/src,执行sudo ./all.bash进行编译安装。

安装好了之后,最后把对应的GOROOT, GOPATH, PATH也设置一下,至于这些设置则比较简单,到处都有说明,故不在此说明。

由于我们运行的Android的Android平台是arm架构的,所以要准备交叉编译环境,进入目录 /home/go/src,执行

  1. sudo CGO_ENABLED=0 GOARCH=arm GOOS=linux ./make.bash

交叉编译环境好了后,进入自己写的代码所在目录,执行命令

  1. CGO_ENABLED=0 GOARCH=arm GOOS=linux go build

就可以编译出linux arm平台的程序了。
自己写的测试程序源码如下

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. )
  6. func main() {
  7. http.HandleFunc("/", getIndex)
  8. http.ListenAndServe(":8888", nil)
  9. }
  10. func getIndex(w http.ResponseWriter, r *http.Request) {
  11. fmt.Fprintf(w, "hello world!")
  12. }

剩下的就是构建一个Android程序了,这个网上有很多教程,不在此累述了,需要注意的是创建AVD的时候,CPU/ABI选择arm的,自己用的windows系统,Eclipse开发,用的Android 4.4.2的接口。你也可以选用其他版本的,和其他的方式,应该类似。

可以通过向导创建一个Android程序,然后MainActivity的onCreate方法的最后添加上加载go程序的代码,

  1. Process p = Runtime.getRuntime().exec(getApplicationInfo().nativeLibraryDir + "/libArmAndroidApp.so");

这个地方我的程序取名为libArmAndroidApp.so,这个地方如何把.so打包到APK中,也有很多教程。比如我就用的是直接在与src同级目录的libs里面新建了一个文件夹 armeabi , 然后把libArmAndroidApp.so放进去就可以了。注意命名可能需要按照 libxxxxx.so来命名,才会自动打包到APK中。不按照这种命名方式是否就不能打包到APK中,我还没验证过。有兴趣的可以试试。
最后有一点需要注意的是: 如果被打包的GO程序需要用到对应的权限,一定得在打包的这个Android程序里面配置权限。比如我测试程序需要开启web服务器,就需要用到网络,我就必须要开启网络权限,要不然就起不了服务。

Note: GO不太可能写UI,但是可以做基础服务。这种模式下,或许可以玩出很多实用的东西出来。

ft_authoradmin  ft_create_time2018-11-04 19:10
 ft_update_time2018-11-04 19:21