/// <summary> /// Configures the project to prepare for building the specified scenes in an instant app. /// </summary> public static void ConfigureProject(string[] scenesInBuild) { var requiredPolicies = PlayInstantSettingPolicy.GetRequiredPolicies(); foreach (var policy in requiredPolicies) { var policyChangeCompleted = policy.ChangeState(); if (!policyChangeCompleted) { throw new Exception(string.Format("Failed to change policy: {0}", policy.Name)); } } SetTargetArchitectures(); var manifestUpdater = AndroidManifestHelper.GetAndroidManifestUpdater(); var errorMessage = manifestUpdater.SwitchToInstant(null); if (errorMessage != null) { throw new Exception(string.Format("Error updating AndroidManifest.xml: {0}", errorMessage)); } PlayInstantBuildConfiguration.AddScriptingDefineSymbol( PlaySignatureVerifier.SkipVerifyGooglePlayServicesScriptingDefineSymbol); PlayInstantBuildConfiguration.SaveConfiguration("", scenesInBuild, ""); PlayInstantBuildConfiguration.SetInstantBuildType(); }
private void OnGUI() { EditorGUILayout.LabelField("Required changes", EditorStyles.boldLabel); AddControls(PlayInstantSettingPolicy.GetRequiredPolicies()); GUILayout.Space(10); EditorGUILayout.LabelField("Recommended changes", EditorStyles.boldLabel); AddControls(PlayInstantSettingPolicy.GetRecommendedPolicies()); }
/// <summary> /// Displays an error dialog if there is an issue that would prevent a build from succeeding. /// </summary> /// <returns>True if all prerequisites are met, or false if one failed.</returns> public static bool CheckBuildPrerequisites() { if (!Directory.Exists(AndroidSdkManager.AndroidSdkRoot)) { DisplayBuildError( "Failed to locate the Android SDK. Check Preferences -> External Tools to set the path."); return(false); } try { var ignored = JavaUtilities.JavaBinaryPath; } catch (JavaUtilities.ToolNotFoundException) { DisplayBuildError( "Failed to locate the Java JDK. Check Preferences -> External Tools to set the path."); return(false); } if (!PlayInstantBuildConfiguration.IsInstantBuildType()) { Debug.LogError("Build halted since selected build type is \"Installed\""); var message = string.Format( "The currently selected Android build type is \"Installed\".\n\n" + "Click \"{0}\" to open the \"{1}\" window where the build type can be changed to \"Instant\".", WindowUtils.OkButtonText, BuildSettingsWindow.WindowTitle); if (DisplayBuildErrorDialog(message)) { BuildSettingsWindow.ShowWindow(); } return(false); } var failedPolicies = new List <string>(PlayInstantSettingPolicy.GetRequiredPolicies() .Where(policy => !policy.IsCorrectState()) .Select(policy => policy.Name)); if (failedPolicies.Count > 0) { Debug.LogErrorFormat("Build halted due to incompatible settings: {0}", string.Join(", ", failedPolicies.ToArray())); var message = string.Format( "{0}\n\nClick \"{1}\" to open the settings window and make required changes.", string.Join("\n\n", failedPolicies.ToArray()), WindowUtils.OkButtonText); if (DisplayBuildErrorDialog(message)) { PlayerSettingsWindow.ShowWindow(); } return(false); } return(true); }
private static bool Build(BuildPlayerOptions buildPlayerOptions) { if (!PlayInstantBuildConfiguration.IsInstantBuildType()) { Debug.LogError("Build halted since selected build type is \"Installed\""); var message = string.Format( "The currently selected Android build type is \"Installed\".\n\n" + "Click \"OK\" to open the \"{0}\" window where the build type can be changed to \"Instant\".", BuildSettingsWindow.WindowTitle); if (DisplayBuildErrorDialog(message)) { BuildSettingsWindow.ShowWindow(); } return(false); } var failedPolicies = new List <string>(PlayInstantSettingPolicy.GetRequiredPolicies() .Where(policy => !policy.IsCorrectState()) .Select(policy => policy.Name)); if (failedPolicies.Count > 0) { Debug.LogErrorFormat("Build halted due to incompatible settings: {0}", string.Join(", ", failedPolicies.ToArray())); var message = string.Format( "{0}\n\nClick \"OK\" to open the settings window and make required changes.", string.Join("\n\n", failedPolicies.ToArray())); if (DisplayBuildErrorDialog(message)) { PlayerSettingsWindow.ShowWindow(); } return(false); } var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions); #if UNITY_2018_1_OR_NEWER switch (buildReport.summary.result) { case BuildResult.Cancelled: Debug.Log("Build cancelled"); return(false); case BuildResult.Succeeded: // BuildPlayer can fail and still return BuildResult.Succeeded so detect by checking totalErrors. if (buildReport.summary.totalErrors > 0) { // No need to display a message since Unity will already have done this. return(false); } // Actual success. return(true); case BuildResult.Failed: LogError(string.Format("Build failed with {0} error(s)", buildReport.summary.totalErrors)); return(false); default: LogError("Build failed with unknown error"); return(false); } #else if (string.IsNullOrEmpty(buildReport)) { return(true); } // Check for intended build cancellation. if (buildReport == "Building Player was cancelled") { Debug.Log(buildReport); } else { LogError(buildReport); } return(false); #endif }
public static void BuildAndRun() { if (!PlayInstantBuildConfiguration.IsPlayInstantScriptingSymbolDefined()) { Debug.LogError("Build and Run halted since selected platform is Installed"); const string message = "The currently selected Android Platform is \"Installed\".\n\n" + "Click \"OK\" to open the \"Configure Instant or Installed\" " + "window where the platform can be changed to \"Instant\"."; if (EditorUtility.DisplayDialog(BuildAndRunErrorTitle, message, OkButtonText, CancelButtonText)) { PlayInstantSettingsWindow.ShowWindow(); } return; } var jarPath = Path.Combine(AndroidSdkManager.AndroidSdkRoot, InstantAppsJarPath); if (!File.Exists(jarPath)) { Debug.LogErrorFormat("Build and Run failed to locate ia.jar file at: {0}", jarPath); var message = string.Format( "Failed to locate version 1.2 or later of the {0}.\n\nClick \"OK\" to install the {0}.", PlayInstantSdkInstaller.InstantAppsSdkName); if (EditorUtility.DisplayDialog(BuildAndRunErrorTitle, message, OkButtonText, CancelButtonText)) { PlayInstantSdkInstaller.SetUp(); } return; } var failedPolicies = new List <string>(PlayInstantSettingPolicy.GetRequiredPolicies() .Where(policy => !policy.IsCorrectState()) .Select(policy => policy.Name)); if (failedPolicies.Count > 0) { Debug.LogErrorFormat("Build and Run halted due to incompatible settings: {0}", string.Join(", ", failedPolicies.ToArray())); var message = string.Format( "{0}\n\nClick \"OK\" to open the settings window and make required changes.", string.Join("\n\n", failedPolicies.ToArray())); if (EditorUtility.DisplayDialog(BuildAndRunErrorTitle, message, OkButtonText, CancelButtonText)) { PlayerAndBuildSettingsWindow.ShowWindow(); } return; } var apkPath = Path.Combine(Path.GetTempPath(), "temp.apk"); Debug.LogFormat("Build and Run package location: {0}", apkPath); var buildPlayerOptions = CreateBuildPlayerOptions(apkPath); #if UNITY_2018_1_OR_NEWER var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions); switch (buildReport.summary.result) { case BuildResult.Cancelled: Debug.Log("Build cancelled"); return; case BuildResult.Succeeded: // BuildPlayer can fail and still return BuildResult.Succeeded so detect by checking totalErrors. if (buildReport.summary.totalErrors > 0) { // No need to display a message since Unity will already have done this. return; } // Actual success: continue on to the run step. break; case BuildResult.Failed: LogError(string.Format("Build failed with {0} error(s)", buildReport.summary.totalErrors)); return; default: LogError("Build failed with unknown error"); return; } #else var buildPlayerResult = BuildPipeline.BuildPlayer(buildPlayerOptions); if (!string.IsNullOrEmpty(buildPlayerResult)) { // Check for intended build cancellation. if (buildPlayerResult == "Building Player was cancelled") { Debug.Log(buildPlayerResult); } else { LogError(buildPlayerResult); } return; } #endif var window = PostBuildCommandLineDialog.CreateDialog("Install and run app"); window.modal = false; window.summaryText = "Installing app on device"; window.bodyText = "The APK built successfully. Waiting for scripts to reload...\n"; window.autoScrollToBottom = true; window.CommandLineParams = new CommandLineParameters() { FileName = JavaUtilities.JavaBinaryPath, Arguments = string.Format("-jar {0} run {1}", jarPath, apkPath), }; window.CommandLineParams.AddEnvironmentVariable( AndroidSdkManager.AndroidHome, AndroidSdkManager.AndroidSdkRoot); window.Show(); }