12

Android N umożliwia powiązanie Twojej aktywności ze stroną Twojej aplikacji w Ustawieniach . Po prostu dodaj <intent-filter> dla android.intent.action.APPLICATION_PREFERENCES. Aplikacja Ustawienia N w Androidzie wyszuka aktywność w Twojej aplikacji, którą ma ta <intent-filter>. Jeśli znajdzie jeden z nich, doda ikonę koła zębatego do strony aplikacji w Ustawieniach, a jeśli użytkownik dotknie biegu, zostanie on przeniesiony do wyznaczonej czynności.W jaki sposób aplikacja Ustawienia może uruchomić nieeksportowaną aktywność aplikacji?

Martwiłem się o bezpieczeństwo, a więc złożone an issue, szukając zgody mogliśmy korzystać z android:permission celu umożliwienia ustawienia, aby rozpocząć naszą działalność, ale nie pozwalają inne aplikacje, aby rozpocząć naszą działalność (np WRITE_SECURE_SETTINGS).

cketti następnie wskazał, że you could just mark the activity as not exported, via android:exported="false". Ku mojemu zaskoczeniu to działa.

W jaki sposób aplikacja Ustawienia może rozpocząć działanie oznaczone jako nieeksportowane?

Z pewnością widzę, że istnieje pozwolenie, które kontroluje to. Jednak szybkie przeczytanie manifestu aplikacji (gałąź master branch, n-developer-preview-5) nie przyniosła niczego oczywistego.

Więc:

  • Czy istnieje zgoda, że ​​umożliwia aplikacja rozpocząć non-eksportowany składnik innej aplikacji? Jeśli tak, to co to jest?

  • Jeśli nie, w jaki sposób Ustawienia wyłączają tę funkcję?

+0

Odpowiedziałeś na coś podobnego tutaj: http://stackoverflow.com/questions/13892721/activity-exported-false-listed-in-activity-chooser – Shaishav

+0

@Shaishav: Podczas gdy jest na pokrewnym temacie (zabezpieczenie działań z ' '), nie odnosi się do postawionego tu pytania. – CommonsWare

Odpowiedz

7

Zgaduję, że w manifeście nie ma nic, co pozwoliłoby aplikacji na wywołanie wywożonych działań. Wierzę, że sposób, w jaki to robi, polega na ustawieniu LOCAL_PRIVILEGED_MODULE := true w pliku Android.mk dla aplikacji Ustawienia. Flaga ta da uprawnienia na poziomie systemu aplikacji i umieści je w katalogu system/priv-app/ podczas kompilacji OS.

Jeśli spojrzysz na frameworks/base/core/java/android/app/ActivityManager.java dla metody checkComponentPermission, zobaczysz, że jeśli UID jest tym z SYSTEMU, uprawnienia do komponentu są przyznawane niezależnie od wyeksportowanego ustawienia.

+0

Kupuję koncepcję opartą na UID aplikacji Ustawienia. Nie jestem w 100% przekonany, że 'checkComponentPermission()' jest miejscem, w którym dokonywane jest ustalenie, ponieważ nie oczekiwałbym, że klasa SDK będzie decydować, czy możesz rozpocząć działanie. – CommonsWare

+0

@CommonsWare Co masz na myśli - "Nie oczekiwałbym, że klasa SDK zdecyduje, czy możesz rozpocząć działalność"? Czego byś się spodziewał? – Vikram

+0

@Vikram: Spodziewałbym się, że zostanie to określone w usłudze systemowej ('ActivityManagerService'?) Lub coś podobnego do tego. Teraz możliwe jest, że używają tej samej metody 'checkComponentPermission()', która jest w SDK. – CommonsWare