Usługa eksportowana nie wymaga pozwolenia: co to znaczy?

143

Utworzyłem usługę, która jest powiązana przez inne aplikacje za pośrednictwem AIDL i dodaję ją do manifestu w następujący sposób:

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

gdzie IService to interfejs AIDL.

W ten sposób Eclipse pokaż mi ostrzeżenie Wyeksportowana usługa nie wymaga pozwolenia . Jeśli usunę intent-filter, ostrzeżenie zniknie, ale oczywiście aplikacje nie mogą połączyć się z usługą.

Co oznacza to ostrzeżenie?

enzom83
źródło
31
Oznacza to, że inne (dowolne) aplikacje, które użytkownik ma na swoim telefonie, mogą łączyć się z tobą Servicei wywoływać dowolną metodę, która jest ujawniona przez interfejs AIDL.
Jens
25
utwórz nowe <permission> w swoim AndroidManifest.xml i użyj jego nazwy jako android:permissionatrybutu swojej <service>deklaracji. Lub po prostu zignoruj ​​ostrzeżenie - co ma robić usługa? Jeśli nie przeszkadza Ci utrzymywanie usługi „wewnętrznej”, o wiele łatwiej jest po prostu ustawić ją android:exported="false"na<service>
Jens
3
Następnie zignoruj ​​ostrzeżenie lub dodaj <permission>, użyj „signature”, jeśli wszystkie są Twoimi własnymi aplikacjami podpisanymi tym samym certyfikatem, lub po prostu wybierz „normal” w przeciwnym razie.
Jens
3
Używasz już (zwalniającego) certyfikatu do podpisywania aplikacji - ochrona podpisu sprawdza, czy aplikacja żądająca pozwolenia jest tak samo podpisana, jak aplikacja, która zdefiniowała to uprawnienie.
Jens
2
@Jens Dzięki… pomogło mi… przy okazji możesz dodać swoje komentarze jako odpowiedź. Niech enzom83 to zaakceptuje.
Vijay C

Odpowiedzi:

128

Miałem ten sam problem, gdy zaktualizowałem SDK do wersji 20 . Usunąłem go, dodając android: eksportowana właściwość, android:exported="false"jak na przykład:

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

Zobacz ten dokument

Nam Vu
źródło
56

Jeśli chcesz ograniczyć wykorzystanie swojej aktywności do własnej aplikacji, powinieneś dodać exported=falsedo manifestu swojej działalności oświadczenie.

Jeśli chcesz zezwolić innym aplikacjom na używanie go (jawnie poprzez nazwę klasy lub, lepiej, używając intencji z typem danych lub akcją), masz dwie możliwości:

  • ograniczyć te aplikacje, używając uprawnienia
  • zezwól wszystkim aplikacjom na używanie go, a następnie możesz dodać tools:ignore="ExportedActivity"do manifestu oświadczenie swojej aktywności.

-

To samo dotyczy usługi z tools:ignore="ExportedService"dostawcami treści z tools:ignore="ExportedContentProvider".

Snicolas
źródło
8
To zadziałało dla mnie, dzięki !! Zwróć jednak uwagę, że wymaga to dodania deklaracji xmlns na górze pliku manifestu:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit
Dzięki, został dodany automatycznie przez Eclipse. To miłe uzupełnienie dla innych użytkowników IDE.
Snicolas
Używam Eclipse 4.2.1 i nie dodaje go, powodując błąd (przynajmniej przy domyślnej konfiguracji?). Mówi tylko: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundi nie ma możliwości rozwiązania tego problemu.
Luis A. Florit
Doda go, jeśli usuniesz swoje narzędzia: instrukcja foo = bar, a następnie, gdy pojawi się błąd / ostrzeżenie, kliknij prawym przyciskiem myszy i użyj szybkiej poprawki, aby dodać instrukcję tools.
Snicolas
1
Specjalnym przypadkiem jest SyncService, który powinien zostać wyeksportowany, ale chcesz, aby system go używał. W przypadku SyncService lub AuthenticatorService dodaj android: Permissions = "signature"
Entreco
4

Jak powiedział Jens : „Oznacza to, że inne (dowolne) aplikacje, które użytkownik ma na swoim telefonie, mogą łączyć się z Twoją Usługą i wywoływać dowolną metodę, która jest ujawniona za pośrednictwem interfejsu AIDL”.

JD.
źródło