Android 8 -käyttäjät ovat raportoineet, että sovellukseni (joka käyttää back-end-syöttöä) ei näytä sisältöä. Tutkimuksen jälkeen löysin seuraavat Poikkeus tapahtuu 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)
(Olen poistanut paketin nimen, URL-osoitteen ja muut mahdolliset tunnisteet).
Android 7:ssä ja sitä alemmissa versioissa kaikki toimii, en aseta android:usesCleartextTraffic
Manifestissa (ja sen asettaminen true
:ksi ei auta, se on oletusarvo joka tapauksessa), enkä käytä Network Security Informationia. Jos kutsun NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, se palauttaa false
Android 8:lle, true
vanhemmalle versiolle käyttäen samaa apk-tiedostoa.
Yritin löytää tästä maininnan Googlen Android O:ta koskevista tiedoista, mutta tuloksetta.
Verkkoturvakokoonpanon mukaan -
Android 9:stä alkaen (API-taso 28), selvätekstituki on poistettu käytöstä. oletusarvoisesti.
Katso myös - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Vaihtoehto 1 -
Luo tiedosto 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>
Vaihtoehto 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>
Kuten @david.s' vastaus huomautti, myös android:targetSandboxVersion
voi olla ongelma - -
Manifest Docs mukaan - -
android:targetSandboxVersion
Tämän sovelluksen käyttämä kohdehiekkalaatikko. Mitä korkeampi hiekkalaatikkoversio numero, sitä korkeampi turvallisuustaso. Sen oletusarvo on 1; voit voit myös asettaa sen arvoksi 2. Asettamalla tämän ominaisuuden arvoksi 2 sovellus siirtyy käyttämään eri SELinux-hiekkalaatikkoon. Seuraavat rajoitukset koskevat tason 2 hiekkalaatikkoa:
- Verkkoturvallisuusmäärityksen
usesCleartextTraffic
-asetuksen oletusarvo on false.- Uid-tunnusten jakaminen ei ole sallittua.
Vaihtoehto 3 -
Jos <manifestissa>
on android:targetSandboxVersion
, vähennä se arvoon 1
.
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
AndroidManifestista löysin tämän parametrin:
android:networkSecurityConfig="@xml/network_security_config"
ja @xml/network_security_config on määritelty network_security_config.xml-tiedostossa seuraavasti:
<?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>
vain muutin cleartextTrafficPermittedin arvoksi true.
Okei, olen saanut tämän selville. Se johtuu Manifest-parametrista android:targetSandboxVersion="2"
, jonka olen lisännyt, koska meillä on myös Instant App -versio - sen pitäisi varmistaa, että kun käyttäjä päivittää Instant Appista tavalliseen sovellukseen, hän ei menetä tietojaan siirron mukana. Kuten epämääräinen kuvaus kuitenkin antaa ymmärtää:
Määrittää kohdehiekkalaatikon, jota tämä sovellus haluaa käyttää. Korkeammat sandbox-versiot ovat yhä turvallisempia.
Tämän ominaisuuden oletusarvo on 1.
Se lisää ilmeisesti myös uuden tason tietoturvakäytäntöä, ainakin Android 8:ssa.