Files
RedHotRoast-ios/Assets/SGModule/Common/SGModule/Editor/HardwareAccelerationSetter.cs
T

95 lines
3.2 KiB
C#

#if UNITY_ANDROID && UNITY_EDITOR
using System.IO;
using System.Xml;
using SGModule.Common;
using SGModule.Common.Helper;
using UnityEditor.Android;
using UnityEngine;
namespace SwhiteGames.Editor {
public class HardwareAccelerationManager : IPostGenerateGradleAndroidProject {
public int callbackOrder => 99;
private static bool EnableHardwareAcceleration => ConfigManager.GameConfig.hardwareAcceleration;
public void OnPostGenerateGradleAndroidProject(string basePath) {
var manifestPath = GetManifestPath(basePath);
if (!File.Exists(manifestPath)) {
Log.Warning("HardwareAcceleration", $"Manifest not found at {manifestPath}");
return;
}
var manifest = new AndroidManifestHelper(manifestPath);
var changed = manifest.SetHardwareAccelerated(EnableHardwareAcceleration);
if (changed) {
manifest.Save();
Log.Info("HardwareAcceleration", $"Updated manifest with hardwareAccelerated={EnableHardwareAcceleration}");
}
}
private string GetManifestPath(string basePath) {
return Path.Combine(basePath, "src/main/AndroidManifest.xml");
}
}
internal class AndroidManifestHelper {
private readonly XmlDocument _doc;
private readonly XmlNamespaceManager _nsMgr;
private const string AndroidNs = "http://schemas.android.com/apk/res/android";
private readonly string _manifestPath;
public AndroidManifestHelper(string path) {
_manifestPath = path;
_doc = new XmlDocument();
_doc.Load(path);
_nsMgr = new XmlNamespaceManager(_doc.NameTable);
_nsMgr.AddNamespace("android", AndroidNs);
}
public bool SetHardwareAccelerated(bool enabled) {
var activity = GetMainActivity();
if (activity == null) {
Debug.LogWarning("[HardwareAcceleration] Could not find main activity");
return false;
}
return SetHardwareAccelerated(activity, enabled);
}
private bool SetHardwareAccelerated(XmlNode activity, bool enabled) {
var value = enabled ? "true" : "false";
var attr = (activity as XmlElement)?.GetAttributeNode("hardwareAccelerated", AndroidNs);
if (attr == null) {
attr = _doc.CreateAttribute("android", "hardwareAccelerated", AndroidNs);
activity.Attributes?.Append(attr);
attr.Value = value;
return true;
}
if (attr.Value != value) {
attr.Value = value;
return true;
}
return false;
}
private XmlNode GetMainActivity() {
return _doc.SelectSingleNode(
"/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " +
"intent-filter/category/@android:name='android.intent.category.LAUNCHER']",
_nsMgr);
}
public void Save() {
_doc.Save(_manifestPath);
}
}
}
#endif