com.guru.unity.sdk/Editor/GuruManager/Helper/AndroidProjectMod.cs

220 lines
7.5 KiB
C#

namespace Guru.Editor
{
using UnityEditor;
using UnityEngine;
using System;
using System.IO;
using System.Linq;
public class AndroidProjectMod
{
private const int TargetSDKVersion = 34;
private const string K_ANDROID_PLUGINS_NAME = "Plugins/Android";
private const string LauncherName = "launcherTemplate";
private static readonly string LauncherFullPath = Path.Combine(Application.dataPath, $"{K_ANDROID_PLUGINS_NAME}/{LauncherName}.gradle");
private const string MainName = "mainTemplate";
private static readonly string MainFullPath = Path.Combine(Application.dataPath, $"{K_ANDROID_PLUGINS_NAME}/{MainName}.gradle");
private const string BaseProjectName = "baseProjectTemplate";
private static readonly string BaseProjectFullPath = Path.Combine(Application.dataPath, $"{K_ANDROID_PLUGINS_NAME}/{BaseProjectName}.gradle");
private const string PropertiesName = "gradleTemplate";
private const string K_ENABLE_R8 = "android.enableR8";
private static readonly string PropertiesFullPath = Path.Combine(Application.dataPath, $"{K_ANDROID_PLUGINS_NAME}/{PropertiesName}.properties");
private const string SettingsName = "settingsTemplate";
private static readonly string SettingsFullPath = Path.Combine(Application.dataPath, $"Plugins/Android/{SettingsName}.gradle");
private const string K_LINE_UNITY_PROJECT = "def unityProjectPath";
private const string ProguardUserName = "proguard-user";
private static readonly string ProguardUserFullPath = Path.Combine(Application.dataPath, $"{K_ANDROID_PLUGINS_NAME}/{ProguardUserName}.txt");
public static void Apply()
{
ApplyLauncher();
ApplyBaseProjectTemplates();
ApplyMainTemplates();
ApplyGradleTemplate();
ApplySettings();
ApplyProguardUser();
CheckTargetSDKVersion(); // 强制修复构建版本号
}
private static void ApplyLauncher()
{
if (!File.Exists(LauncherFullPath))
{
CopyFile($"{LauncherName}.txt", LauncherFullPath);
Debug.Log($"[MOD] --- Copy file to: {LauncherFullPath}");
return;
}
var ptn1 = "**PACKAGING_OPTIONS**";
var ptn2 = "abortOnError false";
var lines = File.ReadAllLines(LauncherFullPath);
for (int i = 0; i < lines.Length; i++)
{
var line = lines[i];
if (line.Contains(ptn1))
{
lines[i] = line.Replace(ptn1, "\n\n\tpackagingOptions {\n\t\texclude(\"META-INF/*.kotlin_module\")\n\t}\n\n");
}
if (line.Contains(ptn2))
{
if (lines[i + 1].Contains("}"))
{
lines[i + 1] = lines[i + 1].Replace("}", "\tcheckReleaseBuilds false\n\t}");
}
}
}
Debug.Log($"[MOD] --- Fix file at: {LauncherFullPath}");
File.WriteAllLines(LauncherFullPath, lines);
}
private static void ApplyMainTemplates()
{
if (!File.Exists(MainFullPath))
{
Debug.Log($"[MOD] --- Copy file to: {MainFullPath}");
CopyFile($"{MainName}.txt", MainFullPath);
}
}
private static void ApplyBaseProjectTemplates()
{
if (!File.Exists(BaseProjectFullPath))
{
Debug.Log($"[MOD] --- Copy file to: {BaseProjectFullPath}");
CopyFile($"{BaseProjectName}.txt", BaseProjectFullPath);
}
}
private static void ApplyGradleTemplate()
{
if (!File.Exists(PropertiesFullPath))
{
Debug.Log($"[MOD] --- Copy file to: {PropertiesFullPath}");
CopyFile($"{PropertiesName}.txt", PropertiesFullPath);
}
if (TargetSDKVersion > 33)
{
FixGradleTemplate(PropertiesFullPath);
}
}
/// <summary>
/// 该版本中不再使用 R8
/// </summary>
/// <param name="filePath"></param>
private static void FixGradleTemplate(string filePath)
{
if (File.Exists(filePath))
{
bool isDirty = false;
var lines = File.ReadAllLines(filePath);
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(K_ENABLE_R8))
{
lines[i] = $"# {lines[i]}"; // 禁用R8
isDirty = true;
break;
}
}
if (isDirty) File.WriteAllLines(filePath, lines);
}
}
/// <summary>
/// 写入 settings.gradle 配置文件
/// </summary>
private static void ApplySettings()
{
if (!File.Exists(SettingsFullPath))
{
CopyFile($"{SettingsName}.txt", SettingsFullPath);
}
FixProjectPathInSettings(SettingsFullPath);
}
private static void FixProjectPathInSettings(string settingsPath)
{
bool isDirty = false;
if (File.Exists(settingsPath))
{
string projectPath = Path.GetFullPath($"{Application.dataPath}/../").Replace("\\", "/");
var lines = File.ReadAllLines(settingsPath);
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(K_LINE_UNITY_PROJECT))
{
lines[i] = $" def unityProjectPath = $/file:////{projectPath}/$.replace(\"\\\\\", \"/\")";
isDirty = true;
break;
}
}
if(isDirty)
File.WriteAllLines(settingsPath, lines);
}
}
/// <summary>
/// 写入所有的配置文件
/// </summary>
private static void ApplyProguardUser()
{
if (!File.Exists(ProguardUserFullPath))
{
CopyFile($"{ProguardUserName}.txt", ProguardUserFullPath);
}
}
private static void CheckTargetSDKVersion()
{
var ver = (int) PlayerSettings.Android.targetSdkVersion;
if (ver < TargetSDKVersion)
{
Debug.Log($"[MOD] --- Fix target sdk version -> {TargetSDKVersion}");
PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions)TargetSDKVersion;
}
}
#region File IO
private static string GetMoveFilePath(string fileName)
{
var path = GuruEditorHelper.GetAssetPath(nameof(AndroidProjectMod), "Script", true);
var files = Path.GetFullPath($"{path}/../../Files");
return $"{files}/{fileName}";
}
private static void CopyFile(string fileName, string toPath)
{
var from = GetMoveFilePath(fileName);
if (!string.IsNullOrEmpty(from))
{
if (File.Exists(from))
{
File.Copy(from, toPath);
}
}
}
#endregion
}
}