Jak działają pozwolenia w systemie Android?

Paweł Dedio Programowanie 2018-11-24

Witajcie ponownie! Przychodzę do Was z kolejną porcją androidowej wiedzy. Dzisiaj opowiem Wam, jak z perspektywy programisty wygląda zarządzanie pozwoleniami.

Dawno, dawno temu

Najpierw cofnijmy się trochę w czasie — do początku roku 2015. Jest to okres, w którym większość urządzeń działa pod kontrolą systemu Android Lollipop oraz nieco starszych: Kitkata i Jelly Beana. Ze swojej perspektywy mogę powiedzieć, że było to wtedy prawdziwe eldorado dla programistów. Mogliśmy właściwie robić to, co chcieliśmy i kiedy chcieliśmy. Nie było praktycznie żadnych limitów wykorzystywania zasobów smartfona (również w tle). Nikt nie przejmował się zużyciem baterii ani pamięci.

Jednak przejdźmy do tego, co najbardziej dotyczy dzisiejszego odcinka, czyli pozwoleń. W tamtych czasach wyglądały one zupełnie inaczej niż dzisiaj. Wystarczyło, że w odpowiednim pliku zadeklarowałeś, z jakich uprawnień będzie korzystać twoja aplikacja. Użytkownik podczas instalacji widział je co prawda, ale miał tylko dwie możliwości: zainstalowanie aplikacji i zaakceptowania jej uprawnień lub rezygnację z instalacji. To prowadziło do wielu patologii i nadużywania uprawnień. Jednym z głośniejszych przypadków jest afera z Facebookiemw której wyszło, że aplikacja Facebooka podsłuchiwała nas cały czas i na podstawie naszych rozmów dopasowywała reklamy.

Jak jest dzisiaj?

Premiera Androida 6.0 Marshmallow wprowadziła niemałą rewolucję. Oprócz zajęcia się oszczędzaniem energii całkowicie zmienił on również model pozwoleń. Jednak trzeba tutaj przyznać wyższość systemu iOS — jego użytkownicy mieli tę funkcjonalność już dużo wcześniej.

Przejdźmy do konkretów — co się właściwie zmieniło? Krótko można odpowiedzieć, że wszystko. W nowym systemie użytkownik akceptował tylko te pozwolenia, które chciał. Dodatkowo nie robił tego przy instalacji aplikacji, lecz w czasie jej działania. Dodatkowo w każdej chwili mógł odwołać dowolne pozwolenie. Najbardziej ta zmiana uderzyła w aplikacje, które działały od kilku lat i miały dość dużą bazę użytkowników. Dawniej nikt w ogóle nie zakładał scenariusza, że możemy nie mieć danego pozwolenia w chwili kiedy chcemy z niego skorzystać. Od teraz przed każdym skorzystaniem z funkcjonalności systemu wymagającej dodatkowych uprawnień musieliśmy najpierw sprawdzić, czy w ogóle mamy do nich dostęp.

Jak to wygląda z perspektywy programisty?

Podobnie jak wcześniej, najpierw musimy zadeklarować wykorzystywane uprawnienia w odpowiednim pliku konfiguracyjnym. Jednak to nie gwarantuje, że takowe dostaniemy — teraz wszystko zależy od użytkownika. Powszechnie stosowaną praktyką jest najpierw wyświetlenie jakiegoś komunikatu, w którym tłumaczymy użytkownikowi, dlaczego potrzebujemy danego pozwolenia. Przykładowo w aplikacji, która umożliwia wysyłanie zdjęć z galerii, możemy wytłumaczyć, że pozwolenie do odczytywania plików jest nam potrzebne do wysłania wybranego przez użytkownika zdjęcia. W każdym momencie musimy mieć również gotowy scenariusz na wypadek, gdyby użytkownik nie zgodził się na udzielenie pozwolenia.

Całość można sprowadzić do sześciu kroków:

  1. Sprawdzamy, czy aplikacja ma wymagane przez nas pozwolenie
  2. Jeśli tak, to wykonujemy jakąś akcję wymagającą tego uprawnienia
  3. Jeśli nie, to pokazujemy komunikat tłumaczący, dlaczego potrzebujemy tego pozwolenia
  4. Po przeczytaniu komunikatu pokazujemy systemową kontrolkę do akceptacji wymaganych uprawnień
  5. Jeśli użytkownik zaakceptuje pozwolenia to wykonujemy naszą akcję
  6. Jeśli użytkownik nie zaakceptuje pozwolenia, to kończymy akcję i tłumaczymy mu, dlaczego nie możemy jej wykonać

Jakie są dobre praktyki?

Google w oficjalnej dokumentacji wyjaśnia, czego nie powinniśmy robić w kontekście pozwoleń.

Najważniejszą kwestią jest zminimalizowanie liczby potrzebnych pozwoleń. Jak to zrobić? Możemy korzystać z pomocy innych aplikacji — na przykład, zamiast prosić o pozwolenie na użycie aparatu, możemy zrobić zdjęcie za pomocą systemowej aplikacji aparatu i pobrać to zdjęcie do naszej aplikacji. Pewnie nieraz spotkałeś się z sytuacją, gdy jakaś aplikacja otwiera domyślną kamerę, a potem w magiczny sposób zrobione zdjęcie pojawia się z powrotem w tamtej aplikacji.

Równie istotne jest nieblokowanie działania aplikacji, jeśli użytkownik nie udzielił jakiegoś pozwolenia. Pisałem już trochę wyżej, że musimy przygotować jakieś alternatywne scenariusze. Przykładowo, jeśli mamy aplikację pogodową i użytkownik nie zgodzi się na wykorzystanie lokalizacji, możemy umożliwić mu ręczne wpisanie miejscowości, dla której chciałby poznać pogodę. Warto wtedy pokazać jakiś komunikat informujący użytkownika, że gdyby udzielił pozwolenia, to mógłby wygodniej korzystać z naszej aplikacji.

Kolejną istotną kwestią jest dokładne wyjaśnienie, dlaczego potrzebujemy danego pozwolenia? W dzisiejszych czasach użytkownicy coraz bardziej dbają o swoją prywatność. Jeśli prosisz o pozwolenia takie jak lokalizacja, dostęp do mikrofonu czy plików telefonu, to musisz to naprawdę dobrze uzasadnić. Badania przeprowadzone przez profesora Jasona Hong udowodniły, że użytkownicy stają się bardziej spokojni, jeśli wiedzą, do czego konkretnie aplikacja używa ich lokalizacji lub innych wrażliwych informacji.

Ostatnią bardzo ważną rzeczą jest pytanie o pozwolenia tylko w momencie, gdy ich potrzebujemy. Wiele aplikacji (szczególnie zaraz po wejściu na rynek Androida 6.0 Marshmallow) poszło na łatwiznę i działało na zasadzie szantażu. Przy starcie aplikacja pytała o wszystkie potrzebne pozwolenia jednocześnie, a jeśli użytkownik na któreś się nie zgodził, to aplikacja przestawała działać. Coś takiego jest nieakceptowalne — jeśli widzę coś takiego, to od razu usuwam taką aplikację z telefonu. Pytanie o pozwolenie powinno występować tylko w odpowiednim momencie i kontekście. Na przykład powinniśmy pytać o dostęp do lokalizacji, dopiero gdy użytkownik otworzy ekran z mapą. Dzięki temu użytkownik będzie mógł lepiej zrozumieć, po co nam dane pozwolenie.

Nie o wszystkie pozwolenia musimy pytać

W androidzie wyróżniamy dwa (od Androida 8.1 Oreo trzy, ale tutaj to nieistotne) typy pozwoleń: niebezpieczne (dangerous) oraz normalne (normal).

Pozwolenia normalne to takie, które nie stanowią jakiegoś niebezpieczeństwa dla użytkownika. Deklarujemy je w pliku konfiguracyjnym aplikacji, ale zostają one przydzielone już w momencie instalacji aplikacji. Zaliczamy do nich między innymi dostęp do Internetu, Bluetooth, NFC, ustawianie alarmów, dostęp do wibracji i tak dalej. Pełną listę normalnych pozwoleń możecie zobaczyć w oficjalnej dokumentacji.

Pozwolenia niebezpieczne najczęściej dotyczą jakiś wrażliwych informacji o użytkowniku. Są to wszystkie pozwolenia, o które zostajesz pytany podczas użytkowania aplikacji. Nie są one przydzielane w momencie instalacji i mogą być w każdej chwili cofnięte w ustawieniach systemu. Do pozwoleń niebezpiecznych zaliczamy między innymi: dostęp do lokalizacji, kontaktów, plików i tak dalej. Pełną listę niebezpiecznych pozwoleń możecie również zobaczyć w oficjalnej dokumentacji (musicie przewinąć w dół, aż zobaczycie tabelkę).

Tym sposobem dobrnęliśmy do końca tego odcinka. Dzięki za przeczytanie! Za tydzień dowiecie się co wiedzą o nas aplikacje i jak wygląda śledzenie użytkowników. Tradycyjnie zachęcam do komentowania i pisania propozycji tematów, które chcielibyście zobaczyć w tej serii. Do zobaczenia za tydzień!

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie do kariery programisty — zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów — być może to właśnie tam znajdziesz swoją pierwszą pracę.

Poprzednie odcinki:

  1. Typowy dzień pracy programisty
  2. Wady pracy programisty
  3. Zalety pracy programisty
  4. [FAQ] Wszystko, co powinieneś wiedzieć, jeśli interesuje Cię praca programisty
  5. Co mnie zdziwiło w programowaniu?
  6. Motywacje – w jaki sposób nie stracić zapału do programowania?
  7. Jaką firmę wybrać na początku kariery programisty?
  8. Jak wygląda rozmowa o pracę na stanowisko programisty?
  9. Jak zacząć programować?
  10. Skąd czerpać wiedzę o programowaniu?
  11. Początki programowania — jaką technologię wybrać?
  12. Cykl życia aplikacji na Androida — co to takiego?
  13. Jak tworzymy interfejs użytkownika w aplikacjach na Androida?
  14. Jak system Android oszczędza energię?
  15. Jak działają i czym są powiadomienia push w Androidzie?
  16. W jaki sposób aplikacje pobierają dane z zewnętrznych serwisów i czym jest API?


  • Dark1

    Może jakie praktyki stosują programiści aby zoptymalizować działanie programu lub coś w tym stylu

  • JebaczKoz

    Jest ten xposed.

  • stark2991

    System uprawnień to niestety nadal patologia. Jak już sam autor zauważył, jest wiele aplikacji, które się po prostu wyłączą po odmowie przyznania jakiegokolwiek z nich, albo będą prosić w nieskończoność. Brakuje mi w tym wszystkim transparentności. Spotkałem nieliczne apki, które miały już w sklepie objaśnione jakie uprawnienie jest wykorzystane i do czego. Jeśli developer nie wytłumaczył mi, po co jego kalkulatorowi potrzebny jest dostep do aparatu, to niech się buja na drzewo.

    • TheDon Kichot

      Ostatnio chciałem nagrać coś dyktafonem w Xiaomi, ale nie dało się, bo apka wymagała dostępu do kontaktów i kilku innych, zupełnie niepowiązanych z dyktafonem elementów. Z wieloma innymi apkami Xiaomi jest podobnie.

      • laser raptor

        Jak to jest preinstalowana apka Xiaomi to bym się za bardzo nie przejmował.

        • Raciawelli

          Ja bym się tymbardziej przejmował.

    • Piotr Winkler

      To dobrze świadczy o develooerach z tego co zauważyłem to są główne małe firmy lub osoby prywatne.
      A Google, w moim przypadku ten fakt mnie masakrycznie wkurza ponieważ korzystam tylko z map którym tak naprawdę powinien wystarczyć dostęp tylko do GPS a jestem zmuszony zezwolić na…
      Aparat,
      Czujniki na ciele,
      Kalendarz,
      Kontakty,
      Mikrofon,
      Pamięć,
      SMS,
      Telefon,
      Nie wiedząc dlaczego! Po co! I w jakim stopniu jest to dalej wykorzystywane.

      No cóż zostanie mi pogodzić się z tym smutnym faktem i poczekać aż ktoś zrobi coś z tą „Patologią”…
      Ciekaw jestem czy się doczekam 🙂

      Pozdrawiam.

      • stark2991

        Nie jest wykorzystywane, a przynajmniej nie do nawigowania. Mam Mapy i uprawnienie tylko do lokalizacji – apka normalnie działa, nawiguje, nigdy nie prosiła o inne uprawnienia. Tak samo jak koledzy niżej. Tak więc wychodzi, że problem jest u Ciebie, a nie u Google.

        • Piotr Winkler

          Ciekawe?
          A jakie uprawnienia masz włączone w „Usługi Google Play” ?

          • stark2991

            Wszystkie. Ale to osobna aplikacja.

          • Piotr Winkler

            Usługi Google Play są ściśle powiązane z całą resztą googlowskich aplikacji dając im dostęp reszta aplikacji również ma do nich dostęp.

            Wyłącz trzy przypadkowe uprawnienia w usługach Google Play i włącz na chwilę nawigacje.
            Daj znać co się dzieje.

          • stark2991

            „dając im dostęp reszta aplikacji również ma do nich dostęp.”
            To teraz mi udowodnij, że dając Usługom dostęp do aparatu Mapy również mają dostęp do aparatu i z niego korzystają.

          • Piotr Winkler

            Racja próbując dodać zdjęcie do map aplikacja wymaga dostępu do Aparatu i plików, tego nie sprawdziłem!
            Źle to zinterpretowałem, usługi Google wymuszają dodanie tych uprawnień dopiero w momencie uruchomienia map i to mnie zmyliło…
            To teraz już kompletnie nie rozumie Po co i dlaczego usługi tak nachalnie wymagają tych uprawnień!

  • laser raptor

    „zamiast prosić o pozwolenie na użycie aparatu, możemy zrobić zdjęcie za pomocą systemowej aplikacji aparatu i pobrać to zdjęcie do naszej aplikacji.”

    A tego nie można podciągnąć pod jakąś lukę w zabezpieczeniach?

    • Szukar

      No nie, bo tego nie da się zrobić w tle. Urzyszkodnik sam musi wyklikać zrobienie zdjęcia.

  • Piotr Winkler

    Wyłącz sobie na parę dni w mapach Google dostęp do Aparatu, Kontaktów, Mikrofonu po pewnym czasie tak ci ciśnie podskoczy że będziesz miał temat na nowy artykuł. I nie zgadzam się trochę z tym artykułem bo mapy wymuszają nachalnie danie uprawnień do mikrofonu i aparatu… Po co?

    • łukasz Jedryszczyk

      Jak nachalnie ja nie mam udzielonych tych uprawnień i mapy w ogóle o nie nie pytają. Jak łatwo się domyślić mikrofon jest potrzebny do komend głosowych gorzej z aparatem jednak tak jak mówię mi działa normalnie bez tych uprawnień

      • Szukar

        Dokładnie. Moje uprawnienia wyglądają tak: https://uploads.disquscdn.com/images/37906e36d36301f5eeefc63c9e44bed29e339e22c4c50bc9033baebee3ed0b32.jpg.
        I ani razu nie miałem żadnego powiadomienia czy innego komunikatu, że aplikacja potrzebuje czegokolwiek więcej.

        • Piotr Winkler

          Tak dokładnie tak jak napisaliście…
          Ja też w mapach mam tylko dostęp do gps
          Zobaczcie sobie „usługi Google Play”
          To traci sens nie dacie uprawnień w mapach ale mapy wezmą sobie je z usług google Play! To by nam lepiej wytłumaczył twórca artykuł…
          Tak czy inaczej wyłączając dostęp do czegokolwiek w usługach telefon co minutę informuje o problemach doprowadzając do szału.
          Dajcie znać jak jest u was może to tylko na s9 tak się dzieje?

          Ps. Google wymusza danie uprawnień do wszystkiego

          • Paweł Dedio

            Ogólnie usługi Google Play to przykład największej patologii i nieprzestrzegania żadnych reguł przez Google. Zastanawiam się czy nie napisać o tym jakiegoś osobnego artykułu.

          • Piotr Winkler

            Teraz to już lepiej ten temat zostawić…
            Mogłem wogule go nie poruszać!
            Pojawiło się aż nadto pytań bez odpowiedzi a na starcie było tylko jedno! 🙂
            Pozdrawiam.

            Ps. Od 4 godzin mam wyłączone wszystkie uprawnienia w usługach Google Play poza GPS i telefon o nic się nie pluje aż do momentu w którym nie włączę map…
            A i jeszcze przypomniało mi sie…
            Chyba w marcu zacisnolem zęby i przez kilka dni bagatelizowałem te komunikaty, finalnie mapy przestały działać.
            Pozdrawiam.

    • stark2991

      A co konkretnie się dzieje po tych paru dniach?

      • Piotr Winkler

        Finalnie dasz im te uprawnienia!

  • Piszę co myśle

    Ciekawe.