UnityでカスタムAndroidManifestを使ったらビルドできなくなった話

App

UnityでAndroidアプリをビルドする際、機能追加のためにAndroidManifest.xmlをカスタム化すると、突然ビルドエラーが発生してハマることがあります。

私が開発している「MinuteMind」でも、Google Drive連携やアラーム制御のためにカスタムマニフェストを導入したところ、しばらくビルドできない状態が続いて苦しみました

今回はそのときに詰まったポイントと、最終的にどう解決したかをまとめます。


AndroidManifest.xmlをカスタム化する理由

Unityのビルドシステムは標準で自動生成されたManifestを使いますが、以下のような処理を追加したいときは自前でマニフェストを書き換える必要があります

  • アラームや通知の受信(BroadcastReceiver)
  • ForegroundServiceの利用
  • Google Driveアップロード(FileProviderの定義)
  • 課金機能(BILLINGパーミッション)

詰まったポイント:ビルド時に謎のエラーが連発…

Manifestを書いてPlugins/Androidに置いたら、以下のような症状が出ました:

  • Gradleビルドエラーで失敗する
  • 「Duplicate attribute」「Conflicting manifest entries」などの謎エラー
  • Unity側の出力ログに心当たりのないパッケージ名が出てくる

原因①:tools:replace や tools:remove を正しく使えていなかった

Unityやサードパーティライブラリが同じ要素を重複して書き出してしまうため、
以下のような記述がないと競合でエラーになります

tools:replace="android:icon, android:roundIcon"
tools:remove="meta-data"

特にmeta-dataは、Unityのビルドプロセスで自動的に付与されることがあり、明示的に削除しないと競合します。


原因②:FileProviderのauthoritiesが一致していなかった

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.minutemind.app.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>

ここでの authorities は、Java側・Unity側でも完全一致している必要があります。
com.minutemind.app.provider → Javaコードでもこの文字列で呼び出す)


原因③:不要なActivityが重複していた

Unityは自動で UnityPlayerActivityUnityPlayerGameActivity を追加しますが、自前で両方書いてしまうと競合するケースもあり

不要なものはコメントアウトする or 条件によって片方のみ使うように整理が必要でした。


最終的にビルド成功した構成

以下が最終的に正常にビルドできるようになったAndroidManifest.xmlです(抜粋):

<application
android:allowBackup="true"
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
tools:replace="android:icon, android:roundIcon"
tools:remove="meta-data">

<!-- UnityのデフォルトActivity -->
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:launchMode="singleTask"
android:configChanges="orientation|screenSize" />

<!-- Google Drive FileProvider -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.minutemind.app.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>

<!-- Alarm受信用BroadcastReceiver -->
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="false" />
</application>

まとめ:Manifestは地味に沼。だけど慣れると強力。

  • Unity×Android連携にはManifest編集が必須
  • 競合エラーや設定ミスでビルドできなくなることがある
  • 正しい構文や補助属性(tools:replaceなど)を使うことが重要

一度つまずいたら、UnityのビルドログやGradleログを丁寧に見ることで、少しずつ原因が絞り込めていきます。私のように苦しまないためにも、ぜひ参考にしてください!

コメント

タイトルとURLをコピーしました