A recreated Android AAB build and Keystore automation view. Headless scripts prevent missing credentials and signing failures.
A recreated Android AAB build and Keystore automation view. Headless scripts prevent missing credentials and signing failures.

Lock build requirements into code

Google Play requires 64-bit support (IL2CPP ARM64) and current Target API levels. Instead of relying on manual Editor UI checkboxes, enforce these requirements directly in your C# build entrypoint.

#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

Inject signing keys via environment variables

Never commit Keystore passwords into source control. Inject passwords from environment variables into PlayerSettings immediately before building.

#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

Validate with bundletool

Test the output .aab bundle using Google bundletool to verify universal APK generation and asset splitting before store submission.

Verification scope

Official documentation review

Verified

Reviewed the article's code and procedure against official Unity documentation and marked it ready for publication. This is not a claim of an independent Unity project or device reproduction; version- or device-specific reports will be checked in that environment as follow-up.

Official documentation checkedUnity Android build process manual ↗