Ho avuto rapporti da utenti con Android 8 che la mia app (che utilizza il feed back-end) non mostra il contenuto. Dopo l'indagine ho trovato la seguente eccezione che accade su Android 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)
(Ho rimosso il nome del pacchetto, l'URL e altri possibili identificatori)
Su Android 7 e inferiori tutto funziona, non imposto android:usesCleartextTraffic
nel Manifest (e impostarlo a true
non aiuta, che è comunque il valore predefinito), né uso Network Security Information. Se chiamo NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, restituisce false
per Android 8, true
per la versione precedente, usando lo stesso file apk.
Ho provato a trovare qualche menzione di questo su Google info su Android O, ma senza successo.
Secondo Configurazione della sicurezza della rete -
a partire da Android 9 (livello API 28), il supporto cleartext è disabilitato per impostazione predefinita.
Dai anche un'occhiata a - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Opzione 1 -
Creare il file 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 -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
Opzione 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>
Inoltre, come @david.s' risposta ha sottolineato android:targetSandboxVersion
può essere un problema anche -
Secondo Manifest Docs -
android:targetSandboxVersion
La sandbox di destinazione da usare per questa app. Più alto è il numero della versione di sandbox numero, maggiore è il livello di sicurezza. Il suo valore predefinito è 1; si puoi anche impostarlo a 2. Impostando questo attributo a 2 l'app passa a una sandbox SELinux diversa. Le seguenti restrizioni si applicano ad una sandbox di livello 2:
- Il valore predefinito di
usesCleartextTraffic
nella Network Security Config è false.- La condivisione di Uid non è permessa.
Così l'opzione 3 -
Se hai android:targetSandboxVersion
in <manifest>
allora riducilo a `1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
Nell'AndroidManifest ho trovato questo parametro:
android:networkSecurityConfig="@xml/network_security_config"
e @xml/network_security_config è definito in network_security_config.xml come:
<?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>
ho appena cambiato cleartextTrafficPermitted in true
Ok, ho capito questo. È dovuto al parametro Manifest android:targetSandboxVersion="2"
, che ho aggiunto perché abbiamo anche la versione Instant App - dovrebbe fare in modo che una volta che l'utente aggiorna da Instant App a app regolare, non perda i suoi dati con il trasferimento. Tuttavia, come suggerisce la vaga descrizione:
Specifica la sandbox di destinazione che questa app vuole utilizzare. Le versioni più alte di sanbox avranno livelli di sicurezza crescenti.
Il valore predefinito di questo attributo è 1.
Ovviamente aggiunge anche un nuovo livello di politica di sicurezza, almeno su Android 8.