[TOC]
环境
- 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
安装 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
初始化会等几分钟,看网速,初始化后才可以正式使用!
gomobile 介绍
gomobile 可以让golang在移动设备中使用
- bind 动态库方式native开发
- build 直接生成移动应用
- install 将生成的app,安装到设备或者模拟器
- clean 清空缓存
一般使用bind方式开发,build方式还是试验性的
在移动设备中使用 golang 动态连接库
- 准备
gomobile bind 查看帮助文档
gomobile bind -help
执行这个命令的时候注意 Go版本 GOPATH 等,这是go开发的基础,不属于这篇文章的内容
一个没有错误的golang项目文件包,注意文件包的包名,后面会用到
后面示例的golang伪代码为 package.go
package [GoPackageName]
func[GoFunction] (in tpye) type {
}
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]();
}
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 自动生成帮助文档
[package].Go[PackageName][GoFunction](type)
使用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
利用strip 工具来减少Android 的 so的大小
strip 工具会去掉debug和符号信息
测试可以减少到原来的 60%左右工具在 android-ndk 的目录中
类似
cd android-ndk/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/bin
./strip [yourOSFile]
优化前需要备份,并测试一下是否优化后是否可以使用
golang运行效率问题,native bind效率问题
单独拉出来说的原因是,native bind肯定存在效率问题,没有争议的,看你的功能是否不在意效率
golang的运行效率问题,大兄弟,语言的运行效率肯定在程序员的手上,没有废材的语言,只有不努力的程序员
有疑问加站长微信联系(非本文作者)