diff --git a/Editor/Utils.meta b/Editor/Utils.meta new file mode 100644 index 0000000..19f4f24 --- /dev/null +++ b/Editor/Utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1429f4e79961470ba0597d4f3caceee8 +timeCreated: 1711525393 \ No newline at end of file diff --git a/Editor/Utils/MainManifestDoc.cs b/Editor/Utils/MainManifestDoc.cs new file mode 100644 index 0000000..e8d5117 --- /dev/null +++ b/Editor/Utils/MainManifestDoc.cs @@ -0,0 +1,252 @@ + +using System.Collections.Generic; + +namespace Guru.Editor +{ + using System.Xml; + using System.IO; + using UnityEngine; + + /// + /// Android 配置修改器 + /// + public class MainManifestDoc + { + private const string TargetPath = "Plugins/Android/AndroidManifest.xml"; + private const string XmlnsAndroid = "xmlns:android"; + private const string NamespaceAndroid = "http://schemas.android.com/apk/res/android"; + private const string XmlnsTools= "xmlns:tools"; + private const string NamespaceTools = "http://schemas.android.com/tools"; + + + + private XmlDocument _doc; + public XmlDocument Doc => _doc; + + private string _docPath; + private bool _isReady = false; + + private XmlElement _manifestNode; + private XmlElement _applicationNode; + private XmlNodeList _metadataList; + private XmlNodeList _permissionList; + + + #region Initiallize + + /// + /// 加载文件 + /// + /// + /// + public static MainManifestDoc Load(string docPath = "") + { + if (string.IsNullOrEmpty(docPath)) + { + docPath = Path.GetFullPath(Path.Combine(Application.dataPath, TargetPath)); + } + + if (!File.Exists(docPath)) + { + Debug.LogError($"--- File not found: {docPath}"); + return null; + } + + var mod = new MainManifestDoc(); + mod.ReadFromPath(docPath); + return mod; + } + + public static MainManifestDoc Read(string xmlStr, string docPath = "") + { + var mod = new MainManifestDoc(); + mod.ReadFromXml(xmlStr, docPath); + return mod; + } + + + /// + /// 从文件路径读取 + /// + /// + public void ReadFromPath(string docPath) + { + _isReady = false; + if (File.Exists(_docPath)) + { + _docPath = docPath; + var xmlStr = File.ReadAllText(docPath); + ReadFromXml(xmlStr); + } + } + + + public void ReadFromXml(string xmlStr, string docPath = "") + { + _doc = new XmlDocument(); + _doc.LoadXml(xmlStr); + Init(); + } + + + /// + /// Initializes the Doc + /// + private void Init() + { + // --- Root Nodes --- + _manifestNode = _doc.SelectSingleNode("manifest") as XmlElement; + _applicationNode = _doc.SelectSingleNode("manifest/application") as XmlElement; + // --- Metadatas --- + _metadataList = _applicationNode.SelectNodes("meta-data"); + // --- Permissions --- + _permissionList = _applicationNode.SelectNodes("uses-permission"); + + AddXmlnsAndroid(); + AddXmlnsTools(); + _isReady = true; + } + + /// + /// Save Doc + /// + public void Save(string docPath = "") + { + if (_isReady) + { + if(string.IsNullOrEmpty(docPath)) docPath = _docPath; + if (!string.IsNullOrEmpty(docPath)) + { + var dir = Directory.GetParent(docPath); + if(!dir.Exists) dir.Create(); + _doc.Save(_docPath); + + } + + } + } + + #endregion + + #region Node Opreation + + + public static bool AddAttribute(XmlElement node, string key, string value) + { + if (node != null) + { + if (node.HasAttribute(key)) + { + node.Attributes[key].Value = value; + } + else + { + node.SetAttribute(key, value); + } + return true; + } + return false; + } + + + + #endregion + + + #region API + + public bool AddXmlnsAndroid() + { + return AddAttribute(_manifestNode, XmlnsAndroid, NamespaceAndroid); + } + + public bool AddXmlnsTools() + { + return AddAttribute(_manifestNode, XmlnsTools, NamespaceTools); + } + + /// + /// Add Replace Item + /// + /// + public void AddReplaceItem(string item) + { + if (_manifestNode != null) + { + List items = new List(5); + if (_manifestNode.HasAttribute("replace", NamespaceTools)) + { + var arr = _manifestNode.GetAttribute("replace",NamespaceTools).Split(','); + if(arr != null && arr.Length > 0) + { + items.AddRange(arr); + } + } + + if (!items.Contains(item)) items.Add(item); + + _manifestNode.SetAttribute("replace", NamespaceTools, string.Join(",", items)); + } + } + + + /// + /// Set metadata + /// + /// + /// + public void SetMetadata(string key, string value) + { + _metadataList = _applicationNode?.SelectNodes("meta-data") ?? null; + + XmlElement item = null; + if (_metadataList != null) + { + foreach (XmlElement e in _metadataList) + { + // var nm = e.GetAttribute("name", NamespaceAndroid); + if (e.GetAttribute("name", NamespaceAndroid) is string k && k == key) + { + item = e; + break; + } + } + } + + if (item == null) + { + item = _doc.CreateElement("meta-data"); + _applicationNode?.AppendChild(item); + } + + item.SetAttribute("name", NamespaceAndroid, key); + item.SetAttribute("value", NamespaceAndroid, value); + } + + + #endregion + + + + #region Output + + + public override string ToString() + { + if (_doc != null) return _doc.InnerXml; + return this.ToString(); + } + + + #endregion + + + + + + + + + + } +} \ No newline at end of file diff --git a/Editor/Utils/MainManifestDoc.cs.meta b/Editor/Utils/MainManifestDoc.cs.meta new file mode 100644 index 0000000..61eed76 --- /dev/null +++ b/Editor/Utils/MainManifestDoc.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 89a1c7f77fcf4982adbbaf6dc61bd62d +timeCreated: 1711505949 \ No newline at end of file diff --git a/Runtime/Debugger/Doc.meta b/Runtime/Debugger/Doc.meta deleted file mode 100644 index 148cab5..0000000 --- a/Runtime/Debugger/Doc.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4bac8424332c40739e56d3637f75ef73 -timeCreated: 1711084911 \ No newline at end of file diff --git a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs index ec37481..affabe9 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs @@ -373,7 +373,7 @@ namespace Guru } catch (Exception ex) { - Analytics.LogCrashlytics(ex); + Analytics.LogCrashlytics($"{Tag} --- Json:{msg} Ex:{ex}"); } }