O serviço exportado não requer permissão: o que significa?

143

Criei um serviço vinculado por outros aplicativos através do AIDL e o adicionei ao manifesto da seguinte maneira:

<service android:name=".MyService">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

onde IService é a interface AIDL.

Dessa maneira, o Eclipse me mostra o aviso Serviço exportado não requer permissão . Se eu remover o intent-filter, o aviso desaparecerá, mas obviamente os aplicativos não poderão se vincular ao serviço.

O que esse aviso significa?

enzom83
fonte
31
Isso significa que outros aplicativos (arbitrários) que o usuário possui em seu telefone podem se conectar ao seu Servicee ligar para qualquer método que desejarem, exposto na interface AIDL.
Jens
25
crie uma nova <permission> no seu AndroidManifest.xml e use o nome disso como android:permissionatributo da sua <service>declaração. Ou simplesmente ignore o aviso - o que o serviço pretende fazer? Se você está bem com manter o serviço "interno" é muito mais fácil apenas para definir android:exported="false"em seu<service>
Jens
3
Em seguida, ignore o aviso ou adicione uma <permission>, use "signature" se todos os seus aplicativos forem assinados com o mesmo certificado ou apenas use "normal" caso contrário.
Jens
3
Você já está usando um certificado (liberação) para assinar seus aplicativos - a proteção de assinatura verifica se o aplicativo que solicita a permissão tem a mesma assinatura do aplicativo que definiu a permissão.
Jens
2
@ Jens Obrigado ... me ajudou .... btw você pode adicionar seus comentários como resposta. Deixe o enzom83 aceitá-lo.
Vijay C

Respostas:

128

Eu tive o mesmo problema quando atualizei o SDK para a versão 20 . Eu o removi adicionando a propriedade android: exported da seguinteandroid:exported="false" forma:

<service android:name=".MyService"
    android:exported="false">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

Veja este documento

Nam Vu
fonte
56

Se você deseja restringir o uso da atividade ao seu próprio aplicativo, adicione exported=falsea declaração do manifesto da atividade.

Se você deseja permitir que outros aplicativos o usem (explicitamente através do nome da classe ou, melhor, usando uma intenção com um tipo de dados ou ação), então você tem duas opções:

  • restringir esses aplicativos usando uma permissão
  • permitir que todos os aplicativos o usem, você poderá adicionar tools:ignore="ExportedActivity"à declaração de manifesto da sua atividade.

-

O mesmo raciocínio se aplica a um serviço, com tools:ignore="ExportedService"e com provedores de conteúdo tools:ignore="ExportedContentProvider".

Snicolas
fonte
8
Isso funcionou para mim, obrigado !! No entanto, aviso que este necessita para adicionar uma declaração xmlns no topo do arquivo de manifesto:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit
Obrigado, é adicionado automaticamente pelo Eclipse. Esse é um bom complemento para outros usuários de IDEs.
9788 Snicolas
Eu uso o Eclipse 4.2.1 e não o adiciona, fornecendo um erro (pelo menos com a configuração padrão?). Apenas diz:, The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not bounde não há opções para corrigir isso.
Luis A. Florit
Ele será adicionado se você remover a instrução tools: foo = bar e, quando houver um erro / aviso, clique com o botão direito do mouse e use uma correção rápida para adicionar a instrução tools.
Snicolas
1
O caso especial é o SyncService, que deve ser exportado, mas você deseja que o sistema o utilize apenas. Para SyncService ou AuthenticatorService adicione android: permission = "signature"
Entreco 13/08/2015
4

Como Jens disse: "Isso significa que outros aplicativos (arbitrários) que o usuário possui no telefone podem vincular-se ao seu Serviço e ligar para qualquer método que desejarem, exposto na interface AIDL".

JD.
fonte