Používatelia so systémom Android 8 mi hlásili, že moja aplikácia (ktorá používa back-end feed) nezobrazuje obsah. Po vyšetrovaní som zistil, že na Androide 8 sa deje nasledujúca výnimka:
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)
(odstránil som názov balíka, URL a ďalšie možné identifikátory)
Na systéme Android 7 a nižšom všetko funguje, v Manifeste nenastavujem android:usesCleartextTraffic
(a nastavenie na true
nepomáha, to je aj tak predvolená hodnota), nepoužívam ani Network Security Information. Ak zavolám NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, vráti to false
pre Android 8, true
pre staršiu verziu, pričom použijem rovnaký súbor apk.
Snažil som sa nájsť nejakú zmienku o tom na informáciách Google o Android O, ale bez úspechu.
Podľa Konfigurácia zabezpečenia siete -
Od systému Android 9 (úroveň API 28) je podpora čistého textu vypnutá v predvolenom nastavení.
Pozrite si tiež - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Možnosť 1 -
Vytvorte súbor 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>
Možnosť 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>
Tiež ako @david.s' odpoveď poukázal android:targetSandboxVersion
môže byť tiež problém -
Podľa Manifest Docs -
android:targetSandboxVersion
Cieľový sandbox, ktorý má táto aplikácia používať. Čím vyššia verzia pieskoviska číslo, tým vyššia je úroveň zabezpečenia. Jeho predvolená hodnota je 1; môžete ju môžete nastaviť aj na hodnotu 2. Nastavením tohto atribútu na hodnotu 2 sa aplikácia prepne na iný sandbox SELinux. Nasledujúce obmedzenia sa vzťahujú na pieskovisko úrovne 2:
- Predvolená hodnota príznaku
usesCleartextTraffic
v konfigurácii zabezpečenia siete je false.- Zdieľanie Uid nie je povolené.
Takže možnosť 3 -
Ak máte android:targetSandboxVersion
v <manifest>
, potom ju znížte na 1
.
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
V AndroidManifeste som našiel tento parameter:
android:networkSecurityConfig="@xml/network_security_config"
a @xml/network_security_config je definovaný v network_security_config.xml ako:
<?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>
len som zmenil cleartextTrafficPermitted na true
Dobre, prišiel som na to. Je to spôsobené parametrom manifestu android:targetSandboxVersion="2"
, ktorý som pridal, pretože máme aj verziu Instant App - mal by zabezpečiť, aby používateľ po aktualizácii z Instant App na bežnú aplikáciu nestratil svoje údaje pri prenose. Ako však naznačuje nejasný popis:
Určuje cieľové pieskovisko, ktoré chce táto aplikácia používať. Vyššie verzie sanboxu budú mať rastúcu úroveň zabezpečenia.
Predvolená hodnota tohto atribútu je 1.
Zrejme pridáva aj novú úroveň bezpečnostnej politiky, aspoň v systéme Android 8.