打包Golang并在Android环境下运行
2018年01月01日 23:14:42 immortalCockroach 阅读数:1761
https://blog.csdn.net/lszy24/article/details/78948130
打包在android下的可执行程序
打包的代码如下,作用是输出运行的操作系统的信息:
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
其中打包的文件只有上面的一个,文件名为android.go
当Mac或者Linux环境下有Go以及adb的环境即可编译运行,在Go文件所在的目录下执行打包的命令,命令如下:
CGO_ENABLED=0 GOARCH=arm GOOS=linux go build -o target-android android.go
运行该命令后可以得到target-android的可执行文件。
其中GOARCH
和GOOS
指定了目标的CPU和操作系统类型GOARCH和
GOOS`相关。
如果分别指定amd64和darwin则打包的结果可以直接在mac下运行。
在android下运行
在此之前需要保证安装了adb以及手机开启了调试模式。
使用命令adb devices
可以查看pc端连接的设备。
确定了打包和设备连接没问题后,使用adb push命令将打包的结果传到手机上,并执行响应的程序。具体的命令步骤为:
adb push ./target-android /data/local/tmp
adb shell # 进入android设备的shell环境
cd /data/local/tmp
chmod +x ./target-android #赋予执行的权限
./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,执行
sudo CGO_ENABLED=0 GOARCH=arm GOOS=linux ./make.bash
交叉编译环境好了后,进入自己写的代码所在目录,执行命令
CGO_ENABLED=0 GOARCH=arm GOOS=linux go build
就可以编译出linux arm平台的程序了。
自己写的测试程序源码如下
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", getIndex)
http.ListenAndServe(":8888", nil)
}
func getIndex(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world!")
}
剩下的就是构建一个Android程序了,这个网上有很多教程,不在此累述了,需要注意的是创建AVD的时候,CPU/ABI选择arm的,自己用的windows系统,Eclipse开发,用的Android 4.4.2的接口。你也可以选用其他版本的,和其他的方式,应该类似。
可以通过向导创建一个Android程序,然后MainActivity
的onCreate方法的最后添加上加载go程序的代码,
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_update_time2018-11-04 19:21