Go Wiki:移动设备
Go 移动设备子存储库增加了对移动平台(Android 和 iOS)的支持,并提供了构建移动应用程序的工具。
您可以遵循两种策略将 Go 纳入您的移动设备堆栈
- 编写全 Go 原生移动应用程序。
- 通过从 Go 软件包生成绑定并从 Java(在 Android 上)和 Objective-C(在 iOS 上)调用它们来编写 SDK 应用程序。
本文将包含分步指南,说明如何实现这些策略。
工具
您需要安装Go 1.16 或更高版本才能安装移动设备工具。
Go Mobile 引入了一个工具,gomobile
,以帮助您完成构建和绑定过程。
gomobile
也支持 Go 模块,例如使用
$ 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 中,打开窗口 > 设备。
- 从左窗格中选择物理设备。
- 将 .app 文件拖放到“已安装的应用程序”部分。
- 选中“在需要时复制项目”选项
或者,你可以使用 ios-deploy 实用程序命令行工具将应用程序包部署到你的 iOS 设备。使用 ios-deploy 将应用程序推送到你的设备。
$ ios-deploy -b basic.app
应用图标
可以通过创建 assets/icon.png
来设置应用程序图标。
SDK 应用程序和生成绑定
在此类别中,我们将向你展示如何在现有 Android 或 iOS 应用程序中使用 Go 包。
遵循此策略的优势
- 你可以从移动应用程序中重复使用 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 设备和模拟器。值得注意的是,目前还不支持 MIPS 设备上的 Android。
- 运行以下命令以生成适合导入到 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。
- 文件 > 导入项目…从 $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)。当应用程序启动时,主视图上的标签将使用从 GoHelloGreetings
返回的字符串进行修改,该字符串调用 hello.Greetings
函数。
请注意,你还可以通过导入 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 的一部分。