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 文件拖放到“已安装的应用”部分。
  • 选中“需要时复制项目”选项

Deploying app bundle

或者,您可以使用 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 导入参考项目。

Android Studio

  • 构建并部署应用程序到设备。

应用模块包含调用 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。

Drag and drop Hello.framework

如果您决定将 Hello.framework 保留在主目录中,您必须将主目录添加到目标构建设置中的 Framework Search Paths

Framework Search Path in Xcode Project

您的项目布局应如下图所示。

Xcode project layout with Hello.framework

在模拟器或实际设备上构建并运行它(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 的一部分。