Go Wiki: モバイル

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

Goをモバイルスタックに組み込むには、2つの戦略があります。

  • Goのみでネイティブモバイルアプリケーションを記述する。
  • Goパッケージからバインディングを生成し、Java(Android上)およびObjective-C(iOS上)から呼び出すことでSDKアプリケーションを記述する。

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

ツール

モバイルツールをインストールするには、Go 1.16以降が必要です。

Go Mobileは、ビルドおよびバインディングプロセスを支援するツールgomobileを導入しています。

gomobileGoモジュールもサポートしています。例えば、

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

$ gomobile build -target=ios golang.org/x/mobile/example/basic

ビルドコマンドは、basic.appという名前のアプリケーションバンドルをビルドします。

.appファイルは、デバイスにドラッグアンドドロップすることでデプロイできます。

  • Xcodeで、Window > Devicesを開きます。
  • 左側のペインから物理デバイスを選択します。
  • .appファイルを「Installed Apps」セクションにドラッグアンドドロップします。
  • 「Copy items if needed」オプションをチェックします。

Deploying app bundle

あるいは、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を起動します。
  • 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内でフレームワークバンドルの別のコピーが必要な場合は、「Copy items if needed」をチェックします。そうでない場合、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現在、iOSシミュレーターではdarwin/amd64のみが動作します。シミュレーターを使用するには、Xcodeを64ビットバイナリのみを実行するように構成する必要があります。

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


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