184 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections.Generic;
 | ||
| using System.IO;
 | ||
| using EFSDK;
 | ||
| using Unity.Plastic.Newtonsoft.Json.Linq;
 | ||
| using UnityEditor.Android;
 | ||
| using UnityEngine;
 | ||
| 
 | ||
| public class DynamicApplicationClass : IPostGenerateGradleAndroidProject
 | ||
| {
 | ||
|     public int callbackOrder
 | ||
|     {
 | ||
|         get { return int.MaxValue; }
 | ||
|     }
 | ||
| 
 | ||
|     private string GetRootPath(string path)
 | ||
|     {
 | ||
|         return Path.Combine(path, "..", "");
 | ||
|     }
 | ||
| 
 | ||
|     public void OnPostGenerateGradleAndroidProject(string path)
 | ||
|     {
 | ||
|         AndroidResAarBuilder.BuildAAR();
 | ||
|         var androidManifest = new SDKTool.AndroidManifest(SDKTool.GetManifestPath(path));
 | ||
|         androidManifest.SetStartingActivityAttribute("hardwareAccelerated", "true");
 | ||
|         androidManifest.Save();
 | ||
|         SetGradleConstraints(path);
 | ||
|         FixedAddressValueTypeAttribute(path);
 | ||
|         // ParseConfigFile(path);
 | ||
|     }
 | ||
| 
 | ||
|     private static void SetGradleConstraints(string path)
 | ||
|     {
 | ||
|         string gradlePath = Path.Combine(path, "../unityLibrary", "build.gradle");
 | ||
| 
 | ||
|         if (!File.Exists(gradlePath))
 | ||
|         {
 | ||
|             Debug.LogError("未找到unityLibrary模块的build.gradle文件: " + gradlePath);
 | ||
|         }
 | ||
| 
 | ||
|         // var content = "    implementation \"androidx.datastore:datastore:1.0.0\"\n    constraints {\n        implementation(\"androidx.datastore:datastore\") {\n            version {\n                strictly \"1.0.0\"\n            }\n            because \"1.0.0版本,避免高版本兼容性问题\"\n        }\n    }";
 | ||
|         var buildGradleOutLines = new List<string>();
 | ||
|         foreach (var line in File.ReadLines(gradlePath))
 | ||
|         {
 | ||
|             if (line.Trim().Contains("com.earn.money:sdk"))
 | ||
|             {
 | ||
|                 Debug.Log("找到com.earn.money:sdk");
 | ||
|                 
 | ||
|                 buildGradleOutLines.Add($"        implementation ('com.earn.money:{Application.identifier}:{SDKTool.GetSDKVersion()}')");
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 buildGradleOutLines.Add(line);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         File.WriteAllText(gradlePath, string.Join("\n", buildGradleOutLines.ToArray()) + "\n");
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     private static void FixedAddressValueTypeAttribute(string path)
 | ||
|     {
 | ||
|         string launcherBuildGradlePath = Path.Combine(path, "../launcher", "build.gradle");
 | ||
|         string content =
 | ||
|             " configurations.all {\n        resolutionStrategy {\n            force \"androidx.appcompat:appcompat:1.6.1\"\n            force \"androidx.core:core:1.12.0\"\n        }\n    }";
 | ||
|         var launcherBuildGradleOutLines = new List<string>();
 | ||
|         foreach (var line in File.ReadLines(launcherBuildGradlePath))
 | ||
|         {
 | ||
|             launcherBuildGradleOutLines.Add(line);
 | ||
|             if (line.Trim().StartsWith("defaultConfig"))
 | ||
|             {
 | ||
|                 launcherBuildGradleOutLines.Add(content);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         File.WriteAllText(launcherBuildGradlePath, string.Join("\n", launcherBuildGradleOutLines.ToArray()) + "\n");
 | ||
|     }
 | ||
|     
 | ||
|     
 | ||
|     
 | ||
|     private void ParseConfigFile(string path)
 | ||
|     {
 | ||
|         Dictionary<string, string> jsonDict = ParseToSimpleDictionary();
 | ||
|         if (jsonDict == null || jsonDict.Count == 0)
 | ||
|         {
 | ||
|             throw new System.Exception("配置文件中未解析到google-services.json");
 | ||
|         }
 | ||
|             
 | ||
|         // 获取launcher模块的build.gradle路径
 | ||
|         string gradlePath = Path.Combine(path, "../launcher", "build.gradle");
 | ||
|         
 | ||
|         if (!File.Exists(gradlePath))
 | ||
|         {
 | ||
|             Debug.LogError("未找到launcher模块的build.gradle文件: " + gradlePath);
 | ||
|         }
 | ||
|         // 读取文件内容
 | ||
|         string newResValue = $"\n        resValue \"string\", \"game_services_project_id\", \"{jsonDict["project_id"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"project_id\", \"{jsonDict["project_id"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_project_id\", \"{jsonDict["project_id"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_package_name\", \"{jsonDict["package_name"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"gcm_defaultSenderId\", \"{jsonDict["project_number"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_api_key\", \"{jsonDict["current_key"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_app_id\", \"{jsonDict["mobilesdk_app_id"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_crash_reporting_api_key\", \"{jsonDict["current_key"]}\"" +
 | ||
|                              $"\n        resValue \"string\", \"google_storage_bucket\", \"{jsonDict["storage_bucket"]}\"";
 | ||
|         Debug.Log($"DSSdk newResValue: {newResValue}");
 | ||
|         string launcherBuildGradlePath = Path.Combine(path, "../launcher", "build.gradle");
 | ||
|            var launcherBuildGradleOutLines = new List<string>();
 | ||
|         foreach (var line in File.ReadLines(launcherBuildGradlePath))
 | ||
|         {
 | ||
|             launcherBuildGradleOutLines.Add(line);
 | ||
|             if (line.Trim().StartsWith("defaultConfig"))
 | ||
|             {
 | ||
|                 launcherBuildGradleOutLines.Add(newResValue);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         File.WriteAllText(launcherBuildGradlePath, string.Join("\n", launcherBuildGradleOutLines.ToArray()) + "\n");
 | ||
| 
 | ||
|     }
 | ||
|     
 | ||
|      public Dictionary<string, string> ParseToSimpleDictionary()
 | ||
|     {
 | ||
|         Dictionary<string, string> simpleDict = new Dictionary<string, string>();
 | ||
|         
 | ||
|         try
 | ||
|         {
 | ||
|             string filePath = Path.Combine(Application.streamingAssetsPath, "google-services.json");
 | ||
|             if (!File.Exists(filePath))
 | ||
|             {
 | ||
|                 Debug.LogError("文件不存在: " + filePath);
 | ||
|                 return simpleDict;
 | ||
|             }
 | ||
| 
 | ||
|             string jsonContent = File.ReadAllText(filePath);
 | ||
|             JObject jsonObject = JObject.Parse(jsonContent);
 | ||
|             
 | ||
|             // 递归解析所有字段
 | ||
|             ParseJToken(jsonObject, simpleDict);
 | ||
|             return simpleDict;
 | ||
|         }
 | ||
|         catch (System.Exception e)
 | ||
|         {
 | ||
|             Debug.LogError("解析错误: " + e.Message);
 | ||
|             return simpleDict;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 递归解析JToken并提取字段名和值
 | ||
|     /// </summary>
 | ||
|     private void ParseJToken(JToken token, Dictionary<string, string> dict)
 | ||
|     {
 | ||
|         if (token is JObject jObject)
 | ||
|         {
 | ||
|             foreach (var property in jObject.Properties())
 | ||
|             {
 | ||
|                 // 如果是对象类型,继续递归解析
 | ||
|                 if (property.Value is JObject || property.Value is JArray)
 | ||
|                 {
 | ||
|                     ParseJToken(property.Value, dict);
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     // 基本类型直接添加,相同key会覆盖
 | ||
|                     if (dict.ContainsKey(property.Name))
 | ||
|                     {
 | ||
|                         Debug.LogWarning($"字段名重复,已覆盖: {property.Name}");
 | ||
|                     }
 | ||
|                     dict[property.Name] = property.Value.ToString();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         else if (token is JArray jArray)
 | ||
|         {
 | ||
|             // 解析数组中的每个元素
 | ||
|             foreach (var item in jArray)
 | ||
|             {
 | ||
|                 ParseJToken(item, dict);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| } |