Android 8的用户报告说,我的应用程序(使用后端feed)没有显示内容。经过调查,我发现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)
(我已经删除了包名称,URL和其他可能的标识符)
在Android 7和更低版本上,一切都正常工作,我没有在Manifest中设置Android:usesClearTextTraffice
(而且将其设置为true
也没有帮助,反正这是默认值),我也没有使用网络安全信息。如果调用NetworkSecurityPolicy.getInstance().IsClearTextTrafficAlibled()
,它将使用相同的apk文件,对Android 8返回false
,对较旧版本返回true
。我试图在谷歌关于Android O的信息上找到一些关于这一点的提及,但没有成功。
根据网络安全配置-
从Android 9(API级别28)开始,默认情况下禁用明文支持。
还可以查看-https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Codelabs解释-https://Codelabs.developers.google.com/Codelabs/android-network-security-config/index.html
备选方案1-
首先尝试点击“https://”而不是“http://”的URL
备选方案2-
创建文件res/xml/network_security_config.xml-
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">api.example.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>
备选方案3-
Android:使用ClearTextTraffic文档
AndroidManifest.xml-
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
正如@David.s的回答所指出的,android:targetsandboxversion
也可能是个问题-
根据舱单文件-
Android:TargetSandboxVersion
此应用程序要使用的目标沙箱。沙箱版本号越高,安全级别越高。默认值为1;也可以将其设置为2。将此属性设置为2会将应用程序切换到不同的SELinux沙箱。以下限制适用于2级沙箱:
UsesClearTextTraffic
的默认值为false.所以选项4-
如果您在
中有android:targetsandboxversion
,则将其还原为1
AndroidManifest.xml-
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
在AndroidManifest中,我找到了这个参数:
android:networkSecurityConfig="@xml/network_security_config"
并且@xml/network_security_config在network_security_config.xml中定义为:
<?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>
只是我把ClearTextTrafficPermissed更
我在Android9中遇到的问题是在webview上使用http在域上导航,下面的答案就是解决方案
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
和:
res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>