美文网首页Golang 技术学院我爱编程
Golang for Android or iOS 使用记录

Golang for Android or iOS 使用记录

作者: 木猫尾巴 | 来源:发表于2016-09-08 12:30 被阅读1680次

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

    相关文章

      网友评论

      • rcy1122:go里面的日志怎样输出到终端?比如iOS
        rcy1122:@xsr 没报错
        木猫尾巴:@xsr 文章里说了,看网速
        xsr:大兄嘚,gomobile init 你那边会报错吗
      • WangGavin:那一个RAM为4G的旧手机,岂不是可以轻松跑一个网站,貌似比树莓派还超值
        木猫尾巴:@newtrek 目前大量golang编写的代理软件,golang编写的web容器,P2P的容器用这个技术做的移植
        当然包括建站了

      本文标题:Golang for Android or iOS 使用记录

      本文链接:https://www.haomeiwen.com/subject/shpsettx.html