123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- #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/AnyThinkPlugin/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
|