
사용 중인 Google Mobile Ads(GMA) SDK 버전이 sunset에 접어들면서 SDK를 버전업했을 뿐인데,
Unity Android 빌드에서 IL2CPP Internal CLR error (0x80131506) 가 발생하며 빌드가 완전히 막혔다.
결론적으로 문제의 정체는 GMA 자체가 아니라,
의존성 변경 이후 Unity/EDM/Bee 캐시가 꼬인 상태에서 증분 빌드* 가 재사용된 것이다.
*증분 빌드: 이전 빌드 결과를 재사용해서, 변경된 부분만 다시 빌드하는 방식
캐시 초기화 + unitypackage 재임포트 + Force Resolve로 해결하였다.
1. 문제 발생 배경
- Unity 2021.3 LTS 프로젝트
- Android 빌드 대상
- 기존에 정상 동작하던 프로젝트
- 변경 사항은 단 하나 → Google Mobile Ads SDK 버전 업데이트
2. 발생한 증상
Android + IL2CPP 빌드 실패
빌드 도중 아래와 같은 에러가 반복적으로 발생했다.
- Incremental Player build failed
- Failed to create CoreCLR, HRESULT: 0x8007000E
- Fatal error. Internal CLR error. (0x80131506)
- 실패 지점:
- GoogleMobileAds.Ump.Android-FeaturesChecked.txt
- UnityEngine.*Module-FeaturesChecked.txt
- il2cpp.exe 실행 단계
특징적인 포인트
- Mono로는 Android 빌드 성공
- IL2CPP에서만 실패
- 캐시 삭제, 재빌드, 재부팅을 반복해도 동일 증상
→ 이 시점에서 Gradle/Android 설정 문제는 아님이 명확해졌다.
3. 해결 방법 (실제로 효과 있었던 절차)
1) 프로젝트 캐시 완전 삭제
Unity 종료 후, 프로젝트 루트에서 아래 폴더들을 모두 삭제
Library/
Temp/
obj/
Logs/ (선택)
Library는 Unity 캐시이므로 삭제해도 안전하며, 재실행 시 자동 재생성된다.
2) Google Mobile Ads / EDM 관련 폴더 제거
Assets/ 하위에서 다음 폴더들을 삭제:
Assets/GoogleMobileAds/
Assets/ExternalDependencyManager/
Assets/Plugins/Android/ (GMA 관련 aar/jar가 있다면)
핵심은 이전 의존성 산출물을 완전히 제거하는 것이다.
3) Unity 재실행 → GMA 재임포트

- Assets → Import Package → Custom Package
- 최신 GoogleMobileAds-x.x.x.unitypackage 전체 선택 후 Import

4) External Dependency Manager 강제 리졸브
Unity 메뉴에서:
Assets
→ External Dependency Manager
→ Android Resolver
→ Force Resolve
5) Android 빌드 재시도
- Scripting Backend: IL2CPP
- ARM64 only
→ 빌드 성공
4. 근본 원인은 무엇인지?
1) GMA 버전업 → Android 의존성 그래프 변경
GMA 업데이트 시 함께 바뀌는 것들:
- play-services-ads
- user-messaging-platform (UMP)
- AndroidX / transitive dependency 구조
즉, Gradle 기준 의존성 트리가 달라진다.
2) EDM 리졸브 결과와 Unity 캐시(Bee/Library)가 불일치
Unity는 다음을 강하게 캐싱한다.
- Bee Incremental Build 산출물
- Library 내부 Feature 체크 파일
- 이전 Android Resolver 결과
이 상태에서 의존성만 바뀌면:
- 일부는 옛 의존성
- 일부는 새 의존성
이라는 정합성 붕괴 상태가 된다.
3) IL2CPP 단계에서 폭발
IL2CPP는:
- 방대한 C++ 코드 생성
- 메타데이터/어셈블리 조합에 매우 민감
입력이 꼬인 상태에서 실행되면,
- CoreCLR 생성 실패
- Internal CLR Error
- Incremental Build 실패
처럼 원인과 전혀 달라 보이는 에러로 터진다.
즉, IL2CPP는 범인이 아니라 피해자였다.
5. 해결된 이유
"캐시 삭제 + 재임포트 + Force Resolve" 과정이 한 일을 정리하면:
- 잘못 재사용되던 Bee/Library 캐시 제거
- 이전 unitypackage들의 산출물 제거
- 현재 상태 기준으로 의존성 그래프를 처음부터 재계산
- Unity–EDM–Gradle 간 정합성 복구
결과적으로 빌드 파이프라인이 정상 경로로 복구되었다.
6. 교훈
이번 경험을 통해 다시 한 번 느낀 점은, 의존성은 결코 가볍게 볼 수 있는 요소가 아니라는 것이다. Java의 Maven, C#의 NuGet, Node.js의 package.json처럼, Unity 역시 다양한 패키지와 라이브러리들이 서로 유기적으로 연결된 상태에서 하나의 프로젝트를 구성하고 있다. Unity 프로젝트라고 해서 이 복잡성에서 예외는 아니었다.
Google Mobile Ads처럼 외부 SDK 하나를 업데이트하는 작업은 단순한 버전 변경이 아니라, 그 패키지가 의존하고 있는 다른 라이브러리들과 빌드 파이프라인 전반에 영향을 주는 변화가 된다. 겉으로는 작은 수정처럼 보여도, 내부적으로는 의존성 그래프가 달라지면서 예상치 못한 문제가 발생할 수 있다.
그래서 패키지 업데이트는 항상 신중해야 하며, 업데이트 이후에는 의존성이 정상적으로 리졸브되고 전체 빌드 흐름이 안정적으로 동작하는지 반드시 확인해야 한다. 이번 이슈는 단순한 에러 해결을 넘어, 의존성을 관리하는 태도와 검증 과정의 중요성을 다시 한 번 상기시켜 준 사례였다.
'Unity' 카테고리의 다른 글
| Unity Android 빌드 실패 및 런타임 오류 해결기 (3) | 2025.06.26 |
|---|---|
| [Unity] Visual Studio에서 Intellisence가 적용되지 않을 때 (0) | 2022.11.26 |
| [Unity] 간단히 네트워크 연결상태 체크하기 (0) | 2022.11.01 |