Nano Hash - криптовалюты, майнинг, программирование

Как найти источник разрешения в Unity Android

Примечание. Этот вопрос относится к Unity3D.

У меня есть очень чистый файл манифеста Android в проекте Unity в папке Plugins/Android/ без тега <uses-permissions/> вообще. Я считаю, что некоторые разрешения в окончательном APK исходят из настроек Android Player, например 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" />

Теперь это определенно исходит от одного из плагинов, которые есть в моем проекте (у меня много плагинов).

Oculus отклоняет мое приложение, говоря:

Ваше приложение запрашивает чрезмерные разрешения пользователя для ненадлежащего использования разрешений пользователя.

Я нашел обходной путь здесь, но я не хочу этого делать, так как это может снова привести к отклонению приложения.

So

Есть ли способ узнать, откуда исходит это разрешение?

Как узнать, есть ли в моих сценариях какой-то код, который заставляет единство включать это разрешение?

Спасибо


  • извините, я не могу получить доступ к этой ссылке, можете ли вы опубликовать ссылку на вопрос, а не на ответ? 02.12.2016
  • @NikaKasradze попробуй сейчас 02.12.2016

Ответы:


1

Unity добавит вам разрешения на лету во время сборки, как указано в eriQue of Unity Technologies это предотвращает сбои в работе кода и непредвиденное поведение.

Вы можете использовать такой инструмент, как этот Apk-декомпилятор, чтобы взглянуть на ваш новый манифест и какие разрешения он использует. Исходя из этого, вы можете искать определенные функции, которые могут активировать эти разрешения.

Некоторые функции, такие как isGeniune, потребуют нескольких разрешений, поскольку они будут использовать проверку на внешнем сервере.

В качестве альтернативы вы также можете заменить свой манифест в декомпилированном APK, вручную изменить манифест на тот, который предполагался, и отказаться от него. Это еще одна тяжелая работа, но если правильно вести журнал ошибок, это может ускорить процесс отслеживания проблемных функций.

Обновить

Как я уже упоминал в комментариях ниже. Не существует реального способа точно определить функции. Но быстрый чек-лист не повредит, но потребует некоторой работы

  • Используете ли вы какие-либо внешние службы?

Для многих внешних сервисов, таких как google, twitter, facebook API и инструменты, требуются дополнительные разрешения. Обычно они связаны с хранилищем/сетью, но в зависимости от целей инструмента/API их может быть намного больше.

Попробуйте создать APK с инструментами/apis и без них, чтобы увидеть, есть ли какие-либо различия.

  • Используете ли вы объявления Unity?

Объявления Unity сами по себе используют 3 разрешения, а более старые версии могут использовать даже 5. Если вы используете их рекламу, вам придется воспринимать их как должное.

  • Вы отключили статистику Unity?

Вы когда-нибудь смотрели на эти причудливые статистику, которые, кажется, может предоставить Unity? Ну, если вы не отключили это, вы, скорее всего, тоже участвуете в этом.

Для этой статистики требуется несколько разрешений, поскольку телефон будет анализироваться на аппаратном уровне, а также отображаться в предоставленной статистике.

  • Вы действительно используете все требования к API/инструментам/ресурсам?

Возможно, вы включили некоторые API, инструменты или почти любую DLL от внешней стороны, которая может включать или не включать код, требующий зависимостей. Так же часто они не очищены на 100% и могут включать требования к разрешениям, не относящиеся к их функциям или к функциям, которые вам нужны.

Скажем, какой-то рекламный сервис может захотеть получить доступ к микрофону пользователя. Но поскольку вы не используете их функции «анализа вокального ответа OMG», это разрешение вам не требуется.

Эти разрешения можно удалить вручную, как я описал ранее в своем ответе. Или с помощью какой-либо формы автоматизации, такой как скрипт пометить редактор пост-сборки.

КОНКРЕТНЫЙ ВОПРОС:

Разрешение RECORD_AUDIO попадает в файл манифеста Android, если есть вызов Microphone библиотека в любом скрипте проекта. Неважно, существует сценарий в сцене или нет. В этом конкретном случае, если SDK платформы Oculus импортируется в проект (что является требованием магазина) есть несколько скриптов, которые используют библиотеку Microphone. Поэтому, если вы не используете какую-либо функцию аудиозаписи, например голосовой ввод, просто удалите следующие файлы в разделе OculusPlatform/Scripts: MicrophoneInput.cs, IMicrophone.cs, MicrophoneInputNative.cs.

02.12.2016
  • Спасибо за усилия. Я уже знаю все это и упомянул большую часть этого в своем вопросе. Мне не нужно использовать какой-либо декомпилятор для доступа к окончательному манифесту, который уже находится в папке Temp/StagingArea в каталоге проекта. Пожалуйста, попробуйте ответить на два моих вопроса в конце поста. И я говорю конкретно об источнике разрешений, упомянутом в вопросе. Спасибо :) 02.12.2016
  • Я ищу постоянное решение. Удаление разрешений может привести к поломке некоторых плагинов, а я этого не хочу. Я уверен, что вообще не записываю и не использую микрофон. Так зачем мне вообще нужна эта часть кода в моем проекте. Я лучше удалю источник разрешения, а не только разрешение. 02.12.2016
  • @UmairM Я понимаю, что вам нужно постоянное решение, но для точного определения его нет. Однако вы можете программно заменить манифест, даже используя [PostBuild] события, если это необходимо. Делая это постоянным решением, после некоторого ручного труда. 02.12.2016

  • 2

    Простой способ

    Я думаю, что этот более простой подход применим, если ваш проект 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
    

    Трудный путь

    Существует три способа добавления разрешений в ваш проект.

    1. Они указаны в файле манифеста Android.
    2. Они указаны в библиотеке (файл .aar).
    3. Unity добавляет разрешение, когда вы используете определенную функцию. (Добавлен)

    В моих примерах используются инструменты командной строки на Mac. Я не знаю эквивалентов Windows, но там можно найти и запустить инструменты unix (используя подсистему linux для windows 10, cygwin, пользовательские двоичные файлы и т. д.)

    1. Найдите все разрешения, используемые в (несжатых) манифестах Android.

    cd /path/to/my/project/Assets
    grep -r "uses-permission" --include "AndroidManifest.xml" .
    

    Это найдет все файлы с именем AndroidManifest в текущей папке (.) или любой из ее подпапок (-r указывает на рекурсивный поиск) и выдаст любую строку со словами «использует-разрешение».

    В моем текущем проекте я получаю что-то вроде этого:

    ./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 были найдены без разрешений внутри них, а некоторые из библиотек игровых сервисов указывают разрешения.

    Если бы мне нужно было изменить библиотеку, я мог бы переименовать .aar в .zip, распаковать, отредактировать, сжать и переименовать обратно. (Не всегда целесообразно изменять разрешения внутри библиотеки, но это возможно.)

    3. Unity добавляет разрешение

    Мне нечего было добавить по этому поводу; как сказано выше, если вы используете API микрофона, Unity добавит вам разрешение, чтобы ваше приложение работало.

    Однако с тех пор я понял, что вы можете сделать следующее:

    • вызвать настройки сборки для Android
    • установите флажок «Экспорт проекта»
    • Экспортируйте проект, указав местоположение
    • перейдите в /my/project/export/src/main/AndroidManifest.xml. Это то, что Unity выдает для манифеста Android (до того, как инструменты Google сделают все слияние).
    • сравните его (используя ваш любимый инструмент сравнения) с Assets/plugins/Android/AndroidManifest.xml; различия исходят из Unity.
    22.10.2018
  • это должен быть лучший ответ 01.04.2021

  • 3

    @mx-d прав. Я просто хочу добавить еще один способ исправить это: в настройках сборки вы можете отметить Google Android Project, который сгенерирует проект Android Studio. Оттуда вы можете использовать инструмент слияния манифестов Android Studio, чтобы переопределить разрешения.

    Вопрос №1: единственный способ узнать, какая библиотека выдает дополнительное разрешение, — удалить библиотеки одну за другой, собрать проект и проверить манифест .apk. К сожалению, Unity не так гибка, как Android Studio.

    Вопрос № 2: вы не можете добавлять разрешения в Unity с помощью кода (если только это не пользовательский скрипт редактора, специально разработанный для сшивания файлов манифеста)

    02.12.2016
  • Пожалуйста, ознакомьтесь с моими комментариями под ответом MX-D. И во втором вопросе я конкретно говорил о коде, который требует определенного разрешения. например isGeniune или Application.internetReachability 02.12.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..