113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
| 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
 | |
|         
 | |
|     }
 | |
| } |