如何在Unity Android中查找权限来源

Uma*_*r M 5 android unity-game-engine android-manifest

注意:此问题特定于Unity3D

我在Unity项目的Plugins/Android/文件夹下有一个非常干净的android清单文件,根本没有<uses-permissions/>标记.我相信最终APK中的某些权限来自Android播放器设置 - 例如READ_EXTERNAL_STORAGE.在我的Gear VR项目中,我看到最终清单中添加了以下行,可以在以下位置访问Temp/StagingArea/:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.microphone" android:required="false" />
Run Code Online (Sandbox Code Playgroud)

现在这肯定来自我项目中的一个插件(我有很多插件).

我的应用程序被Oculus拒绝了

您的应用要求不恰当地使用用户权限的过多用户权限.

我在这里找到了一个解决方法,但我不想做这样的事情,因为这可能会再次导致应用拒绝.

所以

有没有办法让我知道这个许可来自哪里?

如何找出我的脚本中是否有一些代码导致统一包含此权限?

谢谢

Cli*_*ore 14

简单的方法

我认为如果您的 Unity 项目是使用gradle. 如果不是,这是升级的另一个原因。

此外,对一篇名为“嘿,这些权限从何而来?)

  1. 构建你的项目
  2. 打开文件 /path/to/my/project/Temp/gradleOut/build/outputs/logs/manifest-merger-release-report.txt
  3. 利润!
  4. 在文件中搜索您的权限名称,它会告诉您它的来源。

这是文件的一部分,我在其中查找 WRITE_EXTERNAL_STORAGE 权限。

uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
ADDED from /Users/clinton/Projects/<<ProjectName>>/Temp/gradleOut/src/main/AndroidManifest.xml:7:3-79
MERGED from [gradleOut:IronSource:unspecified] /Users/clinton/Projects/<<ProjectName>>/Temp/gradleOut/IronSource/build/intermediates/bundles/default/AndroidManifest.xml:13:5-81
    android:name
        ADDED from /Users/clinton/Projects/<<ProjectName>>/Temp/gradleOut/src/main/AndroidManifest.xml:7:20-76
Run Code Online (Sandbox Code Playgroud)

艰辛的道路

可以通过三种方式将权限添加到您的项目中。

  1. 它们在 Android 清单文件中指定。
  2. 它们在库(.aar 文件)中指定。
  3. 当您使用某个功能时,Unity 会添加该权限。(添加)

我的示例在 Mac 上使用命令行工具。我不知道 Windows 等价物,但可以在那里找到并运行 unix 工具(使用适用于 Windows 10、cygwin、自定义二进制文件等的 linux 子系统)

1. 找到(未压缩的)Android Manifests 中使用的所有权限。

cd /path/to/my/project/Assets
grep -r "uses-permission" --include "AndroidManifest.xml" .
Run Code Online (Sandbox Code Playgroud)

这将在当前文件夹 ( .) 或其任何子文件夹中找到所有名为 AndroidManifest 的文件(-r告诉它递归搜索)并吐出任何带有“uses-permission”字样的行。

在我当前的项目中,我得到如下输出:

./Plugins/Android/AndroidManifest.xml:  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
./Plugins/Android/AndroidManifest.xml:  <uses-permission android:name="android.permission.INTERNET" />
./Plugins/Android/AndroidManifest.xml:  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
./Plugins/Android/AndroidManifest.xml:  <uses-permission     
./Plugins/Android/IronSource/AndroidManifest.xml:    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
./Plugins/Android/IronSource/AndroidManifest.xml:    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

2.在Android库中找到需要的权限

您的项目可能包含 android 库(.aar 文件)和 java 档案(.jar 文件)。一些 android 库包含一个 android 清单并指定使用库所需的权限。(我认为 .jar 文件实际上不会这样做,但 .aar 文件绝对可以)。.aar 和 .jar 文件都是 .zip 文件,具有不同的扩展名和特定位置的特定元数据。

通过运行找到它们:

find . -iname "*.?ar" -print -exec zipgrep "uses-permission" "{}" "AndroidManifest.xml" ";" 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

这是它的作用。它查找任何文件(在当前文件夹 ( .) 及其子文件夹中)具有(某事) ar 的扩展名,因此是 .jar 或 .aar ( -name "*.?ar")。它输出存档的文件名 ( -print)。然后它运行zipgrep( -exec)。Zipgrep 被告知搜索存档 ( {}) 中名为“AndroidManifest.xml”的任何文件,并输出任何带有“uses-permission”字样的行。然后,我们将错误通过管道传送到位桶 ( 2> /dev/null),这样我们就不会看到很多关于档案中没有 android 清单的错误。

示例输出如下所示:

./OneSignal/Platforms/Android/onesignal-unity.aar
AndroidManifest.xml:    <uses-permission android:name="android.permission.INTERNET" />
AndroidManifest.xml:    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
AndroidManifest.xml:    <uses-permission android:name="android.permission.WAKE_LOCK" />
AndroidManifest.xml:    <uses-permission android:name="android.permission.VIBRATE" />
...
./Plugins/Android/android.arch.core.common-1.1.0.jar
./Plugins/Android/android.arch.core.runtime-1.1.0.aar
./Plugins/Android/android.arch.lifecycle.common-1.1.0.jar
...
./Plugins/Android/com.google.android.gms.play-services-gcm-11.8.0.aar
AndroidManifest.xml:    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
AndroidManifest.xml:    <uses-permission android:name="android.permission.INTERNET" />
./Plugins/Android/com.google.android.gms.play-services-gcm-license-11.8.0.aar
./Plugins/Android/com.google.android.gms.play-services-iid-11.8.0.aar
AndroidManifest.xml:    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
AndroidManifest.xml:    <uses-permission android:name="android.permission.INTERNET" />
./Plugins/Android/com.google.android.gms.play-services-iid-license-11.8.0.aar
...
Run Code Online (Sandbox Code Playgroud)

文件名都以句点开头。因此,我可以看到,例如,onesignal-unity.aar 设置了几个权限,搜索了几个 .jar 文件,其中没有权限,并且一些播放服务库指定了权限。

如果我需要更改一个库,我可以将 .aar 重命名为 .zip,提取它,编辑它,压缩它,然后将它重命名回来。(更改库内的权限不一定是明智的,但有可能。)

3.Unity添加权限

我对此没有任何补充;如上所述,如果您使用麦克风 API,Unity 会为您添加权限,以便您的应用程序正常运行。

但是,我后来意识到您可以执行以下操作:

  • 调出 Android 的构建设置
  • 勾选“导出项目”框
  • 导出项目,注意位置
  • 转到 /my/project/export/src/main/AndroidManifest.xml。这是 Unity 为 android manifest 发出的内容(在谷歌的工具完成所有合并之前)。
  • 将它(使用您最喜欢的 diff 工具)与 Assets/plugins/Android/AndroidManifest.xml 进行比较;差异来自Unity。