x86なAndroid 11でUnity製ゲーム
Posted At:
忙しい人は一番下のまとめだけ読んでもらえれば良いかと。
Unity製のAndroidアプリは随分前にx86が切り捨てられてx86なタブレットでUnityのゲームを遊ぶのは不可能になると思っていたら、x86なChromebookでデレステやらプロセカが普通に動いていて切り捨てられたんじゃなかったのかと思ってしまいます。
実際のところ、Unityは確かにx86を切り捨てていて、Androidのapkファイルの中にはarmの共有ライブラリしか入っていません。
※これはaabでarm64に最適化されたapkなのでarm64-v8aしかないのは当たり前ではある。
このarm64なapkをChromebookに放り込むと普通にインストールされるんですよね。
これが出来る理由は少し昔に流通していたx86なAndroidタブレットや最近のChromebookにarmのバイナリを実行時にx86のバイナリに変換しながら実行する変態的な処理をする仕組みが入っているためです。
この仕組みをAndroidではNative Bridgeと呼んでいます。
Android 9以前はNative Bridgeに対応するARMトランスレーターはIntelが作っているhoudiniだけでした。 Chromebookに内蔵されているAndroidランタイムはほんの少し前まではAndroid 9で、Android 9用のhoudiniが入っているのでarmしか対応していないUnity製ゲームも普通に動いていたわけですね。 Androidランタイム内に/system/bin/houdiniや/system/bin/houdini64などがあるかどうかで確認出来ます。
Android 11になって、libndk_translationというARMトランスレーターが出てきました。
これは多分Googleが作ったもので、アプリ開発用のx86版Android 11の仮想マシンにインストールされています。
これが出た当時はAndroid 11版のhoudiniは無かったのでAndroid 11でARMのアプリを動かすならこれ以外に選択肢がありませんでした。
libndk_translationはhoudiniと比べてパフォーマンスがあまり良くなくゲームの類はカックカクだったため私のようなx86マシンでAndroidのゲームをやりたい勢としてはAndroid 9でやるしかありませんでした。
尚、houdiniもlibndk_translationもプロプライエタリなモジュールなのでググっても公式からモジュール本体をダウンロードすることは出来ず、必要なら自分で仮想マシンから引っこ抜いたりChrome OSのリカバリイメージから引っこ抜く必要があります。(個人で使うのならおそらく怒られないでしょうがそれを二次配布したりするのは危ないと思っています)
最近になって、Chrome OSがバージョンアップされてChrome OS 91がリリースされました。
91ではChrome OS内のAndroidランタイムが11に更新されてそれに合わせてAndroid 11版のhoudiniも付属しています。
Android 11版のhoudiniはAndroid 9の時と同じくプロセカなどのリズムゲームでもそこそこのパフォーマンスで動作します。
ただ、Chrome OSは91からAndroidランタイムをコンテナから仮想マシンに変更したことにより、プロセカでは効果音が盛大にズレたり前と比べてちょっとラグりやすくなったりしていて、私としてはこれは非常に頂けない状況です。
私は前からAndroid 11を自前でビルドして自分のThinkPad X1 Yogaに入れてみたりしていたので、Android 11版のhoudiniをこれに移植してみたらChrome OSより快適に動作しました。
今はまだAndroid 11版のhoudiniを使ったAndroid x86のようなカスタムROMやOSは出てきていませんがそのうちいろいろ出てくるんじゃないでしょうか。
最近話題のWindows 11でもARMトランスレーターとしてhoudiniが使われそうな感じがしますね。
もっとも、GMSが搭載されないとのことなのでプロセカを遊ぶのは無理なわけですが。。。
まとめ
新しいバージョンのChrome OS 91にIntelのhoudiniのAndroid 11版が搭載されている。
これを使うと任意のx86マシンのAndroid 11でもプロセカのような音ゲーがそれなりのパフォーマンスで遊ぶことが出来る。
Tag: Android