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 中添加以下数据 * * * * * * --------------------------------------------------------------------------------*/ /// /// 修复 AndroidManifest.xml /// /// 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 } }