Очистите неиспользуемые разрешения Android

Если бы я хотел исследовать, как и где разрешения [запрошенные в Mainfest.xml] использовались в приложении Android для целей их удаления, есть ли простой способ сделать это? Предлагают ли lint или findbugs какую-то поддержку для отслеживания разрешений, используемых/злоупотребляемых в проекте?


person Cliff    schedule 21.08.2013    source источник
comment
Текущий ответ на обмен стека безопасности говорит, что apkинспекция может обнаружить использование разрешений .   -  person HairyFotr    schedule 06.09.2013
comment
См. также эти вопросы SO .com/questions/8257412/   -  person Adrian    schedule 08.08.2014
comment
Потенциальное решение из обсуждения Google Groups все еще недоступно. Я также не смог заставить работать apkspector (слишком много ошибок Python). Разочаровывает, что Google не предоставляет инструмент, чтобы помочь разработчикам.   -  person GrandAdmiral    schedule 12.01.2015
comment
Может пора выбрать правильный ответ :D   -  person GabrielOshiro    schedule 16.10.2018
comment
Я пришел из прошлого, чтобы принять правильный ответ...   -  person Cliff    schedule 17.10.2018
comment
Клифф спасибо!!!   -  person GabrielOshiro    schedule 18.10.2018


Ответы (7)


Я пришел из будущего, чтобы спасти ваши жизни.

Здесь (в будущем) LINT проверяет отсутствующие разрешения, как вы можете видеть в проверках LINT.

  • Итак, перейдите в свой AndroidManifest.xml и удалите все теги <uses-permission> используя разрешения Android (имеется в виду, не удаляйте разрешения, принадлежащие вашему приложению, такие как UA_DATA и C2D_MESSAGE).
  • Затем запустите LINT-анализ. Нажмите Analyze, затем Inspect Code...
  • Смотрите под Android -> Constant and Resource Type Mismatches
  • Вы должны увидеть все отсутствующие разрешения.
  • Затем вы можете просто щелкнуть их правой кнопкой мыши и выбрать Apply fix "Add Permission". Если вы выберете эту опцию, Android Studio будет включать одно разрешение для каждой ошибки. Таким образом, вы получите несколько копий одного и того же разрешения в файле манифеста, просто удалите дубликаты. Вы можете сделать это и вручную.

Вот описание правила LINT:

Идентификатор типа ресурса

Описание

В ходе этой проверки рассматриваются вызовы Android API, снабженные различными аннотациями поддержки (такими как RequiresPermission или UiThread), и помечаются все вызовы, которые не используют API должным образом, как указано в аннотациях. Примеры ошибок, отмеченных этой проверкой:

  • Передача целого числа ресурсов неправильного типа (например, R.string) в API, который ожидает другой тип (например, R.dimen).
  • Забыть вызвать переопределенный метод (через супер) в методах, которые требуют этого
  • Вызов метода, требующего разрешения, без объявления этого разрешения в манифесте
  • Передача ссылки на цвет ресурса в метод, который ожидает целочисленное значение RGB.

...и многое другое. Дополнительные сведения см. в документации по адресу http://developer.android.com/tools/debugging/annotations.html


Я использую Android Studio 2.1.2.

person GabrielOshiro    schedule 06.07.2016
comment
Действительно, я был уверен, что Lint проверяет разрешения. Это не выполняется в базовых проверках Lint, однако это легко сделать, включив дополнительные проверки в настройках Lint. - person Michele La Ferla; 08.07.2016
comment
Вау, это действительно очень интересно! Спасибо, мистер Будущий разработчик! - person Cliff; 17.10.2018

В файле манифеста вашего приложения у вас должна быть вкладка "Объединенный манифест", где вы можете увидеть свой окончательный манифест и разрешения, которые вы запрашиваете, вы можете щелкнуть разрешение, чтобы увидеть, откуда оно пришло. (кто это добавил - ex': sdk или из какого кода это произошло)

Также есть простой способ удалить разрешение, добавив в манифест:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" 
tools:node="remove" />

Также не забудьте добавить инструменты вверху:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="...">
person beee    schedule 23.08.2017
comment
Следующая ссылка объясняет это более подробно: ссылка - person beee; 23.08.2017

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

person Corneliu Dascălu    schedule 01.07.2014
comment
это может занять несколько дней для больших приложений с 15+ разрешениями - person NikkyD; 01.07.2014
comment
Я знаю, но лучшего решения не вижу. Если у вас есть автоматизированные тесты, это может занять гораздо меньше времени. Если вы этого не сделаете, возможно, стоит потратить время на написание тестов, если вы собираетесь продолжать разработку этого кода. - person Corneliu Dascălu; 01.07.2014
comment
если это стандартные разрешения, вы также можете искать код для нескольких методов, которые его требуют (согласно поиску developer.android.com) - person NikkyD; 01.07.2014
comment
Это без вопросов. Легко понять, какие части кода используют интернет-разрешение, но удалить каждую часть кода, которая записывает данные во внешнее хранилище, может быть сложнее. - person Corneliu Dascălu; 01.07.2014

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

Когда они вернутся (в настоящее время они недоступны), вы можете загрузить свой apk на этот веб-сайт (если это вас устраивает) и позволить им статически проанализировать используемые вами разрешения: http://www.android-разрешения.org/

person Mikel Pascual    schedule 19.07.2014

Лучший способ — понять, что могут на самом деле делать. Если он когда-либо собирается использовать камеру, вы знаете, что вам нужно разрешение камеры.

person Steven K    schedule 27.03.2016

Взгляните на http://developer.android.com/reference/android/Manifest.permission.html найдите разрешение, которое вы использовали в своем Mainfest

person eshbeata    schedule 30.08.2013
comment
Я могу начать с этого, но этот список не поможет мне определить, как найти использование всех различных разрешений в приложении. Например, если я объявляю разрешение WRITE_SETTINGS, то к какому API оно применяется? Как мне найти мой код для использования такого разрешения? - person Cliff; 30.08.2013
comment
В каждом верхнем правом заголовке вы увидите добавленного в уровень API 1 разработчика . android.com/reference/android/ - person eshbeata; 05.09.2013
comment
вам будет сложно определить, для чего каждому классу требуется разрешение, но, например, в каждом требуемом классе вы найдете примечание о том, что для этого требуется разрешение, например: developer.android.com/reference/android/hardware/Camera.html - person eshbeata; 05.09.2013
comment
Это моя проблема. Я хотел бы знать, какие классы требуют данного разрешения, а не наоборот. Это сделано для того, чтобы я мог получить разрешение, такое как CAMERA, оценить android.hardware.Camera и сканировать мой источник на предмет любого/всего использования класса android.hardware.Camera, таким образом определяя, действительно ли мне нужно объявить разрешение CAMERA. - person Cliff; 06.09.2013

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

person MNM    schedule 06.06.2016
comment
Вы предполагаете, что OP - это автор, который поставил там разрешения в первую очередь, а не наследник какого-то плохого кода. - person tir38; 24.10.2017