| 
									
										
										
										
											2025-09-01 06:57:00 +00:00
										 |  |  | using System; | 
					
						
							|  |  |  | using System.Collections; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using System.IO; | 
					
						
							|  |  |  | using System.Text; | 
					
						
							|  |  |  | using System.Xml; | 
					
						
							|  |  |  | using Microsoft.CSharp.RuntimeBinder; | 
					
						
							|  |  |  | using UnityEditor; | 
					
						
							|  |  |  | using UnityEditor.Build; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public class SDKTool | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public static string GetPackageName() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return PlayerSettings.GetApplicationIdentifier(BuildTargetGroup.Android); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static string MavenStr = @"
 | 
					
						
							|  |  |  |         maven {  | 
					
						
							|  |  |  |             url 'https://repo.dgtverse.cn/repository/maven-public/'  | 
					
						
							|  |  |  |             name 'maven_repo.dgtverse.cn' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  | ";
 | 
					
						
							|  |  |  |     public static Hashtable LoadProperties(string file) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var ht = new Hashtable(16); | 
					
						
							|  |  |  |         string content = null; | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             content = file; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch (Exception e) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var rows = content.Split('\n'); | 
					
						
							|  |  |  |         string[] kv = null; | 
					
						
							|  |  |  |         foreach (var c in rows) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (c.Trim().Length == 0) | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             kv = c.Split('='); | 
					
						
							|  |  |  |             ht[kv[0].Trim()] = kv.Length switch | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 1 => "", | 
					
						
							|  |  |  |                 2 => kv[1].Trim(), | 
					
						
							|  |  |  |                 _ => ht[kv[0].Trim()] | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return ht; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static string GetSDKVersion() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var xmlText = | 
					
						
							| 
									
										
										
										
											2025-09-02 06:37:21 +00:00
										 |  |  |             SDKEditorNetworkTool.GetText($"https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml"); | 
					
						
							| 
									
										
										
										
											2025-09-01 06:57:00 +00:00
										 |  |  |         if (string.IsNullOrEmpty(xmlText)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             throw new RuntimeBinderException( | 
					
						
							| 
									
										
										
										
											2025-09-02 06:37:21 +00:00
										 |  |  |                 $"获取版本号失败 , 接口请求返回为空,或请求不到. https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml"); | 
					
						
							| 
									
										
										
										
											2025-09-01 06:57:00 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             XmlDocument xmlDoc = new XmlDocument(); | 
					
						
							|  |  |  |             xmlDoc.LoadXml(xmlText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             XmlNodeList versions = xmlDoc.SelectNodes("//versioning/latest"); | 
					
						
							|  |  |  |             if (versions == null) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 throw new RuntimeBinderException("获取版本号失败"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (versions.Count > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 string latestVersion = versions[0].InnerText; | 
					
						
							|  |  |  |                 Debug.Log($"Latest version: {latestVersion}"); | 
					
						
							|  |  |  |                 return latestVersion; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw new RuntimeBinderException("解析xml失败"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch (Exception e) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             throw new RuntimeBinderException($"获取版本号失败 : XML parsing error: {e.Message}"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private void CopyGoogleServices(string path) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // var gpPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "SDKConfig" + | 
					
						
							|  |  |  |         //              Path.DirectorySeparatorChar + SDKTool.GetPackageName() + Path.DirectorySeparatorChar + | 
					
						
							|  |  |  |         //              "google-services.json"; | 
					
						
							|  |  |  |         string gpPath = Path.Combine(Application.streamingAssetsPath, "google-services.json"); | 
					
						
							|  |  |  |         if (!File.Exists(gpPath)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             throw new BuildFailedException("Can't find google-services.json"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var targetPath = path + Path.DirectorySeparatorChar + ".." + Path.DirectorySeparatorChar + "launcher" + | 
					
						
							|  |  |  |                          Path.DirectorySeparatorChar + "google-services.json"; | 
					
						
							|  |  |  |         Debug.Log("gpPath : " + gpPath + "\t targetPath : " + targetPath); | 
					
						
							|  |  |  |         if (File.Exists(targetPath)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             File.Delete(targetPath); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         File.Copy(gpPath, targetPath); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private void AddFirebasePluginToGradle(string path) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var filePath = | 
					
						
							|  |  |  |             $"{path}{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}launcher{Path.DirectorySeparatorChar}build.gradle"; | 
					
						
							|  |  |  |         if (File.ReadAllText(filePath).Contains("com.google.gms.google-services")) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var newLine = new List<string> | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "apply plugin: 'com.google.gms.google-services'\n", | 
					
						
							|  |  |  |             "apply plugin: 'com.google.firebase.crashlytics'\n" | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         newLine.AddRange(File.ReadLines(filePath)); | 
					
						
							|  |  |  |         File.WriteAllLines(filePath, newLine); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private void AddFirebasePlugin(string rootPath) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         _AddFirebasePlugin($"{rootPath}{Path.DirectorySeparatorChar}build.gradle"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private void _AddFirebasePlugin(string filePath) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (File.ReadAllText(filePath).Contains("com.google.gms:google-services")) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var newLine = new List<string>(); | 
					
						
							|  |  |  |         foreach (var line in File.ReadLines(filePath)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var trim = line.Trim(); | 
					
						
							|  |  |  |             if (trim.Contains("com.google.gms.google-services") && trim.Contains("4.4.2")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (trim.Contains("com.google.firebase.crashlytics") && trim.Contains("2.9.4")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (trim.Contains("com.google.gms:google-services") && trim.Contains("4.3.10")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (trim.Contains("com.google.firebase:firebase-crashlytics-gradle") && trim.Contains("2.9.4")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             newLine.Add(line); | 
					
						
							|  |  |  |             if (trim.StartsWith("google()")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 newLine.Add(MavenStr); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (trim.StartsWith("classpath")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 newLine.Add("classpath 'com.google.gms:google-services:4.3.10'\n"); | 
					
						
							|  |  |  |                 newLine.Add("classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.4'\n"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (trim.StartsWith("id 'com.android.application'")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 newLine.Add("id 'com.google.gms.google-services' version '4.4.2' apply false\n"); | 
					
						
							|  |  |  |                 newLine.Add("id 'com.google.firebase.crashlytics' version '2.9.4' apply false\n"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         File.WriteAllLines(filePath, newLine); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private static string _manifestFilePath; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static string GetManifestPath(string basePath) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (string.IsNullOrEmpty(_manifestFilePath)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             StringBuilder pathBuilder = new StringBuilder(basePath); | 
					
						
							|  |  |  |             pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); | 
					
						
							|  |  |  |             pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); | 
					
						
							|  |  |  |             pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml"); | 
					
						
							|  |  |  |             _manifestFilePath = pathBuilder.ToString(); | 
					
						
							|  |  |  |             Debug.Log($"_manifestFilePath = {_manifestFilePath}"); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return _manifestFilePath; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     internal class AndroidXmlDocument : XmlDocument | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         private string m_Path; | 
					
						
							|  |  |  |         protected XmlNamespaceManager nsMgr; | 
					
						
							|  |  |  |         public const string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public AndroidXmlDocument(string path) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_Path = path; | 
					
						
							|  |  |  |             using (var reader = new XmlTextReader(m_Path)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 reader.Read(); | 
					
						
							|  |  |  |                 Load(reader); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             nsMgr = new XmlNamespaceManager(NameTable); | 
					
						
							|  |  |  |             nsMgr.AddNamespace("android", AndroidXmlNamespace); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public string Save() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return SaveAs(m_Path); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public string SaveAs(string path) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             using (var writer = new XmlTextWriter(path, new UTF8Encoding(false))) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 writer.Formatting = Formatting.Indented; | 
					
						
							|  |  |  |                 Save(writer); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return path; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     internal class AndroidManifest : AndroidXmlDocument | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             private readonly XmlElement ApplicationElement; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             public AndroidManifest(string path) : base(path) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             private XmlAttribute CreateAndroidAttribute(string key, string value, string prefix = "android", string namespaceURI = AndroidXmlNamespace) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 XmlAttribute attr = CreateAttribute(prefix, key, namespaceURI); | 
					
						
							|  |  |  |                 attr.Value = value; | 
					
						
							|  |  |  |                 return attr; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal XmlNode GetActivityWithLaunchIntent() | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return SelectSingleNode( | 
					
						
							|  |  |  |                     "/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " + | 
					
						
							|  |  |  |                     "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", nsMgr); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal void SetApplicationTheme(string appTheme) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal void SetStartingActivityName(string activityName) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal void SetApplicationAttribute(string key, string value, string prefix = "android", string namespaceURI = AndroidXmlNamespace) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ApplicationElement.Attributes.Append(CreateAndroidAttribute(key, value, prefix, namespaceURI)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal void RemoveApplicationAttribute(string key) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // ApplicationElement.Attributes.Remove(CreateAndroidAttribute(key, key)); | 
					
						
							|  |  |  |                 var removeNamedItem = ApplicationElement.Attributes.RemoveNamedItem(key); | 
					
						
							|  |  |  |                 Debug.Log($"删除节点 key = {key} value = {removeNamedItem}"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             internal void SetStartingActivityAttribute(string key, string value) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 XmlNode node = GetActivityWithLaunchIntent(); | 
					
						
							|  |  |  |                 Debug.Log($"Main节点 node = {node} key = {key} value = {value}"); | 
					
						
							|  |  |  |                 if (node != null) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     XmlAttributeCollection attributes = node.Attributes; | 
					
						
							|  |  |  |                     attributes.Append(CreateAndroidAttribute(key, value)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | } |