Unity 앱의 Android 15 타깃과 16KB 페이지 크기 대응
- Android Target API를 Android 15(API 35)로 올리고, 16KB 페이지 크기를 지원하는 빌드물을 배포해 Google Play 정책에 대응한다. Google Play 결제 라이브러리도 7.0.0으로 올린다.
- Firebase Dynamic Links 관련 코드와 게임 콘텐츠 안의 참조를 제거한다.
- 고객센터 웹뷰의 챗봇 뒤로가기 흐름을 고친다.
빌드 환경
섹션 제목: “빌드 환경”- Unity 2022.3.64f1. 이 버전에는 Gradle 8.11.1이 포함되어 있지 않아 수동으로 내려받아 지정했다.
- JDK 17.
gradleTemplate.properties에org.gradle.java.home={수동으로 내려받은 JDK 경로}를 추가한다. Unity Preferences의 JDK를 바꿀 필요는 없고, Gradle 빌드에만 필요하다. - Android 빌드 시스템: Gradle 8.11.1, AGP 8.x 이상, Build Tools 35.x
- iOS minSDK: iOS 13
- Android target 35(Android 15), min SDK 23
- 64비트 지원: Scripting Backend IL2CPP, ARMv7·ARM64 선택
SDK 업데이트
섹션 제목: “SDK 업데이트”Android 15와 16KB 페이지 크기를 공식 지원하는 버전으로 모두 올렸다. AppLovin 의존성 때문에 min SDK를 22에서 23으로 올렸다.
| SDK | 변경 |
|---|---|
| Firebase Unity SDK | 11.9.0 → 12.10.0 |
| Google AdMob | 9.1.0 → 10.0.0 |
| AppLovin | 12.5.0.1 → 13.3.0.0 |
| EDM4U | 1.2.179 → 1.2.186 |
Gradle 빌드 오류와 해결
섹션 제목: “Gradle 빌드 오류와 해결”buildToolsVersion 경고
섹션 제목: “buildToolsVersion 경고”WARNING:The specified Android SDK Build Tools version (32.0.0) is ignored...build.gradle(템플릿 포함)에서 buildToolsVersion 줄을 지웠다. SDK에 build-tools 35.x만 남겨 두면 AGP가 자동으로 그 버전을 쓴다.
AndroidManifest.xml의 package 속성
섹션 제목: “AndroidManifest.xml의 package 속성”Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported...AGP 8.x부터 manifest의 package="..." 속성을 쓸 수 없다. 빌드 후 모든 AndroidManifest.xml에서 package 속성을 정규식으로 제거하는 후처리 스크립트(GradlePostProcessor.cs)를 적용했다.
Manifest merge의 exported 속성 충돌
섹션 제목: “Manifest merge의 exported 속성 충돌”Suggestion: add 'tools:replace="android:exported"' to <service> element at AndroidManifest.xml to override.앱의 manifest와 Firebase의 manifest를 병합할 때 android:exported 속성이 충돌했다. 앱 manifest의 해당 <service>에 tools:replace="android:exported"를 지정해 값을 맞췄다.
namespace 선언 누락
섹션 제목: “namespace 선언 누락”Namespace not specified. Specify a namespace in the module's build file: .../launcher/build.gradle자동 생성되는 여러 build.gradle(launcher, unityLibrary, .androidlib 등)에 namespace가 없었다. IPostGenerateGradleAndroidProject 기반 후처리 스크립트에서 모든 build.gradle에 namespace를 자동으로 넣도록 했다.
dependencies 블록 밖의 implementation()
섹션 제목: “dependencies 블록 밖의 implementation()”Could not find method implementation() for arguments...implementation 줄이 dependencies 블록 밖에 있거나, dependencies 블록이 여러 개로 나뉘어 구조가 깨져 있었다. 모든 implementation·api 줄을 하나의 dependencies 블록에만 남기도록 정규화하는 후처리를 적용했다.
Dynamic Links 제거
섹션 제목: “Dynamic Links 제거”사내 공통 SDK를 최신 버전으로 갱신하고, Dynamic Links 관련 코드와 이를 참조하는 prefab·scene의 GameObject를 제거했다.
결제 라이브러리 업데이트
섹션 제목: “결제 라이브러리 업데이트”처음에는 mainTemplate.gradle에 결제 라이브러리를 직접 추가했지만, com.unity.purchasing 4.13.0이 Google Play Billing 7.0.0을 지원하므로 패키지 업데이트로 대응했다.
dependencies { implementation 'com.android.billingclient:billing:7.0.0'}챗봇 뒤로가기
섹션 제목: “챗봇 뒤로가기”웹뷰는 UniWebView를 쓴다. 흐름은 다음과 같다.
인앱 → 웹뷰(고객센터, 로드만 하고 화면에 표시하지 않음) → 웹뷰(챗봇, 첫 화면) → 웹뷰(고객센터)- 웹뷰를 호출할 때 JWT로 고객센터 URL을 Load만 하고 Show하지 않은 채, 바로 챗봇 URL을 Load & Show한다. 챗봇에서 뒤로 가면 미리 로드해 둔 고객센터 페이지로 돌아간다.
- 웹 페이지가 가로 모드에 제대로 대응하지 않는 부분이 있어 항상 세로 모드로 호출하도록 했다.
검수 항목
섹션 제목: “검수 항목”- 게임 내 공유 기능이 모두 숨겨졌는지
- 광고와 결제가 정상 동작하는지
- 빌드물이 Target API 35와 16KB 페이지 크기 요구 사항을 충족하는지
- SDK 업데이트 후 iOS 빌드도 정상 동작하는지
- AI 챗봇 기능과 흐름이 정상 동작하는지