public override void OnPreprocessBuild(BuildTarget target, string path) { var isARCoreRequired = ARCoreProjectSettings.Instance.IsARCoreRequired; Debug.LogFormat( "Building \"{0}\" app. Use 'Edit > Project Settings > ARCore' to adjust " + "ARCore SDK for Unity settings.\n" + "See {1} for more information.", isARCoreRequired ? "AR Required" : "AR Optional", "https://developers.google.com/ar/develop/unity/enable-arcore"); AssetHelper.GetPluginImporterByName("google_ar_required.aar") .SetCompatibleWithPlatform(BuildTarget.Android, isARCoreRequired); AssetHelper.GetPluginImporterByName("google_ar_optional.aar") .SetCompatibleWithPlatform(BuildTarget.Android, !isARCoreRequired); }
private void _PreprocessAndroidBuild() { // Get the Jdk path. var jdkPath = UnityEditor.EditorPrefs.GetString("JdkPath"); if (string.IsNullOrEmpty(jdkPath)) { Debug.Log( "Unity 'Preferences > External Tools > Android JDK' path is not set. " + "Falling back to JAVA_HOME environment variable."); jdkPath = System.Environment.GetEnvironmentVariable("JAVA_HOME"); } if (string.IsNullOrEmpty(jdkPath)) { throw new BuildFailedException( "A JDK path needs to be specified for the Android build."); } bool cloudAnchorsEnabled = !string.IsNullOrEmpty(ARCoreProjectSettings.Instance.CloudServicesApiKey); var cachedCurrentDirectory = Directory.GetCurrentDirectory(); var pluginsFolderPath = Path.Combine(cachedCurrentDirectory, AssetDatabase.GUIDToAssetPath(k_PluginsFolderGuid)); string cloudAnchorsManifestAarPath = Path.Combine(pluginsFolderPath, "cloud_anchor_manifest.aar"); var jarPath = Path.Combine(jdkPath, "bin/jar"); if (cloudAnchorsEnabled) { // If the Api Key didn't change then do nothing. if (!_IsApiKeyDirty(jarPath, cloudAnchorsManifestAarPath, ARCoreProjectSettings.Instance.CloudServicesApiKey)) { return; } // Replace the project's cloud anchor AAR with the newly generated AAR. Debug.Log("Enabling Cloud Anchors in this build."); var tempDirectoryPath = Path.Combine(cachedCurrentDirectory, FileUtil.GetUniqueTempPathInProject()); try { // Move to a temp directory. Directory.CreateDirectory(tempDirectoryPath); Directory.SetCurrentDirectory(tempDirectoryPath); var manifestTemplatePath = Path.Combine( cachedCurrentDirectory, AssetDatabase.GUIDToAssetPath(k_ManifestTemplateGuid)); // Extract the "template AAR" and remove it. string output; string errors; ShellHelper.RunCommand( jarPath, string.Format("xf \"{0}\"", manifestTemplatePath), out output, out errors); // Replace Api key template parameter in manifest file. var manifestPath = Path.Combine(tempDirectoryPath, "AndroidManifest.xml"); var manifestText = File.ReadAllText(manifestPath); manifestText = manifestText.Replace( "{{CLOUD_ANCHOR_API_KEY}}", ARCoreProjectSettings.Instance.CloudServicesApiKey); File.WriteAllText(manifestPath, manifestText); // Compress the new AAR. var fileListBuilder = new StringBuilder(); foreach (var filePath in Directory.GetFiles(tempDirectoryPath)) { fileListBuilder.AppendFormat(" {0}", Path.GetFileName(filePath)); } string command = string.Format( "cf cloud_anchor_manifest.aar {0}", fileListBuilder.ToString()); ShellHelper.RunCommand( jarPath, command, out output, out errors); if (!string.IsNullOrEmpty(errors)) { throw new BuildFailedException( string.Format( "Error creating jar for cloud anchor manifest: {0}", errors)); } File.Copy(Path.Combine(tempDirectoryPath, "cloud_anchor_manifest.aar"), cloudAnchorsManifestAarPath, true); } finally { // Cleanup. Directory.SetCurrentDirectory(cachedCurrentDirectory); Directory.Delete(tempDirectoryPath, true); AssetDatabase.Refresh(); } AssetHelper.GetPluginImporterByName("cloud_anchor_manifest.aar") .SetCompatibleWithPlatform(BuildTarget.Android, true); } else { Debug.Log( "Cloud Anchor API key has not been set. Cloud Anchors will be disabled in " + "this build."); File.Delete(cloudAnchorsManifestAarPath); AssetDatabase.Refresh(); } }