Go Wiki: Mobile
Go 移动子存储库增加了对移动平台(Android 和 iOS)的支持,并提供了构建移动应用程序的工具。
您可以遵循两种策略将 Go 集成到您的移动堆栈中
- 编写全 Go 原生移动应用程序。
- 通过生成 Go 包的绑定来编写 SDK 应用程序,并从 Java(Android)和 Objective-C(iOS)调用它们。
本文将包含分步指南,说明如何实现这些策略。
工具
您需要拥有 Go 1.16 或更高版本才能安装移动工具。
Go Mobile 引入了一个名为 gomobile
的工具,以帮助您完成构建和绑定过程。
gomobile
还支持 Go Modules,例如使用
$ gomobile bind -v -o android.aar -target=android ./package
在一个项目目录中。
在 macOS 上,您需要安装 Xcode 命令行工具。
安装 gomobile
工具
$ go install golang.org/x/mobile/cmd/gomobile@latest
$ gomobile init
以下各节将帮助您了解如何使用 gomobile
工具。
原生应用程序
原生类别包括完全用 Go 编写的应用程序。目前,golang.org/x/mobile 只包含一小组专注于
- 应用控制和配置
- OpenGL ES 2 和 ES 3 绑定
- 资产管理
- 事件管理
- 实验性包包括 OpenAL 绑定、音频、字体、精灵和运动传感器
在 golang.org/x/mobile/example 下有各种示例原生应用程序。我们将构建并部署基本示例到 Android 和 iOS 设备。
获取应用程序。
$ go get -d golang.org/x/mobile/example/basic
构建和部署到 Android
运行 gomobile build
来构建 Android APK。
$ gomobile build -target=android -androidapi 19 golang.org/x/mobile/example/basic
构建命令将构建一个名为 basic.apk 的 APK。
如果包目录中定义了 AndroidManifest.xml,它将被添加到 APK 输出中。否则,将生成默认清单。
如果您在计算机上安装了 adb 命令,您可以使用 gomobile install
来构建 APK 并将其推送到您的移动设备。
$ gomobile install golang.org/x/mobile/example/basic
构建和部署到 iOS
运行 gomobile build
来将包构建为 iOS 应用程序。
注意:target=ios 需要运行 macOS 的主机。您需要获取 签名身份并下载预配配置文件才能继续。
$ gomobile build -target=ios golang.org/x/mobile/example/basic
构建命令将构建一个名为 basic.app
的应用程序包。
您可以通过将 .app 文件拖放到设备上来进行部署。
- 在 Xcode 中,打开 Window > Devices。
- 从左侧窗格中选择物理设备。
- 将 .app 文件拖放到“已安装的应用”部分。
- 选中“需要时复制项目”选项
或者,您可以使用 ios-deploy 命令行工具将应用程序包部署到您的 iOS 设备。使用 ios-deploy 将应用程序推送到您的设备。
$ ios-deploy -b basic.app
应用图标
可以通过创建 assets/icon.png
来设置应用图标。
SDK 应用程序和生成绑定
在此类别中,我们将展示如何将 Go 包用于现有的 Android 或 iOS 应用程序。
遵循此策略的优势
- 您可以在不更改现有应用程序的情况下,从移动应用中重用 Go 包。
- 如果您想在 Android 和 iOS 应用程序之间共享通用代码库,您可以将通用功能编写一次在 Go 中,并通过调用绑定后的 Go 包来将其连接到特定于平台的代码。
当前限制如下。
- 目前只支持 一部分 Go 类型。
- 语言绑定存在性能开销。
- 由于目标语言的限制,导出的 API 的外观有一些限制。
我们将使用 golang.org/x/mobile/example/bind/hello 下的示例包来生成绑定,并从 Java 和 Objective-C 调用 Greetings 函数。
通过运行以下命令获取示例。
$ go get -d golang.org/x/mobile/example/bind/...
构建和部署到 Android
注意:Go Mobile 在与 Go 相同的架构上运行,目前包括 ARM、ARM64、386 和 amd64 设备和模拟器。值得注意的是,Android 在 MIPS 设备上尚不支持。
- 运行以下命令以生成适合导入到 Android 项目的 aar 文件
$ gomobile bind -o app/hello.aar -target=android golang.org/x/mobile/example/bind/hello
提示:从 1.16 开始,建议在每次执行 gomobile bind ...
之前执行 go get -d golang.org/x/mobile/cmd/gomobile
。go get 会自动将间接引用添加到 go.mod。这些间接引用可能会被 ide 或 go mod tidy 自动删除,但它们是必需的!
require (
golang.org/x/mobile v0.0.0-20210716004757-34ab1303b554 // indirect
golang.org/x/mod v0.4.2 // indirect
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
golang.org/x/tools v0.1.2 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
)
- 启动 Android Studio。
- File > Import Project… 从 $GOPATH/src/golang.org/x/mobile/example/bind/android 导入参考项目。
- 构建并部署应用程序到设备。
应用模块包含调用 hello.Greetings
的主应用程序。当应用程序启动时,文本视图将使用返回的字符串值进行更新。
如果您不使用 Android Studio,为了使用 Android 的绑定,您需要安装 Android SDK 并将 ANDROID_HOME 环境变量设置为 SDK 路径。您还需要安装 NDK;最简单的方法是运行 SDK 命令 sdkmanager ndk-bundle
。
或者,如果您不熟悉 Android 开发,并且不想设置所有必需的环境(Android SDK、Gradle 等),您可以使用 此 Docker 镜像在 Docker 中构建应用程序。
此外,如果您尝试将 yourmodule.aar 添加到您自己的项目中,在将 yourmodule.aar 文件和 yourmodule.jar 文件复制到“android\app”文件夹后,需要在“android\app\build.gradle”文件中进行以下编辑,以便正确导入您的模块。
+ repositories {
+ flatDir {
+ dirs '.'
+ }
+ }
dependencies {
...
+ implementation (name:'yourmodulename', ext:'aar')
}
构建和部署到 iOS
注意:target=ios 需要运行 macOS 的主机。
$ cd $GOPATH/src/golang.org/x/mobile/example/bind
$ gomobile bind -target=ios golang.org/x/mobile/example/bind/hello
Gomobile bind 将生成一个名为 Hello.framework
的框架包。通过运行以下命令打开示例 Xcode 项目。
$ open ios/bind.xcodeproj
将 Hello.framework
包拖放到 Xcode 项目中。如果需要 Xcode 内框架包的独立副本,请选中“需要时复制项目”,否则。否则,修改 Go 包源代码并重新运行 gomobile bind
将会更新 hello.framework。
如果您决定将 Hello.framework
保留在主目录中,您必须将主目录添加到目标构建设置中的 Framework Search Paths
。
您的项目布局应如下图所示。
在模拟器或实际设备上构建并运行它(Cmd+R)。当应用程序启动时,主视图上的标签将通过调用 hello.Greetings
函数的 GoHelloGreetings
返回的字符串进行修改。
请注意,您也可以通过导入 Hello 来从 Swift 调用 GoHelloGreetings
。
@import Hello
// ...
let msg = Hello.GoHelloGreetings("gopher")
iOS 模拟器
从 Go 1.5 开始,只有 darwin/amd64 在 iOS 模拟器上可用。要使用模拟器,您需要配置 Xcode 只尝试运行 64 位二进制文件。
Xcode 在 X86 模拟器上运行时会匹配 ARM 二进制文件的位宽。也就是说,如果您将 Xcode 配置为构建 32 位和 64 位 ARM 二进制文件(默认),它将尝试在模拟器上运行 32 位 X86 二进制文件,这与目前的 Go 不兼容。修改 Xcode 构建设置以仅构建 64 位 ARM 二进制文件,模拟器将运行 amd64 二进制文件。
此内容是 Go Wiki 的一部分。