🤖

[Bevy] Android向けにビルドする

に公開

BevyをAndroidで動かすにはGradleをCPUネイティブなJNIライブラリとリンクする必要があります。そうすることでMainActivityでBevyゲームが呼び出されてプレイできるようになります。

手順

  1. Android Studioで新規プロジェクト(GameActivity c++)を選択
  2. こちらのCMaikeLists.txtとcpp/dummy.cppを同じDirにコピー
  3. app/src/main/jnilibsにcargo-ndkでビルド(コマンドはcargo ndk -t arm64-v8a -o C:\Users\username\AndroidStudioProjects\bevy_mobile_example7\app\src\main\jniLibs build)
  4. libs.versions.tomlを以下のように変更
libs.versions.toml
[versions]
agp = "8.4.0"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
appcompat = "1.6.1"
material = "1.10.0"
gamesActivity = "2.0.2"

[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
games-activity = { group = "androidx.games", name = "games-activity", version.ref = "gamesActivity" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
  1. app/build.gradleを以下のように変更
build.gradle
plugins {
    alias(libs.plugins.android.application)
}

android {
    namespace 'org.bevyengine.bevy_mobile_example'
    compileSdk 34

    defaultConfig {
        applicationId "org.bevyengine.bevy_mobile_example"
        minSdk 30
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ''
                arguments "-DANDROID_STL=c++_shared"
            }
        }
        ndk {
            abiFilters 'arm64-v8a','x86_64'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    buildFeatures {
        prefab true
    }
    packagingOptions {
        exclude 'lib/*/libdummy.so'
    }
    externalNativeBuild {
// Gradleとcppをリンクすると自動的に以下のブロックが生成されます。リンクする前にcmakeブロックがあるとリンクができない。
//        cmake {
//            path file('CMakeLists.txt')
//            version '3.22.1'
//        }
    }
}

dependencies {

    implementation libs.appcompat
    implementation libs.material
    implementation libs.games.activity
    testImplementation libs.junit
    androidTestImplementation libs.ext.junit
    androidTestImplementation libs.espresso.core
}
  1. Android Studioのプロジェクトディレクトリのappで右クリックしてGradleとネイティブライブラリをリンク
  2. AndroidManifest.xmlを以下のように変更
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="Bevy Example"
        android:roundIcon="@mipmap/ic_launcher"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        tools:targetApi="33">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:configChanges="layoutDirection|locale|orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
            android:theme="@style/Theme.AppCompat.NoActionBar">
            <meta-data
                android:name="android.app.lib_name"
                android:value="bevy_mobile_example" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  1. 物理デバイスと接続した状態でrun appするとゲームが立ち上がる

GameActivityのバージョン

GameActivityのバージョンは7つ(1.0, 1.1, 1.2, 2.0, 2.1, 3.0, 4.0)のリリースがあります。
その中で2.0(厳密には2.0.2)のみ動作を確認しました。
NativeActivityでも動作しますがGameActivityを使用することが推奨されています。

おまけ

ほかにもこちらを使った以下のようなやり方もあります。

git clone https://github.com/NiklasEi/bevy_game_template.git

を実行して

cd bevy_game_template
cargo apk run -p mobile

を実行すると接続されているデバイスでアプリが立ち上がります。Android SDK, Android NDKのパスを設定するのを忘れないでください。

私はAndroidしか試していませんが他にもWindows, macos, Iphone, Webを対象にビルドできるようです。
コントリビューターの方々には頭が上がりません。
アンドロイド向けのビルドチュートリアルをEric Horton氏が再度公開しておりました。Android Studioで直接ビルドできるので上記の方法よりもApk, aabファイルを扱いやすくなってます。

  • 一部のデバイスでsegfaultエラーがでるということが報告されています
  • Bevyの開発チームでは実機のテストを行い、様々なデバイスでの動作のチェックをしているそうです。
  • 初心者向けに手取り足取り手順を解説してくれている人がいました!こちらです。

Discussion