Pular para o conteúdo
tecnologia Android

Anotações de permissão em Android

Andre Henrique Cunha de Moraes
Claudia Rincon
Andre Henrique Cunha de Moraes, and Claudia Rincon

Introdução:


No desenvolvimento Android, garantir que métodos sejam protegidos com permissões é essencial para assegurar a funcionalidade de aplicativos e evitar problemas. Sem verificações adequadas de permissões, os aplicativos correm o risco de acessos não autorizados, vulnerabilidades de segurança e possíveis travamentos.


Em programação, uma anotação é uma etiqueta de metadados que fornece informações adicionais sobre elementos de código, como classes, métodos ou variáveis. As anotações não modificam o comportamento do código, mas são usadas por compiladores, ferramentas ou frameworks para impor regras, gerar código ou fornecer comportamento em tempo de execução. 


Anotações como @RequiresPermission e @EnforcePermission podem ajudar os desenvolvedores a implementar proteções de forma eficaz, garantindo aplicativos robustos e seguros. Enquanto @RequiresPermission atua como uma verificação de lint em tempo de compilação, @EnforcePermission garante a imposição em tempo de execução, como vamos mostrar neste artigo.

 

Anotação @RequiresPermission:


A anotação @RequiresPermission é uma ferramenta de verificação que opera durante a compilação e análise estática no Android Studio. Ela alerta os desenvolvedores se um método requer uma permissão específica, ajudando a identificar problemas potenciais no início do processo de desenvolvimento [1]. Essa anotação é particularmente útil para garantir que métodos que acessam recursos sensíveis (como serviços de localização) sejam devidamente protegidos.


Para usá-la, basta escrever a anotação @RequiresPermission seguida da permissão necessária entre parênteses. O exemplo abaixo mostra um sampleMethod que utiliza a anotação para a permissão 'android.permission.ACCESS_COARSE_LOCATION'.

Captura de tela 2026-05-21 091418

Também é possível especificar várias permissões usando anyOf (pelo menos uma permissão) ou allOf (todas as permissões):

Captura de tela 2026-05-21 091522

Ao interagir com esses métodos no Android Studio, o IDE alertará os desenvolvedores para garantir que as permissões necessárias sejam concedidas. Um alerta típico costuma ser:

"Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException."


No entanto, observe que @RequiresPermission é uma flag de compilação e não impõe permissões em tempo de execução. Para lidar com permissões dinamicamente, os desenvolvedores devem incluir verificações em tempo de execução, como mostrado abaixo:

Ao combinar @RequiresPermission com verificações em tempo de execução, os desenvolvedores podem garantir tanto a qualidade do código quanto um gerenciamento robusto de permissões.


Anotação @EnforcePermission:


A anotação @EnforcePermission faz parte das APIs do sistema Android restritas @hide (especificamente android.annotation.EnforcePermission). Ela não está disponível para desenvolvimento de aplicativos regulares, mas é projetada para serviços do sistema e aplicações de nível de estrutura. Diferentemente de @RequiresPermission, que opera em tempo de compilação, @EnforcePermission impõe permissões em tempo de execução, garantindo que apenas componentes autorizados possam acessar métodos ou recursos sensíveis.


Introduzida no Android SDK API 35+, essa anotação é frequentemente usada em interfaces definidas por AIDL para aumentar a segurança. AIDL (Android Interface Definition Language) é uma linguagem usada para definir interfaces que permitem a comunicação entre processos (IPC) entre componentes Android, como serviços e aplicativos. As interfaces AIDL permitem que diferentes processos se comuniquem de forma fluida, sendo essenciais para serviços de nível de sistema e aplicações de nível de estrutura. Ao definir métodos e tipos de dados em um arquivo AIDL, os desenvolvedores podem expor funcionalidades para outros aplicativos ou componentes do sistema, mantendo a segurança e a eficiência. Por exemplo, ela é utilizada em projetos de nível de estrutura, como LineageOS, para proteger funcionalidades críticas do sistema [3].


Durante a compilação, a anotação injeta código que verifica automaticamente as permissões necessárias. Se as permissões não forem concedidas, o sistema lança uma exceção de segurança, impedindo o acesso não autorizado.



Como funciona:


Na interface AIDL, o método a ser protegido deve ser precedido pela anotação @EnforcePermission. Assim como @RequiresPermission, ela pode exigir apenas uma permissão, várias permissões ou pelo menos uma de um conjunto usando anyOf e allOf.

Captura de tela 2026-05-21 091940

Na classe de serviço que implementa os métodos AIDL, cada método anotado deve fazer a primeira chamada para uma função chamada [nome_do_método]_enforcePermission().

Quando o código é compilado, um arquivo .java com o mesmo nome da interface AIDL é gerado. 

Esse arquivo implementa a função [nome_do_método]_enforcePermission(), chamando o método enforcePermission da classe PermissionEnforcer.

A classe PermissionEnforcer vem do código-fonte AOSP [3]. Seguindo o fluxo do código, podemos verificar que ele verifica se as permissões necessárias foram concedidas e, se não, lança uma exceção de segurança.

Conclusão:

Neste artigo, mostramos a distinção entre @RequiresPermission e @EnforcePermission e como elas podem ser usadas para fornecer segurança para aplicações e serviços Android.
Para serviços de framework baseados em AIDL, o risco de acesso não autorizado via reflection em Java destaca a importância de haver verificações de permissões privilegiadas. Essas permissões não devem ser obtiveis por aplicativos regulares, protegendo métodos sensíveis contra exploração.


Os desenvolvedores desses serviços de framework podem implementar verificações de permissões usando a anotação @EnforcePermission ou manualmente no código. Ao adotar essas práticas, os desenvolvedores podem melhorar significativamente a segurança e a confiabilidade de seus aplicativos, protegendo tanto os dados dos usuários quanto a integridade do sistema.

Fontes

[1] https://developer.android.com/reference/androidx/annotation/RequiresPermission

[2] https://android.googlesource.com/platform/prebuilts/fullsdk/sources/+/refs/heads/androidx-xr-scenecore-release/android-35/android/annotation/EnforcePermission.java

[3] https://github.com/LineageOS/android_frameworks_base

[4] https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/os/PermissionEnforcer.java;l=77?q=PermissionEnforcer&sq=&ss=android%2Fplatform%2Fsuperproject 

Compartilhar este post