Il servizio esportato non richiede l'autorizzazione: cosa significa?


143

Ho creato un servizio associato da altre applicazioni tramite AIDL e lo aggiungo al manifest come segue:

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

dove IService è l'interfaccia AIDL.

In questo modo, Eclipse mi mostra l'avviso Il servizio esportato non richiede autorizzazione . Se rimuovo intent-filter, l'avviso scompare, ma ovviamente le applicazioni non sono in grado di collegarsi al servizio.

Cosa significa questo avviso?


31
Significa che altre applicazioni (arbitrarie) che l'utente ha sul suo telefono possono collegarsi al tuo Servicee chiamare qualunque metodo a loro piacimento che sia esposto attraverso la tua interfaccia AIDL.
Jens,

25
crea un nuovo <permission> nel tuo AndroidManifest.xml e usa questo nome come android:permissionattributo della tua <service>dichiarazione. O semplicemente ignorare l'avvertimento: che cosa intende fare il servizio? Se stai bene mantenendo il servizio "interno" è molto più semplice impostare android:exported="false"il tuo<service>
Jens

3
Quindi ignora l'avviso o aggiungi un <permissione>, usa "firma" se sono tutte le tue applicazioni firmate con lo stesso certificato o vai semplicemente con "normale" in caso contrario.
Jens,

3
Stai già utilizzando un certificato (di rilascio) per firmare le tue applicazioni: la protezione della firma verifica che l'applicazione che richiede l'autorizzazione sia firmata come l'applicazione che ha definito l'autorizzazione.
Jens,

2
@Jens Grazie ... mi ha aiutato .... a proposito puoi aggiungere i tuoi commenti come risposta. Lascia che enzom83 lo accetti.
Vijay C,

Risposte:


128

Ho avuto lo stesso problema quando ho aggiornato SDK alla versione 20 . L'ho rimosso aggiungendo android: proprietà esportata in questo android:exported="false"modo:

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

Vedi questo documento


56

Se si desidera limitare l'utilizzo dell'attività alla propria applicazione, è necessario aggiungere exported=falseall'istruzione manifest dell'attività.

Se vuoi consentire ad altre applicazioni di usarlo (esplicitamente tramite il nome della sua classe o, meglio, usando un intento con un tipo di dati o un'azione), hai due possibilità:

  • limitare tali applicazioni utilizzando un'autorizzazione
  • consentire a tutte le applicazioni di usarlo, quindi è possibile aggiungere tools:ignore="ExportedActivity"alla dichiarazione manifest della propria attività.

-

Lo stesso ragionamento si applica a un servizio, con tools:ignore="ExportedService"e fornitori di contenuti con tools:ignore="ExportedContentProvider".


8
Questo ha funzionato per me, grazie !! Tuttavia, si noti che ciò richiede l' aggiunta di una dichiarazione xmlns nella parte superiore del file manifest:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit,

Grazie, è stato aggiunto automaticamente da Eclipse. Questo è un bel complemento per gli altri utenti IDE.
Snicolas,

Uso Eclipse 4.2.1 e non lo aggiunge, dando un errore (almeno con la configurazione predefinita?). Dice solo:, The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not bounde nessuna scelta è data per risolvere questo.
Luis A. Florit,

Lo aggiungerà se rimuovi i tuoi strumenti: foo = istruzione bar, quindi quando c'è un errore / avviso, fai clic destro e usa una soluzione rapida per aggiungere l'istruzione tools.
Snicolas,

1
Il caso speciale è SyncService, che dovrebbe essere esportato ma si desidera che solo il sistema lo utilizzi. Per SyncService o AuthenticatorService aggiungi android: permesso = "firma"
Entreco

4

Come ha detto Jens , "Significa che altre applicazioni (arbitrarie) che l'utente ha sul suo telefono possono legarsi al tuo Servizio e chiamare qualunque metodo a loro piacimento che sia esposto attraverso la tua interfaccia AIDL."

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.