Duas pessoas fazem a mesma pergunta e recebem respostas incompatíveis, porque estão em lugares diferentes. Uma tem a tela de configurações de VPN do sistema aberta e edita uma lista de aplicativos. A outra escreve VpnService.Builder.addDisallowedApplication() num editor. As duas chamam isso de filtro de VPN por aplicativo. Só uma delas possui o controle que descreve, e nenhuma das duas está bloqueando nada.

Comece pela tela que o usuário vê

Abra as Configurações, encontre a entrada de VPN e olhe a conexão que está realmente ativa. Se o cliente oferece uma lista por aplicativo, essa lista pertence ao túnel do próprio cliente. A plataforma não publica uma API geral pela qual um aplicativo não relacionado possa ler ou editar a seleção de aplicativos de outra VPN, então um segundo app não pode corrigir essa lista pelo usuário.

Esta é a primeira bifurcação do percurso. Se a VPN instalada não tem esse ajuste, não há nada para contornar com código: o recurso está ausente no produto que possui o túnel. Se tem, a correção certa está naquela tela, feita por quem consegue abri-la.

Siga o pacote para dentro de um túnel

Quando seu próprio app constrói um túnel, ele cria uma interface TUN e declara qual tráfego de aplicativos entra nela. As chamadas de associação acontecem antes de a interface ser estabelecida, e depois disso o conjunto de regras fica fixo para aquela sessão:

val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish()   // membership decided here

Essas chamadas valem apenas para o túnel que seu app acabou de criar e para nada mais. Não são uma política do dispositivo inteiro, não persistem para outros clientes e não alcançam a VPN de outra pessoa. Quando uma chamada do construtor lança uma exceção porque o pacote não pode ser resolvido, a interface nunca é estabelecida, o que é uma falha limpa e não silenciosa.

Por que a exclusão parecia um bloqueio

Um aplicativo excluído é roteado ao redor do seu túnel para a rede subjacente. Isso é o oposto de bloqueá-lo: o tráfego ainda sai do dispositivo, só que fora da interface que você controla. Um app no estilo firewall faz o inverso. Ele admite o tráfego do aplicativo no próprio túnel e então descarta os pacotes, ou se recusa a encaminhá-los, de modo que a interface é a mesma e a direção da política está invertida.

O trabalho por trás dessa inversão não é uma flag de configuração. Você lê pacotes IP do descritor do túnel, decide por fluxo e então os encaminha por um socket protegido ou os descarta. Tudo o que você não tratar simplesmente para, e é por isso que um túnel pela metade parece uma rede quebrada em vez de um filtro que funciona. Se o objetivo é bloquear, orce tratamento de pacotes, um serviço em primeiro plano e uma política escrita para o tráfego que você não consegue classificar.

O que quebra quando você constrói isso sozinho

O Android em geral permite apenas uma VPN ativa por vez, então seu túnel de filtragem e um túnel de privacidade competem pelo mesmo lugar, a menos que os produtos suportem encadeamento. A VPN sempre ativa com bloqueio de conexões muda o modo de falha de um jeito que importa aqui: o tráfego que não pode entrar no túnel é descartado em vez de enviado direto, que é o que um projeto de prevenção de vazamento quer e o que uma sessão de depuração raramente espera.

A visibilidade de pacotes é a segunda armadilha. Resolver o nome de pacote de um aplicativo pode falhar com NameNotFoundException, e em versões mais novas do Android o conjunto de pacotes que você enxerga depende das consultas que você declarou. Trate a exceção em vez de supor que todo nome resolve, e releia a lista quando aplicativos são instalados ou removidos em vez de guardá-la em cache para sempre.

Dispositivos gerenciados adicionam um terceiro dono. Uma política de mobilidade corporativa pode definir uma VPN por aplicativo ou um perfil sempre ativo, e um aplicativo comum não consegue sobrepor isso. Verifique se o dispositivo é gerenciado antes de depurar seu próprio código, porque nesse caso a lista que você tenta mudar talvez não seja editável por ninguém que esteja segurando o telefone.

Teste com um app que você controla

Não teste com o app que você está tentando filtrar. Use um segundo aplicativo cujo comportamento de rede você possa observar, e verifique se o tráfego dele sai pelo seu túnel enquanto o do alvo não sai. Se os dois ficarem dentro, a política funciona e o alvo está excluído; se nenhum sair, o túnel em si está errado e a lista de apps não é o problema.

Depois decida qual de três coisas você está realmente construindo. Um túnel por aplicativo é a API do construtor, com a lista como parte do seu perfil. Um firewall de dispositivo é tratamento de pacotes mais um ciclo de vida que você consegue defender. Mudar a VPN de outra pessoa não é caminho suportado nenhum, e a resposta honesta ali é que o ajuste pertence àquele produto.

Artigos relacionados