354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | #if UNITY_ANDROID && UNITY_2018_2_OR_NEWER | ||
|  | using AnyThink.Scripts.IntegrationManager.Editor; | ||
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.IO; | ||
|  | using System.Linq; | ||
|  | using System.Xml.Linq; | ||
|  | using UnityEditor; | ||
|  | using UnityEditor.Android; | ||
|  | using System.Text.RegularExpressions; | ||
|  | using System.Diagnostics; | ||
|  | using UnityEngine; | ||
|  | using System.Text; | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace AnyThink.Scripts.Editor | ||
|  | { | ||
|  | 
 | ||
|  |     public class ATProcessBuildGradleAndroid | ||
|  |     { | ||
|  | 
 | ||
|  |         // public void OnPostGenerateGradleAndroidProject(string path) | ||
|  |         // { | ||
|  | 
 | ||
|  |         // } | ||
|  | 
 | ||
|  |         public static void processBuildGradle(string path) | ||
|  |         { | ||
|  | #if UNITY_2019_3_OR_NEWER | ||
|  |             var buildGradlePath = Path.Combine(path, "../build.gradle"); | ||
|  | #else | ||
|  |             var buildGradlePath = Path.Combine(path, "build.gradle"); | ||
|  | #endif   | ||
|  | 
 | ||
|  | #if UNITY_2022_1_OR_NEWER | ||
|  |             ATLog.log("processBuildGradle() >>> called"); | ||
|  | #else  | ||
|  |             replaceBuildPluginVersion(buildGradlePath); | ||
|  |             // replaceAppBuildPluginVersion(path); | ||
|  | #endif | ||
|  |             // replaceAppBuildPluginVersion(path); | ||
|  |             handleNetworksConfit(path); | ||
|  |             // handleNetworkResMerge(path); | ||
|  |             // callGradleTask(path); | ||
|  |         } | ||
|  |         //修改项目的根目录下的build.gradle文件的插件版本号 | ||
|  |         private static void replaceBuildPluginVersion(string buildGradlePath) | ||
|  |         { | ||
|  |             if (!File.Exists(buildGradlePath)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |             string gradleFileContent = ""; | ||
|  |             using (StreamReader reader = new StreamReader(buildGradlePath)) | ||
|  |             { | ||
|  |                 gradleFileContent = reader.ReadToEnd(); | ||
|  |             } | ||
|  |             if (string.IsNullOrEmpty(gradleFileContent)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |              | ||
|  |             string buildGradleVersion = ""; | ||
|  |             string buildGradlePattern = ""; | ||
|  | 
 | ||
|  |             string buildGradleVersion3 = "3.3.3";    // 新gradle插件版本号 | ||
|  |             string buildGradlePattern3 = @"(?<=gradle:)3\.3\.\d+"; | ||
|  |             string buildGradleVersion4 = "3.4.3";  | ||
|  |             string buildGradlePattern4 = @"(?<=gradle:)3\.4\.\d+"; | ||
|  |             string buildGradleVersion5 = "3.5.4"; | ||
|  |             string buildGradlePattern5 = @"(?<=gradle:)3\.5\.\d+"; | ||
|  |             string buildGradleVersion6 = "3.6.4"; | ||
|  |             string buildGradlePattern6 = @"(?<=gradle:)3\.6\.\d+"; | ||
|  | 
 | ||
|  |             if (isMatchGradleVersion(gradleFileContent, buildGradleVersion3)) | ||
|  |             { | ||
|  |                 buildGradleVersion = buildGradleVersion3; | ||
|  |                 buildGradlePattern = buildGradlePattern3; | ||
|  |             }  | ||
|  |             else if(isMatchGradleVersion(gradleFileContent, buildGradleVersion4)) | ||
|  |             { | ||
|  |                 buildGradleVersion = buildGradleVersion4; | ||
|  |                 buildGradlePattern = buildGradlePattern4; | ||
|  |             } | ||
|  |             else if(isMatchGradleVersion(gradleFileContent, buildGradleVersion5)) | ||
|  |             { | ||
|  |                 buildGradleVersion = buildGradleVersion5; | ||
|  |                 buildGradlePattern = buildGradlePattern5; | ||
|  |             } | ||
|  |             else if(isMatchGradleVersion(gradleFileContent, buildGradleVersion6)) | ||
|  |             { | ||
|  |                 buildGradleVersion = buildGradleVersion6; | ||
|  |                 buildGradlePattern = buildGradlePattern6; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (!string.IsNullOrEmpty(buildGradlePattern) && !string.IsNullOrEmpty(buildGradleVersion)) | ||
|  |             { | ||
|  |                 replaceContent(buildGradlePath, buildGradlePattern, buildGradleVersion); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static void replaceContent(string filePath, string pattern, string content) | ||
|  |         { | ||
|  |             if (!File.Exists(filePath)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |             string buildGradle = ""; | ||
|  |             using (StreamReader reader = new StreamReader(filePath)) | ||
|  |             { | ||
|  |                 buildGradle = reader.ReadToEnd(); | ||
|  |             } | ||
|  |             // Regex regex = new Regex(pattern); | ||
|  |             buildGradle = Regex.Replace(buildGradle, pattern, content); | ||
|  | 
 | ||
|  |             // 修改gradle-wrapper版本号 | ||
|  |             // string oldWrapperVersion = "distributionUrl=https\\://services.gradle.org/d | ||
|  |             using (StreamWriter writer = new StreamWriter(filePath)) | ||
|  |             { | ||
|  |                 writer.Write(buildGradle); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static bool isMatchGradleVersion(string gradleFileContent, string version) | ||
|  |         { | ||
|  |             string matchStr = String.Format("gradle:{0}", version.Substring(0, 3)); | ||
|  |             return gradleFileContent.Contains(matchStr); | ||
|  |         } | ||
|  |         //修改app module下的build.gradle | ||
|  |         private static void replaceAppBuildPluginVersion(string path) | ||
|  |         { | ||
|  | #if UNITY_2019_3_OR_NEWER | ||
|  |             var buildGradlePath = Path.Combine(path, "../launcher/build.gradle"); | ||
|  | #else | ||
|  |             var buildGradlePath = Path.Combine(path, "launcher/build.gradle"); | ||
|  | #endif   | ||
|  |             if (!File.Exists(buildGradlePath)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |             string buildGradleVersion = "30"; | ||
|  |             string compileSdkVersionPattern = "compileSdkVersion"; | ||
|  |             string targetSdkVersionPattern = "targetSdkVersion"; | ||
|  | 
 | ||
|  |             List<string> lines = new List<string>(); | ||
|  |             using (StreamReader reader = new StreamReader(buildGradlePath)) | ||
|  |             { | ||
|  |                 string line; | ||
|  |                 while ((line = reader.ReadLine()) != null) | ||
|  |                 { | ||
|  |                     lines.Add(line); | ||
|  |                 } | ||
|  |             } | ||
|  |             int indexToReplace = -1; | ||
|  |             int indexToReplace1 = -1; | ||
|  |             int removeIndex = -1; | ||
|  |             int addIndex = -1; | ||
|  |             for (int i = 0; i < lines.Count; i++) | ||
|  |             { | ||
|  |                 if (lines[i].Contains(compileSdkVersionPattern)) | ||
|  |                 { | ||
|  |                     indexToReplace = i; | ||
|  |                 } | ||
|  |                 else if (lines[i].Contains(targetSdkVersionPattern)) | ||
|  |                 { | ||
|  |                     indexToReplace1 = i; | ||
|  |                 } | ||
|  |                 else if (lines[i].Contains("buildToolsVersion")) | ||
|  |                 { | ||
|  |                     removeIndex = i; | ||
|  |                 } | ||
|  |                 else if (lines[i].Contains("defaultConfig")) | ||
|  |                 { | ||
|  |                     addIndex = i; | ||
|  |                 } | ||
|  |             } | ||
|  |             if (indexToReplace != -1) | ||
|  |             { | ||
|  |                 lines[indexToReplace] = "  " + compileSdkVersionPattern + " " + buildGradleVersion; | ||
|  |             } | ||
|  |             if (indexToReplace1 != -1) | ||
|  |             { | ||
|  |                 lines[indexToReplace1] = "  " + targetSdkVersionPattern + " " + buildGradleVersion; | ||
|  |             } | ||
|  |             if (removeIndex != -1) | ||
|  |             { | ||
|  |                 lines.RemoveAt(removeIndex); | ||
|  |             } | ||
|  |             if (addIndex != -1) | ||
|  |             { | ||
|  |                 lines.Insert(addIndex + 1, "  multiDexEnabled true"); | ||
|  |             } | ||
|  |             using (StreamWriter writer = new StreamWriter(buildGradlePath)) | ||
|  |             { | ||
|  |                 foreach (string line in lines) | ||
|  |                 { | ||
|  |                     writer.WriteLine(line); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static void handleNetworksConfit(string path) | ||
|  |         { | ||
|  |             if (ATConfig.isSelectedChina()) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  | #if UNITY_2019_3_OR_NEWER | ||
|  |             var buildGradlePath = Path.Combine(path, "../launcher/build.gradle"); | ||
|  | #else | ||
|  |             var buildGradlePath = Path.Combine(path, "launcher/build.gradle"); | ||
|  | #endif   | ||
|  |             if (!File.Exists(buildGradlePath)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |             List<string> lines = new List<string>(); | ||
|  |             using (StreamReader reader = new StreamReader(buildGradlePath)) | ||
|  |             { | ||
|  |                 string line; | ||
|  |                 while ((line = reader.ReadLine()) != null) | ||
|  |                 { | ||
|  |                     lines.Add(line); | ||
|  |                 } | ||
|  |             } | ||
|  |             var androidStartIndex = 0; | ||
|  |             var isConfigAll = false; | ||
|  |             var isExcludeModule = false; | ||
|  | 
 | ||
|  |             for (int i = 0; i < lines.Count; i++) | ||
|  |             { | ||
|  |                 if (lines[i].Contains("android {")) | ||
|  |                 { | ||
|  |                     androidStartIndex = i; | ||
|  |                 } | ||
|  |                 else if (lines[i].Contains("configurations.all")) | ||
|  |                 { | ||
|  |                     isConfigAll = true; | ||
|  |                 } | ||
|  |                 else if (lines[i].Contains("META-INF/*.kotlin_module")) | ||
|  |                 { | ||
|  |                     isExcludeModule = true; | ||
|  |                 } | ||
|  |             }    | ||
|  |             if (androidStartIndex > 0) | ||
|  |             { | ||
|  |                 if (!isExcludeModule) | ||
|  |                 { | ||
|  |                     lines.Insert(androidStartIndex + 1, "  packagingOptions {\n     merge 'META-INF/com.android.tools/proguard/coroutines.pro'\n     exclude 'META-INF/*.kotlin_module'\n   }"); | ||
|  |                 } | ||
|  |                 // if (!isConfigAll) | ||
|  |                 // { | ||
|  |                 //     lines.Insert(androidStartIndex -1, "configurations.all {\n     resolutionStrategy {\n      force 'androidx.core:core:1.6.0'\n      force 'androidx.recyclerview:recyclerview:1.1.0' \n    }\n}"); | ||
|  |                 // } | ||
|  |             } | ||
|  |             // configurations.all { | ||
|  |             //     resolutionStrategy { | ||
|  |             //         force 'androidx.core:core:1.6.0' | ||
|  |             //         force 'androidx.recyclerview:recyclerview:1.1.0' | ||
|  |             //     } | ||
|  |             // } | ||
|  |             // packagingOptions { | ||
|  |             //     merge "META-INF/com.android.tools/proguard/coroutines.pro" | ||
|  |             //     exclude "META-INF/*.kotlin_module" | ||
|  |             // } | ||
|  |             using (StreamWriter writer = new StreamWriter(buildGradlePath)) | ||
|  |             { | ||
|  |                 foreach (string line in lines) | ||
|  |                 { | ||
|  |                     writer.WriteLine(line); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static void handleNetworkResMerge(string path) { | ||
|  |             ATLog.log("handleNetworkResMerge() >>> path: " + path); | ||
|  | #if UNITY_2019_3_OR_NEWER | ||
|  |             var buildGradlePath = Path.Combine(path, "../launcher/build.gradle"); | ||
|  | #else | ||
|  |             var buildGradlePath = Path.Combine(path, "launcher/build.gradle"); | ||
|  | #endif  | ||
|  |             List<string> lines = new List<string>(); | ||
|  |             bool isAdded = false; | ||
|  | 
 | ||
|  |             using (StreamReader reader = new StreamReader(buildGradlePath)) | ||
|  |             { | ||
|  |                 string line; | ||
|  |                 while ((line = reader.ReadLine()) != null) | ||
|  |                 { | ||
|  |                     if (line.Contains("task handleNetworkResMerge")) { | ||
|  |                         isAdded = true; | ||
|  |                     } | ||
|  |                     lines.Add(line); | ||
|  |                 } | ||
|  |             } | ||
|  |             if (isAdded) { | ||
|  |                 return; | ||
|  |             } | ||
|  |             using (StreamReader reader = new StreamReader("Assets/ThinkupTpnPlugin/Script/Editor/network_res_handle.gradle")) | ||
|  |             { | ||
|  |                 string line; | ||
|  |                 while ((line = reader.ReadLine()) != null) | ||
|  |                 { | ||
|  |                     lines.Add(line); | ||
|  |                 } | ||
|  |             } | ||
|  |             using (StreamWriter writer = new StreamWriter(buildGradlePath)) | ||
|  |             { | ||
|  |                 foreach (string line in lines) | ||
|  |                 { | ||
|  |                     writer.WriteLine(line); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static void callGradleTask(string path) { | ||
|  |             // 设置你想要启动的Gradle任务 | ||
|  |             string gradleTask = "handleNetworkResMerge"; // 例如: assembleDebug or assembleRelease | ||
|  | 
 | ||
|  |             // 开始一个新的进程来执行Gradle任务 | ||
|  |             ProcessStartInfo psi = new ProcessStartInfo(); | ||
|  |             psi.FileName = Application.platform == RuntimePlatform.WindowsEditor ? "cmd" : "bash"; | ||
|  |             psi.Arguments = Application.platform == RuntimePlatform.WindowsEditor ? | ||
|  |                 $"/c gradlew {gradleTask}" : // Windows cmd命令 | ||
|  |                 $"-c './gradlew {gradleTask}'"; // UNIX bash命令 | ||
|  |             psi.UseShellExecute = false; | ||
|  |             psi.StandardOutputEncoding = Encoding.UTF8; | ||
|  |             psi.StandardErrorEncoding = Encoding.UTF8; | ||
|  |             psi.RedirectStandardOutput = true; | ||
|  |             psi.RedirectStandardError = true; | ||
|  |             psi.CreateNoWindow = true; | ||
|  |             psi.WorkingDirectory = "/Users/quinx/Desktop/workspace_topon/sdk_source/a_unity_demo/TestAnyThinkUnityPlugin/Library/Bee/Android/Prj/Mono2x/Gradle"; // 这里应该是你的Android项目路径 | ||
|  | 
 | ||
|  |             ATLog.log("callGradleTask() >>> path: " + path); | ||
|  | 
 | ||
|  |             using (var process = Process.Start(psi)) | ||
|  |             { | ||
|  |                 // 读取输出信息 | ||
|  |                 while (!process.StandardOutput.EndOfStream) | ||
|  |                 { | ||
|  |                     var line = process.StandardOutput.ReadLine(); | ||
|  |                     UnityEngine.Debug.Log(line); | ||
|  |                 } | ||
|  |                 // 读取错误信息 | ||
|  |                 while (!process.StandardError.EndOfStream) | ||
|  |                 { | ||
|  |                     var line = process.StandardError.ReadLine(); | ||
|  |                     UnityEngine.Debug.LogError(line); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | #endif |