220 lines
7.5 KiB
C#
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
|
|
|
|
|
|
|
|
}
|
|
} |