🤖
[Bevy] Android向けにビルドする
BevyをAndroidで動かすにはGradleをCPUネイティブなJNIライブラリとリンクする必要があります。そうすることでMainActivityでBevyゲームが呼び出されてプレイできるようになります。
手順
- Android Studioで新規プロジェクト(GameActivity c++)を選択
- こちらのCMaikeLists.txtとcpp/dummy.cppを同じDirにコピー
- app/src/main/jnilibsにcargo-ndkでビルド(コマンドはcargo ndk -t arm64-v8a -o C:\Users\username\AndroidStudioProjects\bevy_mobile_example7\app\src\main\jniLibs build)
- 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" }
- 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
}
- Android Studioのプロジェクトディレクトリのappで右クリックしてGradleとネイティブライブラリをリンク
- 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>
- 物理デバイスと接続した状態で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ファイルを扱いやすくなってます。
Discussion