namespace Guru.Editor { using NUnit.Framework; using UnityEditor; using UnityEngine; using System; using System.IO; using System.Xml; public static class AndroidManifestMod { private const string TargetPath = "Plugins/Android/AndroidManifest.xml"; private const string ValOptimizeInitialization = "com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"; private const string ValOptimizeAdLoading = "com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"; private const string PermissionReadPostNotifications = "android.permission.POST_NOTIFICATIONS"; private const string PermissionReadPhoneState = "android.permission.READ_PHONE_STATE"; private const string PermissionAccessCoarseLocation = "android.permission.ACCESS_COARSE_LOCATION"; private const string PermissionAccessFineLocation = "android.permission.ACCESS_FINE_LOCATION"; private const string NetworkSecurityConfig = "networkSecurityConfig"; private const string NetworkSecurityConfigValue = "@xml/network_security_config"; private static string TargetFullPath = Path.Combine(Application.dataPath, TargetPath); public static bool IsManifestExist() => File.Exists(TargetFullPath); public static void Apply() { if (!IsManifestExist()) { CopyManifest(); } FixAndroidManifest(); } /// /// Fix Android Manifest /// private static void FixAndroidManifest() { var doc = AndroidManifestDoc.Load(TargetFullPath); // --- network_security_config --- doc.SetApplicationAttribute(NetworkSecurityConfig, NetworkSecurityConfigValue); doc.AddApplicationReplaceItem($"android:{NetworkSecurityConfig}"); // ---- Metadata --- doc.SetMetadata(ValOptimizeInitialization, "true"); doc.SetMetadata(ValOptimizeAdLoading, "true"); // ---- Permission --- doc.AddPermission(PermissionReadPostNotifications); doc.RemovePermission(PermissionReadPhoneState); doc.RemovePermission(PermissionAccessCoarseLocation); doc.RemovePermission(PermissionAccessFineLocation); // --- Bundle Id --- doc.SetPackageName(PlayerSettings.applicationIdentifier); doc.Save(); } /// /// 拷贝 AndroidManifest /// private static void CopyManifest() { if (File.Exists(TargetFullPath)) return; var path = GuruEditorHelper.GetAssetPath(nameof(AndroidManifestMod), "Script", true); if (!string.IsNullOrEmpty(path)) { var from = Path.GetFullPath($"{path}/../../Files/AndroidManifest.txt"); if (File.Exists(from)) { File.Copy(from, TargetFullPath); } } } #region Testing [Test] public static void Test_Injection() { Apply(); } #endregion } }