Go Wiki: モバイル

Go モバイル サブリポジトリは、モバイルプラットフォーム(Android と iOS)のサポートを追加し、モバイルアプリケーションを構築するためのツールを提供します。

モバイルスタックに Go を含めるには、2 つの戦略があります

この記事では、これらの戦略を実現する方法を説明するステップバイステップガイドを紹介します。

ツール

モバイルツールをインストールするには、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 には、以下に焦点を当てた少数の pakket のみ含まれています。

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 を実行する必要があります。続行するには、署名 ID を取得し、プロビジョニングプロファイルをダウンロードする必要があります。

$ 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

app モジュールには、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 シミュレーターで動作します。 シミュレーターを使用するには、64 ビットバイナリのみを実行するように Xcode を構成する必要があります。

Xcode は、X86 シミュレーターで実行する場合、ARM バイナリのビット幅と一致します。 つまり、32 ビットと 64 ビットの両方の ARM バイナリをビルドするように Xcode を構成すると(デフォルト)、シミュレーターで 32 ビット X86 バイナリを実行しようとしますが、これは今日の Go では機能しません。 Xcode ビルド設定を変更して 64 ビット ARM バイナリのみをビルドすると、シミュレーターは amd64 バイナリを実行します。


このコンテンツは、Go Wiki の一部です。