✌️개요
원래 안드로이드는 빌드는 작게하고, 리소스는 런타임에 CDN을 통해 내려받는게 정석이지만
리소스를 전부 내장하여 바로 플레이할 수 있는 빌드를 뽑아야 하는 일이 생겼다
작업중에 만났던 수많은 에러 중 AAPT2 Gradle에러에대해 기록한다
🔥문제
일단 에러는 gradle빌드 단계에서 터지고 내용은 이렇다
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':launcher:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> AAPT2 aapt2-4.0.1-6197926-windows Daemon #0: Unexpected error during link, attempting to stop daemon.
This should not happen under normal circumstances, please file an issue if it does.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
AAPT2는 Gradle빌드 도구인데, 안드로이드 앱의 리소스 컴파일과 패키징을 담당하는 녀석이다
내 경우는 위에 적었듯이 리소스를 전부 내장한 빌드를 뽑기 위해 에셋번들들을 스트리밍에셋 폴더에 우겨넣은 상태였다
찾아보니 나처럼 스트리밍에셋에 리소스를 우겨넣은 상태에서 해당 에러를 만났다는 사람이 좀 있었다.
🍎해결
해결법은 일단 단일apk로 뽑는건 포기해야한다 apk+obb파일로 뽑아야한다
obb파일로 분할해서 뽑기 위해서는 `ProjectSettings-Player-PublishingSettings`에서 `Split Apllication Binary`를 체크해줘야 한다
이 항목을 체크하면 Resources폴더나 StreamingAssets폴더같은 동적 로드 리소스들을 유니티가 알아서 obb파일에 배치해서 뽑아준다
다음은 `Custom Main Gradle Template`과 `Custom Launcher Gradle Template`를 체크해주고 해당 파일을 수정해야한다
(외부 SDK들이 임포트돼있다면 이미 체크돼있을 수도 있다)
두 파일 모두 아래와 같은 부분이 있을것이다
aaptOptions {
noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
//혹은
noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}
요 부분을 아래와 같이 두 파일 모두 바꿔주자
aaptOptions {
noCompress = ['.ress', '.resource', '.bundle']
// noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}
이후 빌드를하면 성공적으로 apk와 obb가 나온다
⚠️주의!
1. obb파일 이름
obb파일은 `[apk이름].main.obb`이런 형식으로 나올텐데
`main.[번들버젼코드].com.[company].[product].obb`로 바꿔줘야한다
참고로 설치할 때는 `Android/obb/com.[company].[product]/ ` 폴더에 넣어주면 된다
2. obb파일 재활용 불가
obb파일은 재활용이 불가하다
무슨말이냐면 1번째 빌드에 뽑은 obb는 2번째 빌드에 뽑은 apk와 연결이 안된다는 것이다
obb파일을 반디집같은 툴로 열어보면 0byte크기의 uid파일이 있다
이 uid가 빌드id이다
apk파일도 압축을 풀면 `AndroidManifest.xml`파일이 있는데, 해당 파일의 암호화를 풀고 읽어보면
이렇게 동일한 uid를 `unity.build-id`라는 속성으로 명시해놓은것을 볼 수 있다
저게 일치해야 apk와 obb가 연결이된다.
따라서 obb파일은 재활용이 불가능하게 설계돼있다.
3. 4GB이상의 obb파일은 사용못함
끝까지 해결 못하고 회피한 부분이다
리소스가 무거우면 obb파일로 나눠도 obb가 4GB를 넘거나 근처일 수 있다
그럴경우 앱이 obb를 불러오지 않는다
이 부분은 결국 해결하진 못하고 리소스의 텍스쳐 포맷과 사이즈를 압축해서 용량을 3GB초반대로 낮췄다
obb파일도 여러개로 분할할 수 있다는데, 일단 Unity는 obb분할 기능을 지원해주지않는다고 한다
만약 분할해야겠다면 직접 해야하는 부분이다
4. LauncherTemplate.gradle
이 게시글에서 설명한 `LauncherTemplate.gradle`파일을 수정하는 솔루션은 apk+obb만을 위한 솔루션이다
따라서 리소스를 모두 내장한 빌드가 아닌 일반 빌드로 돌아갈려면 `LauncherTemplate.gradle`은 꼭! 원상복구 해줘야한다
'Unity > TroubleShooting' 카테고리의 다른 글
[Unity] 안드로이드14 크래시 "Writable dex file is not allowed." (0) | 2024.08.02 |
---|---|
[Unity] 애니메이터 블렌드 트리 이벤트 동시 실행 문제 (0) | 2024.07.07 |
[Unity] 애니메이터 서브 스테이트 머신의 요상한 트랜지션 우선순위 (0) | 2024.05.24 |
[Unity] 어드레서블 리모트 경로 변경 후에도 기존 경로로 불러올 때 (0) | 2024.05.14 |
[Unity] 어드레서블 씬 로드 후 인스펙터에 프리팹 참조가 끊어질 때 (0) | 2024.05.13 |