Go Wiki: モバイル
Go モバイル サブリポジトリは、モバイルプラットフォーム(Android と iOS)のサポートを追加し、モバイルアプリケーションを構築するためのツールを提供します。
モバイルスタックに Go を含めるには、2 つの戦略があります
- すべて Go で記述されたネイティブモバイルアプリケーションを作成する。
- Go パッケージからバインディングを生成し、Java(Android 上)および Objective-C(iOS 上)からそれらを呼び出すことによって、SDK アプリケーションを作成する。
この記事では、これらの戦略を実現する方法を説明するステップバイステップガイドを紹介します。
ツール
モバイルツールをインストールするには、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 のみ含まれています。
- アプリの制御と設定
- 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 ファイルを「インストール済みアプリ」セクションにドラッグアンドドロップします。
- 「必要に応じてアイテムをコピーする」オプションをオンにします
または、ios-deploy ユーティリティコマンドラインツールを使用して、アプリケーションバンドルを iOS デバイスにデプロイすることもできます。 ios-deploy を使用して、アプリケーションをデバイスにプッシュします。
$ ios-deploy -b basic.app
アプリのアイコン
assets/icon.png
を作成することで、アプリのアイコンを設定できます。
SDK アプリケーションとバインディングの生成
このカテゴリでは、既存の Android または iOS アプリケーションで Go パッケージを使用する方法を紹介します。
この戦略に従うことの利点
- 既存のアプリケーションに大きな変更を加えることなく、モバイルアプリから Go パッケージを再利用できます。
- Android アプリケーションと iOS アプリケーション間で共通のコードベースを共有する場合、Go で共通の機能を 1 回記述し、バインディングを介して 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 から参照プロジェクトをインポートします。
- アプリケーションをビルドしてデバイスにデプロイします。
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 が更新されます。
Hello.framework
をメインディレクトリに保持することにした場合は、ターゲットのビルド設定でメインディレクトリを `Framework Search Paths` に追加する必要があります。
プロジェクトレイアウトは、以下に示すようになります。
シミュレーターまたは実際のデバイスでビルドして実行します(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 の一部です。