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
 | 
						|
        
 | 
						|
    }
 | 
						|
} |