Golang for Android or iOS 使用记录

澳门新葡亰手机版 1

虽然 Go 并不是一门新语言,不过最近两年来 Go
还是增加了很多有趣的特性,而且使用这门语言的知名项目的数量也在快速的增长。我写过一篇文章,介绍了
SitePoint
用到的编程语言,其中提到了移动端的支持,所以我觉得需要研究一下可能性。

[TOC]

我很高兴 Android 是支持 Go 语言的,这一方面应该是二者都是 Google
的技术,另一方面恐怕也与开发者希望用 Go 替换 Java 的愿望有关。

环境

  • OSX 10.10.5
  • jdk1.8.0_92
  • golang 1.7
  • Android SDK 25.1.7
  • Andorid-NDK-r12b
  • Andorid Studio 1.5.1
  • xcode 7.2.1
  • swift 2.1.1

目前golang bind 支持的类型说明

https://godoc.org/golang.org/x/mobile/cmd/gobind

澳门新葡亰手机版 1

安装 gomobile

go get -u -v golang.org/x/mobile

会报告一个错误

package golang.org/x/mobile: no buildable Go source files in /Users/sinlov/go/src/golang.org/x/mobile

无视,这个是因为这不是一个可以build的项目,你以后也需要这些库,全down下来吧

遇到类似的问题可以使用 -d
参数来规避test代码导致的无法build问题,不过如果本来就不是一个可以build的目录,go
get 命令会去尝试构建,仍然会警告你

  • 安装 go mobile

go get -v golang.org/x/mobile/cmd/gomobile

�然后,翻墙走起,运行

gomobile init

初始化会等几分钟,看网速,初始化后才可以正式使用!

开始

你需要安装 Golang 1.5+。

接下来需要安装
GoMobile
工具,用于编译和运行 Android 和 iOS 的应用:

go get golang.org/x/mobile/cmd/gomobile
gomobile init

我们会参考 gomobile 包里的例子,位于
GoLangInstalldir/src/golang.org/x/mobile/example/。如果你没有安装这些例子,参考下面的命令来安装:

go get -d golang.org/x/mobile/example/basic

gomobile 介绍

gomobile 可以让golang在移动设备中使用

  • bind 动态库方式native开发
  • build 直接生成移动应用
  • install 将生成的app,安装到设备或者模拟器
  • clean 清空缓存

一般使用bind方式开发,build方式还是试验性的

构建和安装 Go 的 Native 应用

对于很多应用,编译 Go 的 Native
应用时,忽略那些平台相关的库和接口是可以接受的。如果是这样的情况,编译已有的
Go 代码是很轻松的,我们可以选择使用一个功能子集,这些功能包括:

  • App 控制和配置
  • OpenGL ES 2
  • 资源管理
  • 事件管理
  • 一些实验性的包,包括 OpenAL、audio、font、sprite 和运动传感器

我们将从已有的 gomobile
项目里的一些例子开始,你可以用自己项目里的文件替换它们。

在移动设备中使用 golang 动态连接库

  • 准备

gomobile bind 查看帮助文档

gomobile bind -help

执行这个命令的时候注意 Go版本 GOPATH
等,这是go开发的基础,不属于这篇文章的内容

一个没有错误的golang项目文件包,注意文件包的包名,后面会用到

后面示例的golang伪代码为 package.go

package [GoPackageName]

func[GoFunction] (in tpye) type {
}

Android

Android 使用

gomobile bind -target=android [packageName]
gomobile bind -target=android -o [output][packageName]

会在当前目录生成这个包名命名的一个 .arr文件

默认情况下输出支持平台是 armeabi-v7a arm64-v8a x86 x86_64

使用 Android Studio 导入这个 arr 文件后

Android 使用类似

import go.package.[GoPakcageName];
private void (){
  [GoPakcageName].[GoFunction]();
}

构建一个 Android 的 APK 包

gomobile build -target=android golang.org/x/mobile/example/basic

iOS 使用

gomobilebind-target=ios[packageName]
gomobilebind-target=ios-o [output][packageName]

会生成一个对应 [工程包名].framework 的 bundle,把这个 bundle 拖拽到
iOS 项目中

使用的时候类似

#import"hello/Hello.h"
Go[PackageName][GoFunction](@ type);

如果想使用 swift

澳门新葡亰手机版,swift 自动生成帮助文档

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

[package].Go[PackageName][GoFunction](type)

部署到设备上

gomobile install golang.org/x/mobile/example/basic

使用golang的意义

这个是最容易撕逼的地方,技术的意义就是自己闭嘴做,别管别人怎么说

golang for mobile 本质是让go build 的时候使用 arm 或者 x86
指令集进行编译,和移动的native开发没啥区

你可以使用

gomobile bind-target=android/arm,android/386 [pakcageName]

来指定对应的输出平台

  • 好处是可以共用代码,比开发native效率高不少
  • 坏处是go生成的本地包比较大2MB以上

在未来,这个so文件的大小不是问题,当前环境可能会让某些强迫症技术负责受不了

当年谣传,比尔盖茨说内存只需要640K,这个谣传真假不知道,只知道现在手机随便RAM都是2G,ROM起跑16G