Ik had meldingen van gebruikers met Android 8 dat mijn app (die back-end feed gebruikt) geen inhoud toont. Na onderzoek vond ik de volgende uitzondering op 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)
(Ik'heb pakketnaam, URL en andere mogelijke identifiers verwijderd)
Op Android 7 en lager werkt alles, ik stel android:usesCleartextTraffic
niet in Manifest in (en op true
zetten helpt niet, dat is toch de standaardwaarde), en ik gebruik ook geen Network Security Information. Als ik NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
aanroep, retourneert het false
voor Android 8, true
voor oudere versie, gebruikmakend van hetzelfde apk-bestand.
Ik heb geprobeerd hier iets over te vinden op Google info over Android O, maar zonder succes.
Volgens Network security configuration -
Beginnend met Android 9 (API niveau 28), is cleartext ondersteuning uitgeschakeld standaard uitgeschakeld.
Kijk ook eens op - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Optie 1 -
Maak bestand 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>
Optie 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>
Ook zoals @david.s' antwoord al aangaf android:targetSandboxVersion
kan ook een probleem zijn -.
Volgens Manifest Docs -
android:targetSandboxVersion
De beoogde sandbox voor deze app om te gebruiken. Hoe hoger het sandbox version nummer, hoe hoger het niveau van beveiliging. De standaardwaarde is 1; u kunt het ook op 2 zetten. Als u dit attribuut op 2 zet, schakelt de app naar een andere SELinux zandbak. De volgende beperkingen zijn van toepassing op een level 2 sandbox:
- De standaard waarde van
usesCleartextTraffic
in de Network Security Config is false.- Uid-sharing is niet toegestaan.
Dus Optie 3 -
Als je android:targetSandboxVersion
in <manifest>
hebt staan, verlaag deze dan naar 1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
In het AndroidManifest vond ik deze parameter:
android:networkSecurityConfig="@xml/network_security_config"
en @xml/network_security_config is gedefinieerd in network_security_config.xml als:
<?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>
alleen heb ik cleartextTrafficPermitted veranderd in true
Oké, ik heb dit uitgezocht. Het is te wijten aan de Manifest parameter android:targetSandboxVersion="2"
, die ik heb toegevoegd omdat we ook Instant App versie hebben - het zou ervoor moeten zorgen dat als de gebruiker upgradet van Instant App naar gewone app, hij zijn gegevens niet verliest met de overdracht. Maar zoals de vage beschrijving suggereert:
Specificeert het doel van de zandbak die deze app wil gebruiken. Hogere sandbox-versies zullen een hoger niveau van beveiliging hebben.
De standaard waarde van dit attribuut is 1.
Het voegt natuurlijk ook een nieuw niveau van beveiligingsbeleid toe, althans op Android 8.