Golang for Android or iOS 使用记录

泛原罪 · · 1685 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[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 自动生成帮助文档

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

[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的运行效率问题,大兄弟,语言的运行效率肯定在程序员的手上,没有废材的语言,只有不努力的程序员


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:泛原罪

查看原文:Golang for Android or iOS 使用记录

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1685 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传