using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; using UnityEditor.Android; namespace Editor.AndroidBuildSetting { public class AD_BuildAndroidProcess : IPostGenerateGradleAndroidProject { private static readonly XNamespace AndroidNamespace = "http://schemas.android.com/apk/res/android"; private static readonly XNamespace ToolsNamespace = "http://schemas.android.com/tools"; public void OnPostGenerateGradleAndroidProject (string path) { ProcessAndroidManifest (path); } public static void ProcessAndroidManifest (string path) { #if UNITY_2019_3_OR_NEWER var manifestPath = Path.Combine (path, "src/main/AndroidManifest.xml"); var launcherManifestPath = Path.Combine (path, "../launcher/src/main/AndroidManifest.xml"); #else var manifestPath = Path.Combine(path, "unityLibrary/src/main/AndroidManifest.xml"); #endif // var manifestPath = Path.Combine(path, "src/main/AndroidManifest.xml"); XDocument manifest; XDocument launcherManifest; try { manifest = XDocument.Load (manifestPath); launcherManifest = XDocument.Load (launcherManifestPath); } #pragma warning disable 0168 catch (IOException exception) #pragma warning restore 0168 { return; } // Get the `manifest` element. var elementManifest = manifest.Element ("manifest"); if (elementManifest == null) { return; } var elementApplication = elementManifest.Element ("application"); if (elementApplication == null) { return; } // elementApplication. var elementlauncherManifest = launcherManifest.Element ("manifest"); var elementlauncherApplication = elementlauncherManifest.Element ("application"); var xManifestElements = elementManifest.Descendants (); var xApplicationElements = elementApplication.Descendants (); var useQueries = xApplicationElements.Where (element => element.Name.LocalName.Equals ("activity")); var elementByName = GetElementByName (useQueries , "com.unity3d.player.UnityPlayerActivity"); //开启硬件加速 android:hardwareAccelerated="true" XName name = AndroidNamespace + "hardwareAccelerated"; elementByName.SetAttributeValue (name , "true"); // Save the updated manifest file. manifest.Save (manifestPath); launcherManifest.Save (launcherManifestPath); } public static XElement CreateQueries () { var metaData = new XElement ("queries"); var packageData = new XElement ("package"); packageData.Add (new XAttribute (AndroidNamespace + "name", "com.tencent.mm")); metaData.Add (packageData); return metaData; } private static XElement GetElementByName (IEnumerable elements, string name) { foreach (var element in elements) { var attributes = element.Attributes (); if (attributes.Any (attribute => attribute.Name.Namespace.Equals (AndroidNamespace) && attribute.Name.LocalName.Equals ("name") && attribute.Value.Equals (name))) { return element; } } return null; } public int callbackOrder { get; } } }