Man bija ziņojumi no lietotājiem ar operētājsistēmu Android 8, ka mana lietotne (kas izmanto back-end plūsmu) nerāda saturu. Pēc izmeklēšanas es atklāju, ka ar Android 8 notiek šāds izņēmums:
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)
(Esmu izdzēsis paketes nosaukumu, URL un citus iespējamos identifikatorus)
Android 7 un zemākās versijās viss darbojas, Manifest sistēmā nenoteicu android:usesCleartextTraffic
(un tā iestatīšana uz true
nepalīdz, tā vienalga ir noklusējuma vērtība), kā arī neizmantoju Network Security Information. Ja es izsaucu NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, tas atgriež false
Android 8, true
vecākai versijai, izmantojot to pašu apk failu.
Mēģināju atrast kādu norādi par to Google informācijā par Android O, bet nesekmīgi.
Saskaņā ar Tīkla drošības konfigurācija -
Sākot ar Android 9 (API 28. līmenis), skaidra teksta atbalsts ir atspējots. pēc noklusējuma.
Skatiet arī - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
1. iespēja -
Izveidojiet failu 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>
Variants 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>
Arī kā @david.s' atbilde norādīja android:targetSandboxVersion
var būt problēma -
Saskaņā ar Manifest Docs -
android:targetSandboxVersion
Mērķa smilšu kaste, kas jāizmanto šai lietotnei. Jo augstāka smilšu kastes versija numurs, jo augstāks drošības līmenis. Noklusējuma vērtība ir 1; jūs var iestatīt arī uz 2. Iestatot šo atribūtu uz 2, lietotne tiek pārslēgta uz lietojumprogrammu, lai citu SELinux smilšu kasti. Šādi ierobežojumi attiecas uz 2. līmeņa smilšu kastei:
- Tīkla drošības konfigurācijā noklusējuma vērtība
usesCleartextTraffic
ir false.- Uid koplietošana nav atļauta.
Tātad 3. iespēja -
Ja android:targetSandboxVersion
ir <manifest>
, tad samaziniet to līdz 1
.
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
AndroidManifest es atradu šo parametru:
android:networkSecurityConfig="@xml/network_security_config"
un @xml/network_security_config ir definēts network_security_config.xml kā:
<?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>
tikai es mainīju cleartextTrafficPermitted uz true
Labi, es to esmu sapratis. Tas ir saistīts ar Manifest parametru android:targetSandboxVersion="2"
, ko es pievienoju, jo mums ir arī Instant App versija - tam vajadzētu nodrošināt, ka, kad lietotājs atjauninās no Instant App uz parasto lietotni, viņš nezaudēs savus datus, tos pārnesot. Tomēr, kā liecina neskaidrais apraksts:
Norāda mērķa smilšu kasti, ko šī lietotne vēlas izmantot. Augstāku sanbox versiju drošības līmenis palielināsies.
Šī atribūta noklusējuma vērtība ir 1.
Acīmredzot tas arī pievieno jaunu drošības politikas līmeni, vismaz operētājsistēmā Android 8.