62 lines
3.3 KiB
C#
62 lines
3.3 KiB
C#
using System;
|
|||
|
|
using System.IO;
|
||
|
|
using System.Text.RegularExpressions;
|
||
|
|
using UnityEditor;
|
||
|
|
using UnityEditor.Android;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
// Починка сборки Android на этом компьютере (05.11):
|
||
|
|
// 1. Имя пользователя Windows с русскими буквами (C:\Users\Вальдемар). Gradle хранит свои файлы в
|
||
|
|
// C:\Users\<имя>\.gradle, и одна из его программ (prefab) не понимает такой путь -- сборка падает.
|
||
|
|
// Перед сборкой переносим папку Gradle в C:\gradle (переменная GRADLE_USER_HOME для процесса Unity,
|
||
|
|
// сборщик её наследует). Ничего в Windows менять не нужно.
|
||
|
|
// 2. Два Kotlin в зависимостях (1.8 у Unity и 1.6 у одного из пакетов) -- "Duplicate class kotlin...".
|
||
|
|
// В сгенерированный проект Gradle дописываем правило: все kotlin-stdlib -- одной версии 1.8.22.
|
||
|
|
[InitializeOnLoad]
|
||
|
|
public class AndroidBuildFixes : IPostGenerateGradleAndroidProject
|
||
|
|
{
|
||
|
|
const string GradleHome = @"C:\gradle";
|
||
|
|
const string Marker = "// Bogatyri: kotlin-stdlib одной версии";
|
||
|
|
|
||
|
|
static AndroidBuildFixes() { EnsureAsciiGradleHome(); }
|
||
|
|
|
||
|
|
public static void EnsureAsciiGradleHome()
|
||
|
|
{
|
||
|
|
string current = Environment.GetEnvironmentVariable("GRADLE_USER_HOME");
|
||
|
|
if (!string.IsNullOrEmpty(current) && IsAscii(current)) return;
|
||
|
|
if (IsAscii(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))) return; // путь и так латиницей
|
||
|
|
try
|
||
|
|
{
|
||
|
|
Directory.CreateDirectory(GradleHome);
|
||
|
|
Environment.SetEnvironmentVariable("GRADLE_USER_HOME", GradleHome, EnvironmentVariableTarget.Process);
|
||
|
|
Debug.Log("[СБОРКА] Папка Gradle: " + GradleHome + " (в пути пользователя есть русские буквы)");
|
||
|
|
}
|
||
|
|
catch (Exception e) { Debug.LogWarning("[СБОРКА] Не удалось задать GRADLE_USER_HOME: " + e.Message); }
|
||
|
|
}
|
||
|
|
|
||
|
|
static bool IsAscii(string s) => !Regex.IsMatch(s ?? "", @"[^\u0000-\u007F]");
|
||
|
|
|
||
|
|
public int callbackOrder => 999;
|
||
|
|
|
||
|
|
// path -- папка unityLibrary сгенерированного проекта
|
||
|
|
public void OnPostGenerateGradleAndroidProject(string path)
|
||
|
|
{
|
||
|
|
string root = Directory.GetParent(path).FullName;
|
||
|
|
foreach (var file in new[] { Path.Combine(root, "launcher", "build.gradle"), Path.Combine(path, "build.gradle") })
|
||
|
|
{
|
||
|
|
if (!File.Exists(file)) continue;
|
||
|
|
string text = File.ReadAllText(file);
|
||
|
|
if (text.Contains(Marker)) continue;
|
||
|
|
text += "\n" + Marker + "\n" +
|
||
|
|
"configurations.all {\n" +
|
||
|
|
" resolutionStrategy.eachDependency { details ->\n" +
|
||
|
|
" if (details.requested.group == 'org.jetbrains.kotlin' && details.requested.name.startsWith('kotlin-stdlib')) {\n" +
|
||
|
|
" details.useVersion('1.8.22')\n" +
|
||
|
|
" }\n" +
|
||
|
|
" }\n" +
|
||
|
|
"}\n";
|
||
|
|
File.WriteAllText(file, text);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|