Android 清单是一个 XML 文件,其中包含有关 Android 应用程序的重要元数据。此文件包含包名称、活动名称、主活动(应用程序的入口点)、Android 版本支持、硬件功能支持、权限和其他配置。
有关 Android 清单文件的更多信息,请参阅有关 Android 清单 (Android Manifests) 的 Android 开发者文档。
在 Unity 2019.3 和更高版本中,Unity 生成的 Android Gradle 项目有两个模板清单文件:
1.LauncherManifest.xml - 位于导出项目中的 root/launcher/src/main/AndroidManifest.xml 处。此文件包含应用程序的:
* 图标
* 名称
* 启动活动及其意图
* 安装位置
* 支持的屏幕大小
* isGame
设置
2.LibraryManifest.xml - 位于导出项目中的 root/unityLibrary/src/main/AndroidManifest.xml 处。可使用您在 Plugins/Android 文件夹中添加的自定义 AndroidManifest.xml 覆盖此清单。此文件将声明:
* Unity 活动
* 权限
* Unity 活动使用的主题
* VR 模式
* VR 性能
* 使活动不可调整大小(适用于 VR)
* 设置最大宽高比
* 对配置更改做出反应
* 方向
* 启动模式
* Android UI 硬件加速
* 使用的功能(如游戏手柄或图形 API)
* 凹口支持
Unity 在构建应用程序时会按照以下步骤自动生成 Android 清单文件:
1.Unity 使用 LibraryManifest.xml 或 AndroidManifest.xml 作为主清单。
2.然后,它会查找插件(.aar 和 Android 库)的所有 Android 清单。
3.它使用 Google 的 manifmerger
类将插件清单合并到主清单中。
4.Unity 会修改启动器和库模块中的清单文件。它会自动添加权限、配置选项、使用的功能以及其他信息。
尽管 Unity 会为应用程序生成正确的清单,但您可能希望直接控制其内容。
要使用您在 Unity 之外创建的 Android 清单,请将 Android 清单文件导入以下位置:_Assets/Plugins/Android/AndroidManifest.xml。这将覆盖默认的 LibraryManifest.xml_。
在这种情况下,Unity 会将 Android 库的清单合并到主清单中,并确保生成的清单配置正确。要完全控制清单(包括权限),必须导出项目并在 Android Studio 中修改最终的清单。
注意:Unity 仅支持 [launchMode - singleTask](https://developer.android.com/guide/topics/manifest/activity-element.html#lmode)
启动模式。
Unity 会根据 Android 播放器设置 (Android Player Settings)以及应用程序从脚本调用的 Unity API 自动为清单添加必要的权限。例如:
Network
类添加 INTERNET 权限Handheld.Vibrate
)将添加 VIBRATEInternetReachability
] 属性添加 ACCESS_NETWORK_STATELocationService
)添加 ACCESS_FINE_LOCATIONWebCamTexture
API 添加 CAMERA 权限Microphone
类添加 RECORD_AUDIONetworkDiscovery
和 NetworkTransport.SetMulticastLock
添加 CHANGE_WIFI_MULTICAST_STATE有关权限的更多信息,请参阅有关 Android 清单权限 (Android Manifest Permissions) 的 Android 开发者文档。
如果插件通过在其清单中声明权限来请求权限,则在合并阶段 Unity 会自动将权限添加到生成的 Android 清单中。插件调用的所有 Unity API 也会对权限列表有影响。
如果应用程序在 Android 6.0 (Marshmallow) 或更高版本的设备上运行,并且还以 Android API 级别 23 或更高级别为目标,则该应用程序会使用 Android 运行时权限系统 (Runtime Permission System)。
Android 运行时权限系统要求用户在应用程序运行时授予权限,而不是在首次安装应用程序时授予权限。当应用程序运行时,应用程序用户通常可以在应用程序需要权限时授予或拒绝每个权限(例如,在拍照前请求相机权限)。这样可让应用程序在没有权限的情况下以有限的功能运行。使用 Unity 中的 Android.Permission
类可以检查用户已授予还是拒绝了特定权限。如果应用程序所需的权限被拒绝,您可以告知用户这个应用程序需要该权限的原因并要求他们批准该权限。有关更多信息,请参阅请求权限文档。
通常情况下,应用程序在启动时会提示用户允许使用 Android 所谓的“危险”权限。如需了解更多信息,请参阅有关危险权限的 Android 开发者文档。如果不希望应用程序在启动时请求权限,可将以下代码添加到清单中的 Application 或 Activity 部分:
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
注意:此代码会禁止启动时显示权限对话框,但您必须小心处理运行时权限以避免崩溃。这是一种处理运行时权限的高级方法。
有关运行时权限系统和权限处理的更多信息,请参阅 Android 开发者文档的请求权限 (Requesting Permissions) 部分。
要检查 Unity 为应用程序生成的最终 Android 清单,请在构建项目之后但在关闭 Unity Editor 之前打开 Temp/StagingArea/AndroidManifest.xml 文件。
清单以二进制格式存储在输出包 (.apk) 中。要检查 .apk 中的清单内容,可使用 Android Studio APK Analyzer 或其他第三方工具(例如 Apktool)。