Jeg har fået rapporter fra brugere med Android 8 om, at min app (der bruger back-end feed) ikke viser indholdet. Efter undersøgelse fandt jeg følgende Undtagelse sker på 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)
(Jeg har fjernet pakkenavn, URL og andre mulige identifikatorer)
På Android 7 og lavere virker alt, jeg indstiller ikke android:usesCleartextTraffic
i Manifest (og det hjælper ikke at indstille den til true
, det er alligevel standardværdien), og jeg bruger heller ikke Network Security Information. Hvis jeg kalder NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, returnerer den false
for Android 8, true
for ældre version, ved brug af samme apk-fil.
Jeg forsøgte at finde noget omtale af dette på Google info om Android O, men uden held.
I henhold til Konfiguration af netværkssikkerhed -
Fra og med Android 9 (API-niveau 28) er understøttelse af klartekst deaktiveret som standard.
Se også på - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Mulighed 1 -
Opret filen 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>
Mulighed 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>
Også som @david.s' svar påpegede android:targetSandboxVersion
kan også være et problem -
Ifølge Manifest Docs -
android:targetSandboxVersion
Den sandkasse, som denne app skal bruge. Jo højere sandkasseversionen er nummer, jo højere er sikkerhedsniveauet. Standardværdien er 1; du kan også indstille den til 2. Ved at indstille denne attribut til 2 skifter appen til en anden SELinux-sandkasse. Følgende begrænsninger gælder for en sandkasse på niveau 2:
- Standardværdien af
usesCleartextTraffic
i Network Security Config er false.- Uid-deling er ikke tilladt.
Så mulighed 3 -
Hvis du har android:targetSandboxVersion
i <manifest>
, skal du reducere den til 1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
I AndroidManifest fandt jeg denne parameter:
android:networkSecurityConfig="@xml/network_security_config"
og @xml/network_security_config er defineret i network_security_config.xml som:
<?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>
bare jeg ændrede cleartextTrafficPermitted til true
Okay, jeg har regnet det ud. Det skyldes Manifest-parameteren android:targetSandboxVersion="2"
, som jeg har tilføjet, fordi vi også har Instant App-versionen - det skulle sikre, at når brugeren opgraderer fra Instant App til almindelig app, mister han ikke sine data ved overførslen. Men som den vage beskrivelse antyder:
Angiver den mål-sandkasse, som denne app ønsker at bruge. Højere sandbox-versioner vil have stigende sikkerhedsniveauer.
Standardværdien for denne attribut er 1.
Den tilføjer naturligvis også et nyt niveau af sikkerhedspolitik, i det mindste på Android 8.