300 lines
9.9 KiB
C#
300 lines
9.9 KiB
C#
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 =
|
|
SDKEditorNetworkTool.GetText($"https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml");
|
|
if (string.IsNullOrEmpty(xmlText))
|
|
{
|
|
throw new RuntimeBinderException(
|
|
$"获取版本号失败 , 接口请求返回为空,或请求不到. https://repo.dgtverse.cn/repository/tk_my/com/earn/money/{Application.identifier}/maven-metadata.xml");
|
|
}
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|
|
} |