it-swarm.com.de

Ist Android: exported = "true" wirklich für einen Authentifizierungsdienst erforderlich?

Bei der Implementierung eines Android-Authentifikators sind normalerweise zwei Dienste beteiligt: ​​der Authentifizierungsdienst zur Rückgabe eines Authentifikators und der Synchronisierungsdienst, der einen Synchronisierungsadapter bereitstellt. Diese Frage bezieht sich speziell auf den Authentifizierungsdienst, obwohl in den meisten Beispielen beiden Diensten das Attribut Android:exported="true" im AndroidManifest.xml zugewiesen ist, z.

<service
    Android:name=".authenticator.AuthenticationService"
    Android:exported="true">
    <intent-filter>
        <action
            Android:name="Android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data
        Android:name="Android.accounts.AccountAuthenticator"
        Android:resource="@xml/authenticator" />
</service>

Das Entfernen des Attributs aus dem Authentifizierungsdienst scheint keine Auswirkung zu haben (getestet von Froyo, Gingerbread). Der Authentifizierungscode funktioniert weiterhin einwandfrei. Ist das Flag also tatsächlich erforderlich?

22
Roberto Tyley

Ok, um dies selbst durch das Lesen der Dokumente zu beantworten, sagt die documentation für das exported-Attribut: 

Der Standardwert hängt davon ab, ob der Dienst Intent-Filter (.____.) Enthält. Das Fehlen von Filtern bedeutet, dass nur Durch Angabe seines genauen Klassennamens aufgerufen werden kann. Dies bedeutet, dass der Dienst Nur für den anwendungsinternen Gebrauch vorgesehen ist (da andere Benutzer den Klassennamen Nicht kennen würden). In diesem Fall ist der Standardwert "false". Auf der anderen Seite bedeutet das Vorhandensein mindestens eines Filters, dass Der Dienst für eine externe Verwendung vorgesehen ist. Der Standardwert ist also "wahr".

Alle Authentifizierungsdienste verfügen über einen Intent-Filter - die Dokumente für AbstractAccountAuthenticator sagen:

Um ein Authentifikator zu sein, muss man ... einen Dienst schreiben, der Das Ergebnis von getIBinder () in OnBind (Android.content.Intent) des Dienstes zurückgibt, wenn er mit einer Absicht mit einer Aktion aufgerufen wird ACTION_AUTHENTICATOR_INTENT.

Dies erfordert einen Intent-Filter. Der Standardwert für den Export des Services lautet true. Die Antwort auf diese Frage lautet also "Nein, das Attribut ist nicht notwendig - weil es standardmäßig wahr ist".

37
Roberto Tyley

Dies ist zwar nicht unbedingt erforderlich, scheint jedoch etwas verwirrend zu sein. Aus diesem Grund empfiehlt Google to

Setzen Sie das Android:exported-Attribut immer explizit, unabhängig davon, ob Sie Komponenten der Anwendung exportieren.

in ihren Kern App Qualitätsrichtlinien .

1
serv-inc