Miałem raporty od użytkowników z Androidem 8, że moja aplikacja (która używa back-end feed) nie pokazuje zawartości. Po dochodzeniu znalazłem następujące Wyjątek dzieje się na Androidzie 8:
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
(I've usunął nazwę pakietu, adres URL i inne możliwe identyfikatory)
Na Androidzie 7 i niższych wszystko działa, nie ustawiam android:usesCleartextTraffic
w Manifeście (i ustawienie go na true
nie pomaga, to i tak jest wartość domyślna), nie używam też Network Security Information. Jeśli zadzwonię do NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, to zwraca false
dla Androida 8, true
dla starszej wersji, używając tego samego pliku apk.
Próbowałem znaleźć jakąś wzmiankę o tym na Google info o Androidzie O, ale bez powodzenia.
Zgodnie z Konfiguracja zabezpieczeń sieci -.
Począwszy od Androida 9 (poziom API 28), obsługa cleartextów jest wyłączona domyślnie.
Zajrzyj również na - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Opcja 1 -
Utwórz plik res/xml/network_security_config.xml -.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">domain.com (to be adjusted)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml - {{47745824}}
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
Opcja 2 -
android:usesCleartextTraffic Doc
AndroidManifest.xml -.
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Również jak @david.s' odpowiedź wskazał android:targetSandboxVersion
może być problemem zbyt -.
Zgodnie z Manifest Docs -
android:targetSandboxVersion
.Docelowa piaskownica dla tej aplikacji do użycia. Im wyższa wersja piaskownicy liczba, tym wyższy poziom bezpieczeństwa. Jego domyślna wartość to 1; możesz można również ustawić na 2. Ustawienie tego atrybutu na 2 przełącza aplikację do inną piaskownicę SELinux. Następujące ograniczenia mają zastosowanie do piaskownicy poziomu 2:
- Domyślną wartością
usesCleartextTraffic
w Network Security Config jest false.- Współdzielenie Uid nie jest dozwolone.
Opcja 3 -
Jeśli masz android:targetSandboxVersion
w <manifest>
to zmniejsz go do 1
.
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
W AndroidManifest znalazłem ten parametr:
android:networkSecurityConfig="@xml/network_security_config"
i @xml/network_security_config jest zdefiniowany w network_security_config.xml jako:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
Zmieniłem tylko cleartextTrafficPermitted na true
Ok, rozgryzłem to. Jest to spowodowane parametrem Manifestu android:targetSandboxVersion="2"
, który dodałem, ponieważ mamy również wersję Instant App - powinno to upewnić się, że gdy użytkownik aktualizuje się z Instant App do zwykłej aplikacji, nie straci swoich danych z transferem. Jednak jak sugeruje niejasny opis:
Określa docelowy sandbox, z którego chce korzystać ta aplikacja. Wyższe wersje sandboxów będą miały coraz wyższy poziom bezpieczeństwa.
Domyślną wartością tego atrybutu jest 1.
Oczywiście dodaje on również nowy poziom polityki bezpieczeństwa, przynajmniej na Androidzie 8.