Android16(APIレベル36)に対応した

Google Playは2026年8月31日から、新規アプリ・アップデートにAndroid16以上を要求する。延長申請をすれば11月1日まで猶予はあるが、素直にSDK側で対応することにした。


使っていたUnityのバージョンは6.4系だった。設定画面でAndroidの対象APIレベルを36に変更し、保存も実行。ところが実際にビルドしたファイルの中身を確認すると、いつまでも35のままだった。手動で変更して保存しても反映されず、自動で最新版を使う設定にしても、実際にインストールされている最新版ではなく6.4系があらかじめ決めている値(35)に落ち着いてしまう。ビルドの処理を行うコード側で36を明示的に指定してみても、ログには36と出るのに、実際に生成されたビルド設定を見るとやはり35のままだった。

調べてみると、Unity側はAndroid16の正式版が出る前の時点から、ビルドツール類を36系に更新済みだったと公式のリリースノートに書かれていた。つまり対応自体は早かった。ただしそれは、SDKのツール群を36に更新したという意味にとどまり、設定画面で36を選んだ際に実際にビルド設定へ正しく36を渡せるかどうかは、また別の話だったことになる。「対応した」という発表と、実際の挙動が伴っていなかったということであり、これは毎年同じAPIレベル更新のたびに繰り返されている構造的な問題のように見える。」

つまり「36を指定できる」ことと「実際に36でビルドできる」ことは別物だった。6.4系はAndroidのSDK自体は36を追加インストールできても、ビルドの仕組みの中では35に丸めてしまう作りになっていたということになる。


原因が確定したので、最終的にはビルド設定を生成するテンプレートファイルを直接書き換えて36を固定する方法に切り替えた。テンプレートの中には、全体設定として使うコンパイル用のバージョン番号と、個別のアプリごとに使う対象バージョン番号の、2種類の書き換え対象がある。この2つの配置場所を一度取り違えてしまい、両方とも同じ種類の項目として書いてしまったため、ビルドがエラーで止まった。全体設定用の番号はアプリ全体の設定の直下に、個別のアプリ向けの番号は各アプリの詳細設定の中に、それぞれ正しく書き分ける必要がある。この配置を直したところ、無事にビルドが通った。


もう一つ、別の壁にもぶつかった。targetSdk36対応の過程で、思い切ってUnity本体を6.5系に上げてみたところ、今度はまったく別のエラーが出てきた。以前から入れていた色管理用の外部プラグインと、未使用アセットを検出するツールが、Unity側のエディタ機能の仕様変更によってコンパイルできなくなっていた。さらにUnity純正のパッケージ側でも、同じ機能の名前が重複するという別種のエラーが出るようになり、症状が次々と変化していった。


そこでプロジェクト内を検索してみたところ、色管理用の外部プラグインは実際のアプリのどこからも参照されていないことが分かった。色管理はすでに、共通の設定値を自前のコードで画面のパーツに反映する独立した仕組みに置き換え済みで、外部プラグインには依存していなかった。そのため、色管理プラグインと未使用アセット検出ツール、あわせて使っていなかった自動リロード系のツールも含めて、まとめて削除する方針にした。6.5系への移行はこの整理を終えてから改めて検討することにし、今回のtargetSdk36対応自体は6.4系のまま、テンプレート直接書き換えという方法で乗り切った。


結局、テンプレート側で直接36を固定する方法に切り替え、これで53本すべてをビルドし、審査に提出し、公開まで完了した。


年次のAPIレベル要件は、設定画面の数値を変えるだけでは終わらない。使っているUnityのバージョンがそもそも新しいAPIレベルのビルドに対応しているか、依存している外部プラグインが新しい仕様についてこられるか、その両方を確認する必要がある。(アホらしい、なんでUnityは確認していないんだ…)