설명용으로 재현한 Android AAB 빌드 및 키스토어 자동화 설정입니다. 헤드리스 스크립트로 서명 누락을 방지합니다.
설명용으로 재현한 Android AAB 빌드 및 키스토어 자동화 설정입니다. 헤드리스 스크립트로 서명 누락을 방지합니다.

빌드 설정 누락을 코드로 고정합니다

Google Play Console은 64비트(IL2CPP ARM64) 아키텍처와 최신 Target API(API 34+)를 필수로 요구합니다. 에디터 설정 창을 열지 않고도 배치 빌드 진입점에서 필수 플래그를 프로그래밍 방식으로 주입하세요.

#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;

public static class AndroidReleaseBuilder
{
    public static void BuildAAB()
    {
        EditorUserBuildSettings.buildAppBundle = true;
        EditorUserBuildSettings.androidBuildSubtarget = MobileTextureSubtarget.Generic;
        PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
        PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64;
        PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions)34;

        BuildPlayerOptions options = new BuildPlayerOptions
        {
            scenes = new[] { "Assets/Scenes/SampleScene.unity" },
            locationPathName = "Builds/IceBreaker-Release.aab",
            target = BuildTarget.Android,
            options = BuildOptions.None
        };

        BuildReport report = BuildPipeline.BuildPlayer(options);
        if (report.summary.result != BuildResult.Succeeded)
            throw new System.Exception("AAB Build Failed: " + report.summary.totalErrors);
    }
}
#endif

환경 변수 기반 키스토어 주입

키스토어 비밀번호를 소스 코드에 하드코딩하면 보안 사고가 발생합니다. CI/CD 환경 변수에서 비밀번호를 읽어와 빌드 직전에 PlayerSettings에 주입하고, 완료 후 비우도록 설계하세요.

#if UNITY_EDITOR
using UnityEditor;
using System;

public static class KeystoreConfigurator
{
    public static void ApplyFromEnv()
    {
        string pass = Environment.GetEnvironmentVariable("UNITY_KEYSTORE_PASS");
        if (string.IsNullOrEmpty(pass))
            throw new Exception("UNITY_KEYSTORE_PASS is not set.");

        PlayerSettings.Android.useCustomKeystore = true;
        PlayerSettings.Android.keystoreName = "keys/user.keystore";
        PlayerSettings.Android.keystorePass = pass;
        PlayerSettings.Android.keyaliasName = "icebreaker_release";
        PlayerSettings.Android.keyaliasPass = pass;
    }
}
#endif

번들 검증 단계

생성된 .aab 파일은 배포 전 Google bundletool로 실제 기기별 APK 분할이 정상적으로 일어나는지(Universal APK 추출 테스트) 검증해야 스토어 제출 후 리젝을 막을 수 있습니다.

검증 범위

공식 문서 대조

검증일

Unity 공식 문서와 본문의 코드·절차를 대조해 공개 준비 상태로 전환했습니다. 별도 Unity 프로젝트나 실기기에서 직접 재현한 결과는 아니며, 특정 버전·기기 문의가 들어오면 해당 환경에서 후속 확인합니다.

확인한 공식 문서Unity Android 빌드 매뉴얼 ↗