Ich hatte Berichte von Nutzern mit Android 8, dass meine App (die den Back-End-Feed verwendet) den Inhalt nicht anzeigt. Nach der Untersuchung fand ich folgende Ausnahme unter 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)
(Ich habe den Paketnamen, die URL und andere mögliche Bezeichner entfernt)
Unter Android 7 und niedriger funktioniert alles, ich setze weder android:usesCleartextTraffic
im Manifest (und das Setzen auf true
hilft nicht, das ist sowieso der Standardwert), noch verwende ich Network Security Information. Wenn ich NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
aufrufe, liefert es false
für Android 8, true
für ältere Versionen, unter Verwendung der gleichen apk-Datei.
Ich habe versucht, eine Erwähnung dieser auf Google Info über Android O zu finden, aber ohne Erfolg.
Gemäß Netzwerksicherheitskonfiguration -
Beginnend mit Android 9 (API Level 28) ist die Klartextunterstützung standardmäßig deaktiviert.
Schauen Sie auch unter - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Option 1 -
Erstellen der Datei 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>
Option 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>
Wie @david.s' Antwort schon sagte, kann auch android:targetSandboxVersion
ein Problem sein -
Laut Manifest Docs -
android:targetSandboxVersion
Die Ziel-Sandbox, die diese App verwenden soll. Je höher die Sandbox-Version Zahl, desto höher ist die Sicherheitsstufe. Der Standardwert ist 1; Sie Sie können ihn auch auf 2 setzen. Wenn Sie dieses Attribut auf 2 setzen, wechselt die Anwendung zu eine andere SELinux-Sandbox. Die folgenden Einschränkungen gelten für eine Sandbox der Stufe 2:
- Der Standardwert von
usesCleartextTraffic
in der Netzwerksicherheitskonfiguration ist false.- Uid-Sharing ist nicht erlaubt.
So Option 3 -
Wenn Sie android:targetSandboxVersion
in <manifest>
haben, dann reduzieren Sie es auf 1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
Im AndroidManifest habe ich diesen Parameter gefunden:
android:networkSecurityConfig="@xml/network_security_config"
und @xml/network_security_config ist in network_security_config.xml definiert 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>
ich habe gerade cleartextTrafficPermitted auf true geändert
Okay, ich habe das herausgefunden. Es liegt an dem Manifest-Parameter android:targetSandboxVersion="2"
, den ich hinzugefügt habe, weil wir auch eine Instant-App-Version haben - er sollte sicherstellen, dass der Benutzer, wenn er von der Instant-App auf die reguläre App umsteigt, seine Daten bei der Übertragung nicht verlieren wird. Aber wie die vage Beschreibung vermuten lässt:
Gibt die Ziel-Sandbox an, die diese App verwenden möchte. Höhere Sandbox-Versionen bieten ein höheres Maß an Sicherheit.
Der Standardwert für dieses Attribut ist 1.
Es fügt offensichtlich auch eine neue Stufe der Sicherheitsrichtlinie hinzu, zumindest unter Android 8.