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
}
}