using System.Collections; using Unity.EditorCoroutines.Editor; namespace Guru.Editor { using NUnit.Framework; using UnityEditor; using UnityEngine; using System; using System.IO; using System.Xml; public static class AndroidManifestMod { private const string TargetPath = "Plugins/Android/AndroidManifest.xml"; private const string ValOptimizeInitialization = "com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"; private const string ValOptimizeAdLoading = "com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"; private static string TargetFullPath = Path.Combine(Application.dataPath, TargetPath); public static bool IsManifestExist() => File.Exists(TargetFullPath); public static void Apply() { if (!IsManifestExist()) { CopyManifest(); return; } var doc = new XmlDocument(); doc.Load(TargetFullPath); var rootNode = doc.SelectSingleNode("manifest/application"); int item1 = 0; int item2 = 0; XmlNodeList metadatas = rootNode.SelectNodes("meta-data"); if (metadatas != null && metadatas.Count > 0) { bool isDirty = false; foreach (XmlElement e in metadatas) { if (e != null) { if (e.HasAttribute("android:name")) { if (e.Attributes["android:name"].Value == ValOptimizeInitialization) item1 = 1; if (e.Attributes["android:name"].Value == ValOptimizeAdLoading) item2 = 1; } } } } string androidSP = "http://schemas.android.com/apk/res/android"; if (item1 == 0) { var e = doc.CreateElement("meta-data"); e.SetAttribute("name",androidSP, ValOptimizeInitialization); e.SetAttribute("value",androidSP, "true"); rootNode.AppendChild(e); } if (item2 == 0) { var e = doc.CreateElement("meta-data"); e.SetAttribute("name",androidSP,ValOptimizeAdLoading); e.SetAttribute("value",androidSP, "true"); rootNode.AppendChild(e); } var rootE = doc.SelectSingleNode("manifest") as XmlElement; if (rootE != null) { rootE.Attributes["package"].Value = PlayerSettings.applicationIdentifier; // 写入包名 } doc.Save(TargetFullPath); } private static void CopyManifest() { if (File.Exists(TargetFullPath)) return; var path = GuruEditorHelper.GetFilePath($"{nameof(AndroidManifestMod)}.cs t:Script"); if (!string.IsNullOrEmpty(path)) { var files = Path.GetFullPath($"{path}/../Files"); var from = $"{files}/AndroidManifest.txt"; if (File.Exists(from)) { File.Copy(from, TargetFullPath); } } } #region Testing [Test] public static void Test_Injection() { Apply(); } #endregion } }