Unity에서 Play Asset Delivery(PAD)로 AAB 150MB 제한 넘기기
- Google 가이드: https://developer.android.com/guide/app-bundle/asset-delivery
- Unity 사용 가이드: https://developer.android.com/guide/app-bundle/asset-delivery/build-unity
Android AAB 파일 크기가 150MB 제한을 넘으면 PAD를 통한 AAB 빌드가 필수다. 기존 에셋번들도 AAB 빌드에 포함시켜 빌드하고 제출할 수 있다. 하나의 AssetBundle 파일은 단일 애셋 팩으로 패키징된다.
장점
- 에셋번들을 AAB에 포함하면 별도 CDN 없이 Google이 관리해 준다. 다만 iOS나 다른 플랫폼도 지원한다면 그 플랫폼용 에셋번들은 어차피 따로 관리해야 한다.
단점
- iOS에서는 쓸 수 없어 따로 관리해야 한다.
- 에셋번들처럼 앱 업데이트 없이 에셋만 따로 업데이트할 수 없다. 앱 업데이트와 별개로 갱신하는 에셋번들은 PAD로 관리하기 어렵다.
결론
- 150MB를 넘는 경우 PAD를 사용한 AAB로 빌드하면 용량 문제는 해결될 것으로 판단했다.
시도 1: Google Play Unity 플러그인 (실패)
섹션 제목: “시도 1: Google Play Unity 플러그인 (실패)”play-unity-plugins에서 다음 패키지를 설치했다.
- com.google.android.appbundle (v1.7.0)
- com.google.play.assetdelivery (v1.7.0)
- com.google.play.common (v1.7.0)
- com.google.play.core (v1.7.0)
Google > Android App Bundle > Asset Delivery Settings 메뉴에서 Separate Base APK Asset을 체크한 뒤 Google > Build Android App Bundle로 빌드한다.
Jenkins 빌드 자동화를 위해 커맨드라인 빌드 스크립트(CommandBuild.cs)에 다음 내용을 추가했다.
using Google.Android.AppBundle.Editor;using Google.Android.AppBundle.Editor.AssetPacks;
//pad 빌드인 경우 if (!string.IsNullOrEmpty(isPAD) && isPAD.Equals("true")) { build_path = build_path + ".aab";
var buildPlayerOptions = new BuildPlayerOptions(); buildPlayerOptions.scenes = levels; buildPlayerOptions.locationPathName = build_path; buildPlayerOptions.options = build_options; buildPlayerOptions.target = build_target; buildPlayerOptions.targetGroup = BuildTargetGroup.Android;
var assetPackConfig = new AssetPackConfig(); assetPackConfig.SplitBaseModuleAssets = true; //check separate base APK asset AssetPackConfigSerializer.SaveConfig(assetPackConfig);
var res = Bundletool.BuildBundle(buildPlayerOptions, assetPackConfig); if (res == false) { Debug.Log("Bundletool.BuildBundle failed: PAD build failed"); EditorApplication.Exit(-1); } }문제: LZ4 압축 시 실행 불가
섹션 제목: “문제: LZ4 압축 시 실행 불가”BuildOptions.CompressWithLz4나 BuildOptions.CompressWithLz4HC를 쓰면, 스토어에 올린 뒤 기기에서 내려받아 실행할 때 “Unable to initialize the Unity Engine” 에러가 나며 실행되지 않았다.
찾아본 내용은 다음과 같다.
When using
UnityEditor.BuildOptions.CompressWithLz4orUnityEditor/BuildOptions.CompressWithLz4HC, the player build generates a different file layout in theassets/directory – and fails to startup, with the “Unable to initialize the Unity Engine” popup.Reverting my player build to use default compression resolved the issue for us…. though it is not an optimal solution, since the LZ4HC compressed build had a much smaller size.
BuildOptions.None으로 빌드하면 정상 실행되지만, 비공개 테스트에서 설치 후 앱 용량이 300MB에서 400MB로 커졌다. 실제 다운로드 용량은 111MB에서 120MB 정도로 큰 차이가 없었다. 설치 용량이 커진 원인은 확인하지 못했다. 설치 후 풀리는 데이터가 압축되지 않아서라고 의심한다.
남은 확인 사항은 다음과 같았다.
- 스토어에 올라간 용량과 설치 후 용량을 직접 확인한다. 다운로드 114MB로 기존 111MB와 큰 차이가 없고, 설치 용량은 400MB 정도였다.
- 설치 용량 증가가 압축 방식 변경 때문인지, PAD 빌드 자체 때문인지 확인한다.
- 압축 방식이 바뀌면 기존 에셋번들을 모두 새로 빌드해야 하는지 호환 여부를 확인한다(번들 다운로드와 실행 정상 여부).
211MB 빌드를 등록해 스토어 베타 테스트로 다운로드와 실행까지는 확인했다.
이후 Unity 2021.3.9f1에서 같은 AAB 빌드에 압축 방식만 바꿔 다시 시험했다.
- com.google.play.assetdelivery 1.8.1: 플러그인 문제로 아예 실행되지 않았다.
- com.google.play.assetdelivery 1.7.0:
CompressWithLz4HC로 뽑은 APK는 실행에 성공했지만, 스토어 경유 테스트가 남았다.
적용: Unity 자체 PAD 빌드
섹션 제목: “적용: Unity 자체 PAD 빌드”Unity 2021.3.9f1에서 Split Application Binary를 체크하고 AAB로 빌드했다. Google > Build Android App Bundle 메뉴는 쓰지 않는다. Unity 2020.3부터 추가된 Unity 자체 PAD 빌드 기능이다(Unity 매뉴얼).
- 뽑아낸 APK가 정상 실행됐다.
- 스토어 베타 테스트로 실기기(SM-A908N)에서 다운로드와 실행이 정상임을 확인했다.
- 용량 추가 테스트로 200MB가 넘는 빌드도 업로드에 성공했다(version code 117).
Jenkins 빌드 자동화를 위해 CommandBuild.cs에 다음 내용을 추가했다. AAB 빌드이면 무조건 PAD로 빌드되도록 설정한다.
if (!string.IsNullOrEmpty(isAppBundle) && isAppBundle.ToLower().Equals("true")){ EditorUserBuildSettings.buildAppBundle = true; build_path = build_path + ".aab";
//unity pad set //aab 빌드이면 무조건 PAD로 빌드 되도록 설정 PlayerSettings.Android.useAPKExpansionFiles = true;}배운 점
섹션 제목: “배운 점”- Google Play Unity 플러그인 방식은 플러그인 버전과 압축 옵션 조합에 따라 실행 실패가 생겼다.
- Unity 2020.3 이후라면 Split Application Binary(
PlayerSettings.Android.useAPKExpansionFiles)와 AAB 빌드 조합만으로 PAD가 적용된다.