#if UNITY_ANDROID using System; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.Android; using UnityEditor.Callbacks; using UnityEngine; using Azerion.BlueStack.Editor.Android.Gradle; namespace Azerion.BlueStack.Editor.Android { public class AndroidBuildPostProcess { private static readonly string AndroidFolder = "Assets/Plugins/Android/"; [PostProcessBuild] public static void OnPostprocessBuild(BuildTarget target, string pathToBuildProject) { if (target == BuildTarget.Android) { Debug.Log("Starting verification step for Android BlueStackAds"); VerifyBlueStackAdsDependencies(); Debug.Log("Verification step for Android BlueStackAds completed"); } } private static void VerifyBlueStackAdsDependencies() { try { CheckInMainTemplateGradle(); } catch (Exception e) { NotifyBuildFailure(e.Message); } } private static void CheckInMainTemplateGradle() { var mainTemplateFilePath = AndroidFolder + "mainTemplate.gradle"; if (!File.Exists(mainTemplateFilePath)) { NotifyBuildFailure( "mainTemplate.gradle file is missing. Please Add `mainTemplate.gradle` via `Project Settings->Player->Android Settings->Publish Settings`. Resolved dependencies via 'Assets > External Dependency Manager > Android Resolver > Resolve/Force Resolve' or For manual you can use the sample 'Packages/Editor/Android/Gradle/mainTemplate.gradle' file included with the BlueStack dependencies"); } var result = GradleConfigUtils.CheckSDKGradleDependencies(gradleFilePath: mainTemplateFilePath); if (result.HasMissingDependency) { NotifyBuildFailure(result.ErrorMessage + " Resolved dependencies via 'Assets > External Dependency Manager > Android Resolver > Force Resolve' or For manual you can use the sample 'Packages/Editor/Android/Gradle/mainTemplate.gradle' file included with the BlueStack dependencies "); } } private static void NotifyBuildFailure(string message) { const string prefix = "[BlueStack] "; #if UNITY_2017_1_OR_NEWER throw new BuildPlayerWindow.BuildMethodException(prefix + message); #else throw new OperationCanceledException(prefix + message); #endif } } public class AndroidGradleProperties : IPostGenerateGradleAndroidProject { public int callbackOrder { get { return 999; } } public void OnPostGenerateGradleAndroidProject(string path) { updateManifestFile(path); string gradlePropertiesFile = ""; if (path.Contains("/")) { gradlePropertiesFile = path.Replace(@"/unityLibrary", @"") + "/gradle.properties"; } else if (path.Contains("\\")) { gradlePropertiesFile = path.Replace(@"\unityLibrary", @"") + @"\gradle.properties"; } Debug.Log("Gradle properties file path: " + gradlePropertiesFile); string gradlePropertiesFileContent = ""; if (File.Exists(gradlePropertiesFile)) { gradlePropertiesFileContent = File.ReadAllText(gradlePropertiesFile); File.Delete(gradlePropertiesFile); } Debug.Log("Gradle properties content before: " + gradlePropertiesFileContent); gradlePropertiesFileContent = GradleConfigUtils.AddAndroidXProperties(gradlePropertiesFileContent); StreamWriter writer = File.CreateText(gradlePropertiesFile); Debug.Log("Gradle properties content after: " + gradlePropertiesFileContent); writer.WriteLine(gradlePropertiesFileContent); writer.Flush(); writer.Close(); } private void updateManifestFile(string path) { string manifestFile = ""; if (path.Contains("/")) { manifestFile = path + @"/src/main/AndroidManifest.xml"; } else if (path.Contains("\\")) { manifestFile = path + @"\src\main\AndroidManifest.xml"; } ManifestProcessor.Instance.process(manifestFile); } } } #endif