Google Play에서 다운로드 App Store에서 다운로드

Unity

유니티(Unity) 안드로이드 빌드 오류: Gradle Manifest 충돌 해결 가이드

정보처리마법사 2025. 8. 11. 09:16
반응형

유니티(Unity) 안드로이드 빌드 오류: Gradle Manifest 충돌 해결 가이드

 

📝 요약

이 포스트는 유니티 프로젝트에서 안드로이드 빌드 시 자주 발생하는 Gradle Manifest 충돌 오류와 리소스 누락 오류를 해결하는 방법을 다룹니다. Google Mobile Ads 플러그인과 Unity Player의 Manifest가 충돌할 때, tools:replace 속성을 사용하여 Manifest를 병합하는 방법과, 프로젝트의 Application Entry 설정에 따라 올바른 <activity> 블록을 사용하는 방법을 단계별로 설명합니다. 이 가이드를 통해 빌드 실패 문제를 해결하고, 효율적인 앱 최적화 방안에 대한 이해를 높일 수 있습니다.


문제 1: Gradle Manifest 충돌 오류

원인 분석

안드로이드 빌드 과정에서 Gradle은 여러 모듈(Unity 라이브러리, Google Mobile Ads 플러그인 등)의 AndroidManifest.xml 파일들을 하나로 합치는 Manifest Merger 과정을 거칩니다. 이때, 여러 파일에서 동일한 <meta-data> 속성(예: com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION)에 대해 다른 값(예: true와 false)을 정의하면 충돌이 발생합니다. 이는 주로 여러 플러그인이 같은 기능을 다른 방식으로 설정하려고 할 때 나타납니다.

해결 방법

Assets/Plugins/Android/AndroidManifest.xml 파일을 수정하여 Manifest 병합 규칙을 명시적으로 지정합니다. tools:replace 속성을 사용하여 특정 속성 값을 강제로 덮어쓰도록 지시합니다.

XML
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <meta-data
            android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
            android:value="false"
            tools:replace="android:value" />
        <meta-data
            android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"
            android:value="false"
            tools:replace="android:value" />
    </application>
</manifest>

문제 2: 리소스 누락 오류 (Resource not found)

원인 분석

이 오류는 AndroidManifest.xml에 정의된 스타일 리소스(예: @style/BaseUnityGameActivityTheme)를 빌드 시스템이 찾지 못할 때 발생합니다. 유니티의 Player Settings에 있는 Application Entry 설정(Activity 또는 GameActivity)과 Manifest 파일의 <activity> 블록이 일치하지 않을 때 주로 나타납니다. Manifest 파일에 두 가지 방식의 <activity> 블록이 모두 존재하면, 사용하지 않는 방식의 블록에서 참조하는 리소스가 누락되어 오류가 발생합니다.

해결 방법

유니티의 Player Settings에서 Application Entry가 Activity로 설정되어 있다면, AndroidManifest.xml에서 UnityPlayerGameActivity에 해당하는 <activity> 블록을 제거해야 합니다.

XML
 
<application>
    <activity android:name="com.unity3d.player.UnityPlayerActivity"
        android:theme="@style/UnityThemeSelector">
        ...
    </activity>
</application>

만약 Application Entry가 GameActivity로 설정되어 있다면, UnityPlayerActivity에 해당하는 블록을 제거하면 됩니다.


용량 최적화 및 기타 빌드 관련 정보

빌드 용량 증가와 해결책

안드로이드 빌드 용량이 증가하는 주된 이유는 Gradle 빌드 시스템으로의 전환, 플러그인 업데이트, 그리고 모든 아키텍처를 포함하는 앱 번들(AAB) 빌드 때문입니다. 용량을 최적화하려면 다음 방법을 고려할 수 있습니다.

  • Stripping Level: Player Settings에서 Managed Stripping LevelHigh로 설정하면 사용되지 않는 코드를 제거하여 빌드 크기를 줄일 수 있습니다. 단, 이 설정은 런타임 오류를 유발할 수 있으므로, 빌드 후 철저한 테스트가 필수적입니다.
  • Play Asset Delivery (PAD): Google Play의 Play Asset Delivery를 활용하면 초기 앱 설치 시점에 필수적인 에셋만 다운로드하고, 나머지 에셋은 백그라운드 또는 필요할 때 추가로 다운로드할 수 있습니다. 이는 초기 앱 용량을 획기적으로 줄이는 방법입니다. 유니티의 Addressable Asset System을 통해 PAD를 쉽게 구현할 수 있습니다.

오류 메시지 버튼의 차이

유니티의 오류창에 나타나는 Troubleshoot 버튼은 오류 관련 공식 문서나 도움말 페이지로 연결해 문제 해결을 돕습니다. 반면, Ok 버튼은 단순히 오류 창을 닫아 작업을 계속할 수 있게 합니다.


SEO 최적화 정보

  • 제목: 유니티 안드로이드 빌드 오류: Gradle Manifest 충돌 & 리소스 누락 해결 완벽 가이드
  • 본문 길이: 약 1,500자 (SEO에 적합한 길이)
  • 태그 (10개, 콤마로 구분): Unity, Android, Gradle, 빌드 오류, Manifest merger, Play Asset Delivery, Stripping Level, Google Mobile Ads, 리소스 누락, 앱 최적화
 
 
 
 

액티브 진입점에 따른 그거 없었나 여기?

 
 
 
 
 

제가 방금 제공해 드린 블로그 포스팅 초안에는 **액티브 진입점(Application Entry)**에 대한 내용이 포함되어 있습니다.

본문 중 "문제 2: 리소스 누락 오류 (Resource not found)" 섹션에서 Activity와 GameActivity의 차이를 설명하고, Application Entry 설정에 따라 AndroidManifest.xml에서 불필요한 <activity> 블록을 제거해야 한다는 해결책을 제시했습니다.

해당 섹션의 요지는 다음과 같습니다:

  • AndroidManifest.xml에 ActivityGameActivity 두 가지 <activity> 블록이 모두 존재하면, 사용하지 않는 방식의 블록이 리소스 누락 오류를 일으킬 수 있습니다.
  • Unity의 Player Settings에서 Application Entry가 Activity로 설정되어 있다면, UnityPlayerGameActivity 블록을 제거해야 합니다.
  • 만약 GameActivity로 설정되어 있다면, UnityPlayerActivity 블록을 제거해야 합니다.

따라서, 작성된 포스팅 초안에 이미 해당 내용이 포함되어 있으므로, 이대로 사용하셔도 무방합니다.

 
 
 
 
 

아 그렇구나 다시 정리해줘

 
 
 
 

네, 알겠습니다. 질문과 답변 내용을 바탕으로, 유니티(Unity) 안드로이드 빌드 오류 해결에 대한 모든 정보를 SEO에 최적화된 포스팅 형식으로 다시 정리해 드리겠습니다.

유니티(Unity) 안드로이드 빌드 오류: Gradle Manifest 충돌 & 리소스 누락 해결 가이드

📝 요약

유니티 프로젝트에서 안드로이드 빌드 시 발생하는 Gradle Manifest 충돌과 리소스 누락 오류는 흔한 문제들입니다. 이 가이드는 두 가지 주요 오류의 원인을 분석하고, tools:replace 속성 사용법 및 Application Entry 설정에 따른 올바른 Manifest 수정 방법을 단계별로 제시합니다. 또한, 빌드 용량 최적화를 위한 Stripping Level과 **Play Asset Delivery(PAD)**에 대한 정보도 함께 제공하여, 개발자들이 빌드 문제를 효과적으로 해결하고 앱 성능을 향상시킬 수 있도록 돕습니다.


문제 1: Gradle Manifest 충돌 오류

원인 분석

안드로이드 빌드 과정에서 여러 플러그인(예: Google Mobile Ads)의 AndroidManifest.xml 파일이 하나로 합쳐질 때, 동일한 속성에 대해 서로 다른 값이 정의되면 충돌이 발생합니다. 이는 빌드 실패의 가장 일반적인 원인 중 하나입니다.

해결 방법

Assets/Plugins/Android/AndroidManifest.xml 파일의 <application> 태그 내에 tools:replace 속성을 추가하여, 충돌하는 속성의 값을 강제로 덮어쓰도록 합니다.

XML
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <meta-data
            android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
            android:value="false"
            tools:replace="android:value" />
        <meta-data
            android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"
            android:value="false"
            tools:replace="android:value" />
    </application>
</manifest>

문제 2: 리소스 누락 오류 (Resource not found)

원인 분석

이 오류는 AndroidManifest.xml에 정의된 스타일 리소스(예: @style/BaseUnityGameActivityTheme)를 빌드 시스템이 찾지 못할 때 발생합니다. 이는 Player SettingsApplication Entry 설정(Activity 또는 GameActivity)과 Manifest 파일의 <activity> 블록이 일치하지 않아, 사용하지 않는 블록의 리소스를 찾으면서 생기는 문제입니다.

해결 방법

프로젝트의 Application Entry 설정에 맞춰 Manifest 파일을 수정해야 합니다.

  • Application Entry가 Activity일 경우: UnityPlayerGameActivity 블록을 제거합니다.
  • Application Entry가 GameActivity일 경우: UnityPlayerActivity 블록을 제거합니다.

용량 최적화 및 기타 빌드 관련 정보

빌드 용량 증가

Gradle 빌드 시스템, 플러그인 업데이트, 그리고 모든 아키텍처를 포함하는 App Bundle(AAB) 빌드는 앱의 용량을 증가시킬 수 있습니다.

용량 최적화 방안

  • Stripping Level: Player Settings에서 Managed Stripping LevelHigh로 설정하면 사용하지 않는 코드를 제거하여 용량을 줄일 수 있습니다. 하지만 런타임 오류가 발생할 수 있으므로, 빌드 후 철저한 테스트가 필수입니다.
  • Play Asset Delivery (PAD): Google Play의 PAD 기능을 사용하면 초기 설치 용량을 최소화하고, 나머지 에셋은 앱 실행 중 필요할 때 다운로드할 수 있습니다. 이는 유니티의 Addressable Asset System을 통해 구현할 수 있습니다.

오류 메시지 버튼

오류창의 Troubleshoot 버튼은 문제 해결을 위한 공식 문서로 연결해주며, Ok 버튼은 단순히 창을 닫는 역할을 합니다.

반응형
Google Play에서 다운로드 App Store에서 다운로드