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
|