通过gomobile为移动端<android、ios>编写sdk
前言
为了能在移动端使用go语言打包的程序(如使用gin、gorm、gen、FTP、webdav服务等), 我先尝试了直接在移动端调用运行由go+gcc交叉编译的二进制文件, 发现由于移动端的权限限制, 虽技术上行得通, 但实际的可行性太差, 于是乎我想到了通过打包sdk的方式, 满足需求。 而本文,就是对后者的尝试。
在此文章https://srackhall.top/2023/09/17/capacitor-fragments/最开始, 有我对在移动端调用运行由go+gcc交叉编译的二进制文件的尝试, 感兴趣的可以去阅读, 欢迎邮件交流。
- 最终, 实现了sdk调用, 不过需要注意的是, 目前我们只能引入一个sdk(即使需要多个arr, 但也请将其合并后打包成一个add)
- sdk的形式, 完全拥有go语言本身的完整运行时。(比如go中的init函数, 即使多次调用此模块下的函数, init也只会在模块内函数首次被调用之前执行一次, 并不会重复执行)
android studio环境
这个就不过多赘述了, 下图中所圈的两项, 最好给带上
说实话, 关于环境搭建过程中涉及的licenses
授权同意, 我确实没太注意, 貌似android studio安装的过程中就已经同意过了吧, 下次更换电脑重新配置时注意一些这个点哈哈, 总之这里一般没什么坑。
环境配置的参考链接:
- https://quasar.dev/quasar-cli-vite/developing-capacitor-apps/preparation
- https://developer.android.com/studio/projects/install-ndk?hl=zh-cn
gomobile下载安装
1 | go install golang.org/x/mobile/cmd/gomobile@latest |
需要注意的是: 不要通过go get这种的方式去间接安装, 因为此种方式并不会自动构建二进制文件, 我们需要gomobile的二进制文件, 因此请使用install来构建二进制文件。
说些题外话, 官方给的android项目过于老旧, 这里若你和我一样是下载的最新的android studio, 不建议使用官方的这个示例(个人在这上面浪费了宝贵的半个小时, 仅是因为版本问题, 这也是唯一的坑了, 请主动避免), 否则就会如下图所示:
> 本表为2023年9月21日编写, 至少目前为止, 官方文档的sdk相关章节, 略显老旧(不过无伤大雅, 都是能解决的小问题), 因此请注意时效性, 也许你看到的官方文档已经更新了。
gomobile bind 命令生成原生代码绑定
对于项目中使用, 可以通过makefile或sh文件来封装以简化流程。
android端
可以在终端通过 gomobile bind -h
查看此命令的用法。
在执行真正的gomobile bind
命令前, 请先执行go get -d golang.org/x/mobile/cmd/gomobile
命令。
这里需要注意的是, 执行
gomobile bind
命令时的模板与官方文档有出入, 要使用gomobile bind -o <outPath> -target=android -androidapi 19 <mod名称>
(若你看到的官方文档中sdk章节有-androidapi, 则说明官方文档已经更新不再老旧了)
- -o 表示输出路径, 后面紧跟你要输出的路径, 路径末尾的最终文件后缀必须以.aar结尾。(路径不能是未知路径, 因为此命令不会自动创建文件夹, 因此若想指定文件目录的话必须提前手动创建对应目录)
- -androidapi 表示使用的安卓api版本, 请注意由于最新版本android studio的优化更新, 此版本号是必须指定的, 否则可能会出现未知错误。 (我这里使用的quasar中, 在android的
根build.gradle
中指定的默认版本为22~33, 因此需按照最低支持版本来构建, 否则在android studio执行时会包api可能存在不兼容的错误。)- 然后是java的版本问题, 其实这里对于java的使用, 无非是生成.jar时, 通过jdk来生成代码, 因此对于版本是没有要求的, 但一定要把某个版本的jdk目录路径, 添加到环境变量中去(比如添加的path中就行)
这里题外话, 介绍下java, 我在系统中安装了 java8和java-17两个版本, 安装后如图所示
此命令执行后, 我们会得到两个文件 .aar 和 .jar
那么我们如何使用它们呢?
在原生项目中引入生成的原生代码绑定
android studio中
我们可将 .aar 和 .jar 两个文件, 放入app/libs/
目录下(此目录与 src
目录同级), 对于libs
目录的介绍, 可在此处查看
然后, 我们需要在app
目录下的build.gradle
文件中, 添加如下代码:
1 | repositories { |
推荐的后续方式
那么接下来, 我们只要刷新项目, 以加载我们刚刚为项目做的配置, 即可在android原生中正常调用使用我们的go函数了。刷新方式如下图:
![]()
或
![]()
那么此时, 就可以正常使用go中定义的包名以及此包中的功能的函数了。如遵循官方示例的下图:
另一种可行的后续方式(不推荐)
代码添加后, 我们可在.jar文件上右键, 选择Add As Library...
, 如下图
![]()
若你的项目也是多个层级的, 也能会有二级选择窗口, 如下图
![]()
进一步, 可以在如图所示的ui操作下, 在所打开面板的Dependencies中, 管理您对于 .arr 和 .jar的配置(比如删除掉之前用右键Add As Library...
在此处添加的.jar)。 具体用法可参考此文档
那么此时, 就可以正常使用go中定义的包名以及此包中的功能的函数了。如遵循官方示例的下图: