Go Wiki:移动设备

Go 移动设备子存储库增加了对移动平台(Android 和 iOS)的支持,并提供了构建移动应用程序的工具。

您可以遵循两种策略将 Go 纳入您的移动设备堆栈

本文将包含分步指南,说明如何实现这些策略。

工具

您需要安装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 仅包含专注于以下内容的一小部分软件包

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 文件拖放到设备来部署它们。

Deploying app bundle

或者,你可以使用 ios-deploy 实用程序命令行工具将应用程序包部署到你的 iOS 设备。使用 ios-deploy 将应用程序推送到你的设备。

$ ios-deploy -b basic.app

应用图标

可以通过创建 assets/icon.png 来设置应用程序图标。

SDK 应用程序和生成绑定

在此类别中,我们将向你展示如何在现有 Android 或 iOS 应用程序中使用 Go 包。

遵循此策略的优势

当前限制如下。

我们将使用 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。

$ 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

应用程序模块包含调用 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)。当应用程序启动时,主视图上的标签将使用从 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 的一部分。