Unity导出项目后自动添加多余权限至Android Manifest的解决求助
解决Unity导出Android时自动添加多余权限的问题
1. 把tools:node="remove"用对
很多人用这个属性无效,是因为没加正确的命名空间。在自定义Manifest根节点加上xmlns:tools="http://schemas.android.com/tools",再给要移除的权限加上tools:node="remove"。把这个Manifest放在Assets/Plugins/Android目录下,同时在Player Settings里勾选Custom Main Manifest指向它。
示例代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.your.package.name"> <!-- 替换成你要删除的权限名 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/> </manifest>
2. 检查Unity Player Settings的触发项
Unity会根据你启用的服务或代码调用的API自动添加权限:
- 打开
Player Settings > Android > Other Settings,关掉不需要的服务(比如Location Service)。 - 排查代码里有没有调用位置、蓝牙这类需要权限的API,确认不需要就删掉相关代码。
3. 用Gradle模板排除依赖带来的权限
如果多余权限是第三方插件(广告、分析SDK)引入的:
- 在Player Settings里勾选Custom Gradle Template,生成
Assets/Plugins/Android/mainTemplate.gradle。 - 在
android块里添加排除依赖的代码,示例:
configurations.all { // 根据实际情况修改要排除的依赖 exclude group: 'com.google.android.gms', module: 'play-services-location' }
也可以用./gradlew dependencies命令查看依赖树,定位具体是哪个插件带进来的权限。
4. 写构建后处理脚本自动清权限
如果上面的方法都不管用,直接写个Editor脚本,构建完成后自动删除多余权限:
把下面的脚本放在Assets/Editor目录下,每次构建Android项目后会自动清理指定权限:
using UnityEditor; using UnityEditor.Build; using UnityEditor.Build.Reporting; using System.IO; using System.Xml; public class RemoveExtraPermissions : IPostprocessBuildWithReport { public int callbackOrder => 100; public void OnPostprocessBuild(BuildReport report) { if (report.summary.platform != BuildTarget.Android) return; string manifestPath = Path.Combine(report.summary.outputPath, "src/main/AndroidManifest.xml"); XmlDocument doc = new XmlDocument(); doc.Load(manifestPath); XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace("android", "http://schemas.android.com/apk/res/android"); // 替换成你要移除的权限列表 RemovePermission(doc, nsManager, "android.permission.ACCESS_FINE_LOCATION"); RemovePermission(doc, nsManager, "android.permission.ACCESS_COARSE_LOCATION"); doc.Save(manifestPath); } private void RemovePermission(XmlDocument doc, XmlNamespaceManager nsManager, string permissionName) { XmlNodeList nodes = doc.SelectNodes("//uses-permission[@android:name='" + permissionName + "']", nsManager); foreach (XmlNode node in nodes) { node.ParentNode.RemoveChild(node); } } }
内容的提问来源于stack exchange,提问作者Veronica Ajisola
相关产品推荐
相关产品推荐

