com.guru.unity.sdk.core/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs

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