易如反掌
如果您的Unity项目是使用gradle
构建的,我认为这种更简单的方法适用。如果不是,请升级一下,这是另一个原因。
此外,向一篇名为“嘿,这些权限从哪里来?”的文章致以大声喊叫。
- 构建您的项目
- 打开文件/path/to/my/project/Temp/gradleOut/build/outputs/logs/manifest-merger-release-report.txt
赚钱!
- 在文件中搜索您的权限名称,它将显示它来自哪里。
这是文件的一部分,我正在查找WRITE_EXTERNAL_STORAGE权限。
uses-permission
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
Hard Way
有三种方式可以向您的项目添加权限。
- 它们在Android清单文件中进行了指定。
- 它们在库中进行了指定(.aar文件)。
- 当您使用某个功能时,Unity会添加该权限。(已添加)
我的示例在Mac上使用命令行工具。我不知道Windows的等效物,但是可以在那里找到并运行Unix工具(使用Windows 10的Linux子系统、Cygwin、自定义二进制文件等)。
1. 查找在(未压缩的)Android清单中使用的所有权限。
cd /path/to/my/project/Assets
grep -r "uses-permission" --include "AndroidManifest.xml" .
这将在当前文件夹(.
)或其任何子文件夹中查找名为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" />
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
这段代码的作用是,在当前文件夹(.
)及其子文件夹中查找任何扩展名为(某些东西)a r 的文件,例如.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
...
文件名都以句点开头。例如,我可以看到onesignal-unity.aar设置了几个权限,几个.jar文件在内部没有任何权限,一些play services库指定了权限。
如果我需要更改某个库,则可以将.aar重命名为.zip,提取它,编辑它,压缩它,然后将其重新命名。 (更改库内部的权限不一定明智,但是可能会发生。)
3. Unity添加权限
关于这个我没有什么要补充的; 如上所述,如果您使用麦克风API,Unity将为您添加权限,以使您的应用程序正常工作。
但是,之后我意识到您可以执行以下操作:
- 打开Android的生成设置
- 勾选“导出项目”框
- 导出项目并注意位置
- 转到/my/project/export/src/main/AndroidManifest.xml。 这是Unity为android清单发出的内容(在谷歌的工具进行合并之前)。
- 将其与Assets/plugins/Android/AndroidManifest.xml进行比较(使用您喜欢的差异工具),其中的差异来自Unity。