135 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| namespace Guru.Editor
 | |
| {
 | |
|     using UnityEditor;
 | |
|     using UnityEditor.Callbacks;
 | |
|     using UnityEngine;
 | |
|     using System.Xml;
 | |
|     using System.IO;
 | |
|     using NUnit.Framework;
 | |
|     
 | |
|     public class PostBuild_DMA
 | |
|     {
 | |
|         
 | |
|         
 | |
|         [PostProcessBuild]
 | |
|         public static void OnPostProcessBuild(BuildTarget target, string buildPath)
 | |
|         {
 | |
|             string dir = "";
 | |
|             // TODO: add your code here
 | |
|             if (target == BuildTarget.Android)
 | |
|             {
 | |
|                 dir = $"{buildPath}/src/main";
 | |
|                 OnSetAndroidManifest(dir);
 | |
|             }
 | |
|             else if (target == BuildTarget.iOS)
 | |
|             {
 | |
|                 
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
|         #region Android Inject
 | |
| 
 | |
|         
 | |
|         
 | |
|         /*--------------------------------------------------------------------------------
 | |
|          *
 | |
|          *
 | |
|          * 向 AndroidManifest 中添加以下数据
 | |
|          * <meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="true" />
 | |
|          * <meta-data android:name="google_analytics_default_allow_ad_storage" android:value="true" />
 | |
|          * <meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="true" />
 | |
|          * <meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="true" />
 | |
|          *
 | |
|          * 
 | |
|         --------------------------------------------------------------------------------*/
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 修复 AndroidManifest.xml
 | |
|         /// </summary>
 | |
|         /// <param name="dir"></param>
 | |
|         private static void OnSetAndroidManifest(string dir)
 | |
|         {
 | |
|             var filePath = Path.Combine(dir, "AndroidManifest.xml");
 | |
| 
 | |
|             // 预注入 Key
 | |
|             string[] dma_keys = new string[]
 | |
|             {
 | |
|                 "google_analytics_default_allow_analytics_storage",
 | |
|                 "google_analytics_default_allow_ad_storage",
 | |
|                 "google_analytics_default_allow_ad_user_data",
 | |
|                 "google_analytics_default_allow_ad_personalization_signals"
 | |
|             };
 | |
| 
 | |
|             int[] flags = new int[] { 0, 0, 0, 0 };
 | |
| 
 | |
|             string defaultValue = "true"; // 日后可能会进行修改
 | |
| 
 | |
|             if (File.Exists(filePath))
 | |
|             {
 | |
|                 var xmlStr = File.ReadAllText(filePath);
 | |
| 
 | |
|                 var doc = new XmlDocument();
 | |
|                 doc.LoadXml(xmlStr);
 | |
| 
 | |
|                 var root = doc.SelectSingleNode("manifest") as XmlElement;
 | |
|                 if (root == null) return;
 | |
|                 if (root.SelectSingleNode("application") is XmlElement app)
 | |
|                 {
 | |
|                     var namespace_uri = root.GetAttribute("xmlns:android");
 | |
|                     
 | |
|                     var list = app.SelectNodes("meta-data");
 | |
|                     
 | |
|                     // 刷新已有属性
 | |
|                     foreach (XmlElement item in list)
 | |
|                     {
 | |
|                         for(int i = 0; i < dma_keys.Length; i++)
 | |
|                         {
 | |
|                             if (item.HasAttributes && item.GetAttribute("android:name") == dma_keys[i])
 | |
|                             {
 | |
|                                 item.SetAttribute("value", namespace_uri, defaultValue);
 | |
|                                 flags[i] = 1;
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     // 补全缺失属性
 | |
|                     for (int i = 0; i < flags.Length; i++)
 | |
|                     {
 | |
|                         if (flags[i] == 0)
 | |
|                         {
 | |
|                             var node = doc.CreateElement("meta-data");
 | |
|                             node.SetAttribute("name", namespace_uri,dma_keys[i]);
 | |
|                             node.SetAttribute("value", namespace_uri, defaultValue);
 | |
|                             app.AppendChild(node);
 | |
|                         }
 | |
|                     }
 | |
|                     
 | |
|                     doc.Save(filePath);
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Debug.LogError($"[Post] can't find AndroidManifest.xml at {filePath}");
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         
 | |
|         #endregion
 | |
| 
 | |
| 
 | |
|         #region 单元测试
 | |
| 
 | |
|         [Test]
 | |
|         public static void Test_AndroidManifestInject()
 | |
|         {
 | |
|             OnSetAndroidManifest($"{Application.dataPath}/Plugins/Android");
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|         
 | |
|     }
 | |
| } |