Rust (cargo-ndk) でビルドした Android 向け Unity プラグインを 16KB アライメントに対応する
Rust (cargo-ndk) でビルドした Android 向けプラグインを含む Unity プロジェクトを Unity 2023.3.56f1 または 6000.0.38f1 以降でビルドすると以下のような警告が表示される場合があります。ここではこの警告に対応するための手順を説明します。
Plugin 'Packages/com.example.myplugin/Plugins/MyPlugin.so' is not 16KB-aligned. This may cause issues on ARM64 devices running Android 15+.
More info: https://developer.android.com/guide/practices/page-sizes.
これは Android 15 以降の ARM64 デバイスで対応した 16KB アライメントモードとの互換性の警告で、Unity は上記のバージョン以降で 16KB アライメントモードをサポートしたことにより 4KB アライメントでビルドされたプラグインに対して警告するようになったようです。
- 16 KB ページサイズのサポート | Compatibility | Android Developers
- Unity の 16 KB memory page size support のドキュメント (Unity 2023.3, Unity 6000.0)
Rust でのライブラリーのビルド
対応方法は Android のドキュメントの "16 KB ELF アライメントを使用してアプリをコンパイルする"に従って対応するだけですが、Rust (cargo-ndk) を使ってライブラリーを作っている場合の手順をここで紹介します。
対応方法1: Android NDK r28 以降を使用する
これはドキュメントに書いてある通りですが Android NDK r28 以降はデフォルトで 16KB アライメントでコンパイルされるようになるので NDK を新しくすれば OK です。
対応方法2: rustflags を指定する
もう一つの対応方法は NDK のバージョンを変更せずリンカーのオプションを指定する方法です。例えば r27 を使用している場合などはこれで対応できます。
これもオプション自体はドキュメントに書いてあるので、.cargo/config.toml
あたりに rustflags
で書いておきます。
[target.aarch64-linux-android]
rustflags = ["-C", "link-args=-Wl,-z,max-page-size=16384"]
Unity の meta の修正
ビルドしたライブラリーで差し替えれば完了ではなくそのままだと警告が出続けます。ちなみにインスペクターで当該ライブラリーを選択した際もインスペクター内に警告文が表示されます。
これは .meta に 16KB アライメント対応かどうかのフラグがあり、このフラグは初回インポート時にしか更新されないためのようです(6000.0.48f1 時点では Reimport しても変わりませんでした)。
ということでこれに対応するには .meta に Is16KbAligned: true
を手で追加するか、一度 .meta を作り直す必要があります。
Is16KbAligned: true
を手で追加するのが楽ではありますが、その場合でも念のためアライメントを確認するか適当に .meta を生成させて確認することをお勧めします。
Discussion