Почистете неизползваните разрешения за Android

Ако исках да проуча как и къде са използвани разрешения [заявени в Mainfest.xml] в приложение за Android за целите на премахването им, има ли лесен начин да направя това? Предлагат ли lint или findbugs някаква поддръжка за проследяване на разрешения, използвани/злоупотребявани в проект?


person Cliff    schedule 21.08.2013    source източник
comment
Не мисля, че е лесен директен път. Имаше дискусия в Google Групи по тази тема и потенциално решение, но уебсайтът, към който има връзка, изглежда не работи.   -  person Jason Robinson    schedule 21.08.2013
comment
Текущият отговор на stackexchange за сигурност казва, че apkinspector може да открие използването на разрешение .   -  person HairyFotr    schedule 06.09.2013
comment
Вижте и тези SO въпроси stackoverflow .com/questions/8257412/   -  person Adrian    schedule 08.08.2014
comment
Потенциалното решение от дискусията в Google Групи все още не работи. Също така не успях да накарам apkinspector да работи (твърде много грешки на 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:

ID ResourceType

Описание

Тази проверка разглежда извикванията на API на Android, които са анотирани с различни анотации за поддръжка (като RequiresPermission или UiThread) и маркира всички повиквания, които не използват API правилно, както е посочено от анотациите. Примери за грешки, отбелязани от тази проверка:

  • Предаване на грешен тип цяло число на ресурс (като R.string) към API, който очаква различен тип (като R.dimen).
  • Забравяне да се извика замененият метод (чрез super) в методи, които го изискват
  • Извикване на метод, който изисква разрешение, без да е декларирано това разрешение в манифеста
  • Предаване на препратка към цвят на ресурс към метод, който очаква 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-permissions.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