Files
Commercialization.topon/Assets/Topon_Adapter/Editor/IAAAdAndroidBuild.cs
2026-04-22 17:44:49 +08:00

167 lines
5.6 KiB
C#

#if UNITY_EDITOR
using System;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
public static class IAAAdAndroidBuild
{
private const string OutputDirectory = "Build/Android";
private const string OutputApkPath = OutputDirectory + "/IAAAdDebugSample-starveg.apk";
private const string KeystorePath = "Build/Android/keys/starveg-test.keystore";
private const string KeystorePassword = "Foldcc123!";
private const string KeyAliasName = "starvegtest";
private const string PackageName = "com.foldcc.starveg";
[MenuItem("Topon/Build IAA Android Test APK")]
public static void BuildAndroidTestApk()
{
EnsureBuildFolders();
ConfigurePlayerSettings();
var resolverState = CaptureResolverState();
try
{
ApplyBatchFriendlyResolverSettings();
var scenes = new[] { "Assets/Samples/IAAAdDebugSample/Scenes/IAAAdDebugSample.unity" };
var options = new BuildPlayerOptions
{
scenes = scenes,
target = BuildTarget.Android,
locationPathName = OutputApkPath,
options = BuildOptions.None
};
var report = BuildPipeline.BuildPlayer(options);
if (report.summary.result != BuildResult.Succeeded)
{
throw new Exception(
$"Android APK build failed: {report.summary.result} ({report.summary.totalErrors} errors)");
}
Debug.Log($"[IAA Build] APK generated: {Path.GetFullPath(OutputApkPath)}");
}
finally
{
RestoreResolverState(resolverState);
}
}
public static void BuildAndroidTestApkInBatchMode()
{
BuildAndroidTestApk();
EditorApplication.Exit(0);
}
private static void ConfigurePlayerSettings()
{
PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, PackageName);
PlayerSettings.defaultInterfaceOrientation = UIOrientation.Portrait;
PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64;
PlayerSettings.Android.useCustomKeystore = true;
PlayerSettings.Android.keystoreName = Path.GetFullPath(KeystorePath);
PlayerSettings.Android.keystorePass = KeystorePassword;
PlayerSettings.Android.keyaliasName = KeyAliasName;
PlayerSettings.Android.keyaliasPass = KeystorePassword;
PlayerSettings.bundleVersion = string.IsNullOrWhiteSpace(PlayerSettings.bundleVersion)
? "1.0.0"
: PlayerSettings.bundleVersion;
PlayerSettings.Android.bundleVersionCode = Mathf.Max(1, PlayerSettings.Android.bundleVersionCode);
AssetDatabase.SaveAssets();
}
private static void EnsureBuildFolders()
{
Directory.CreateDirectory(Path.GetFullPath(OutputDirectory));
Directory.CreateDirectory(Path.GetFullPath(Path.GetDirectoryName(KeystorePath) ?? OutputDirectory));
}
private static ResolverState CaptureResolverState()
{
var settingsType = GetResolverSettingsType();
return new ResolverState
{
EnableAutoResolution = GetResolverBool(settingsType, "EnableAutoResolution"),
AutoResolveOnBuild = GetResolverBool(settingsType, "AutoResolveOnBuild"),
PromptBeforeAutoResolution = GetResolverBool(settingsType, "PromptBeforeAutoResolution")
};
}
private static void ApplyBatchFriendlyResolverSettings()
{
var settingsType = GetResolverSettingsType();
SetResolverBool(settingsType, "EnableAutoResolution", false);
SetResolverBool(settingsType, "AutoResolveOnBuild", false);
SetResolverBool(settingsType, "PromptBeforeAutoResolution", false);
}
private static void RestoreResolverState(ResolverState state)
{
var settingsType = GetResolverSettingsType();
SetResolverBool(settingsType, "EnableAutoResolution", state.EnableAutoResolution);
SetResolverBool(settingsType, "AutoResolveOnBuild", state.AutoResolveOnBuild);
SetResolverBool(settingsType, "PromptBeforeAutoResolution", state.PromptBeforeAutoResolution);
}
private static Type GetResolverSettingsType()
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType("GooglePlayServices.SettingsDialog");
if (type != null)
{
return type;
}
}
return null;
}
private static bool GetResolverBool(Type settingsType, string propertyName)
{
if (settingsType == null)
{
return false;
}
var property = settingsType.GetProperty(
propertyName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
if (property == null)
{
return false;
}
return (bool)property.GetValue(null, null);
}
private static void SetResolverBool(Type settingsType, string propertyName, bool value)
{
if (settingsType == null)
{
return;
}
var property = settingsType.GetProperty(
propertyName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
if (property == null)
{
return;
}
property.SetValue(null, value, null);
}
private struct ResolverState
{
public bool EnableAutoResolution;
public bool AutoResolveOnBuild;
public bool PromptBeforeAutoResolution;
}
}
#endif