using System; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.Android; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; using UnityEngine.AdaptivePerformance; using UnityEditor.AdaptivePerformance.Editor; using UnityEngine.AdaptivePerformance.Samsung.Android; namespace UnityEditor.AdaptivePerformance.Samsung.Android.Editor { /// /// The Samsung Android provider build processor ensures that any custom configuration that the user creates is /// correctly passed on to the provider implementation at runtime. /// /// Custom configuration instances that are stored in EditorBuildSettings are not copied to the target build /// because they are considered unreferenced assets. To get them to the runtime, they must /// be serialized to the built app and deserialized at runtime. Previously, this as a manual process /// that required the implementor to manually serialize to some location that can then be read from to deserialize /// at runtime. With the new PlayerSettings Preloaded Assets API, you can now add your asset to the preloaded /// list and have it be instantiated at app launch. /// /// **Note**: Preloaded assets are only notified with Awake, so anything you want or need to do with the /// asset after launch needs to be handled in the Samsung Android provider build process. /// /// For more information about the APIs used, see: /// * EditorBuildSettings /// * PlayerSettings.GetPreloadedAssets /// * PlayerSettings.SetPreloadedAssets /// * IPostGenerateGradleAndroidProject /// public class SamsungAndroidProviderBuildProcess : IPreprocessBuildWithReport, IPostprocessBuildWithReport, IPostGenerateGradleAndroidProject { /// /// Override of and . /// public int callbackOrder { get { return 0; } } /// /// Clears out settings which could be left over from previous unsuccessfull runs. /// void CleanOldSettings() { UnityEngine.Object[] preloadedAssets = PlayerSettings.GetPreloadedAssets(); if (preloadedAssets == null) return; var oldSettings = from s in preloadedAssets where s != null && s.GetType() == typeof(SamsungAndroidProviderSettings) select s; if (oldSettings != null && oldSettings.Any()) { var assets = preloadedAssets.ToList(); foreach (var s in oldSettings) { assets.Remove(s); } PlayerSettings.SetPreloadedAssets(assets.ToArray()); } } /// /// Override of . /// /// Build report. public void OnPreprocessBuild(BuildReport report) { // Always remember to clean up preloaded assets after build to make sure we don't // dirty later builds with assets that may not be needed or are out of date. CleanOldSettings(); SamsungAndroidProviderSettings settings = null; EditorBuildSettings.TryGetConfigObject(SamsungAndroidProviderConstants.k_SettingsKey, out settings); if (settings == null) return; UnityEngine.Object[] preloadedAssets = PlayerSettings.GetPreloadedAssets(); if (!preloadedAssets.Contains(settings)) { var assets = preloadedAssets.ToList(); assets.Add(settings); PlayerSettings.SetPreloadedAssets(assets.ToArray()); } } /// Override of . /// Build report. public void OnPostprocessBuild(BuildReport report) { // Always remember to clean up preloaded assets after build to make sure we don't // dirty later builds with assets that may not be needed or are out of date. CleanOldSettings(); } /// /// Implementation of /// /// public void OnPostGenerateGradleAndroidProject(string path) { var setting = AdaptivePerformanceBuildUtils.GetWantedStartupBoostSetting(SamsungAndroidProviderSettings.GetSettings()); AdaptivePerformanceBuildUtils.UpdateBootConfigBoostSetting(path, "adaptive-performance-samsung-boost-launch", setting); } } }