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 的一部分。