Android 8:不允许明文HTTP通信

我收到安卓8用户的报告,说我的应用程序(使用后端提要)没有显示内容。经过调查,我发现Android 8上发生了以下异常:

08-29 12:03:11.246 11285-11285/E/:[12:03:11.245,main]:异常:IOException java.io.IOException:不允许到*的明文HTTP通信
在com.android.okhttp.HttpHandler$ClearTexturelFilter.CheckUrlPermited上(HttpHandler.java:115)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
位于com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
位于com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
位于com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
位于android.os.AsyncTask$2.call(AsyncTask.java:333)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
运行(Thread.java:764)

(我已经删除了包名、URL和其他可能的标识符)

在安卓7和更低版本上,一切正常,我不在清单中设置Android:usesCleartextTraffic(并且将其设置为true没有帮助,这是默认值),也不使用网络安全信息。如果我调用NetworkSecurityPolicy.getInstance().isClearTextTrafficAllowed(),对于Android 8,它返回false,对于旧版本,它使用相同的apk文件返回true
我试图在谷歌关于Android O的信息中找到一些关于这一点的信息,但没有成功

根据网络安全配置-

从Android 9(API级别28)开始,明文支持被禁用
默认情况下

还可以看看安卓M和对明文流量的战争

来自谷歌的Codelabs解释

选项1-

首先尝试用“点击URL”;https://quot;而不是”,;http://quot

选项2-

创建文件res/xml/network\u security\u config.xml-

<?xml版本="1.0“;编码="utf-8“&燃气轮机;
<网络安全配置>
<域配置ClearTextTrafficAllowed="“真的”&燃气轮机;
<域includeSubdomains="“真的”&燃气轮机;api.example.com(待调整)&lt/域>
&lt/域配置>
&lt/网络安全配置>

AndroidManifest.xml-

<?xml版本="1.0“;编码="utf-8“&燃气轮机;
<舱单…>
<使用权限android:name="android.permission.INTERNET“/&燃气轮机;
<应用
...
android:networkSecurityConfig=&[email protected]/网络“安全配置”;
;
...
&lt/应用>
&lt/舱单>

选项3-

android:UseClearTextTraffic文档

AndroidManifest.xml-

<?xml版本="1.0“;编码="utf-8“&燃气轮机;
<舱单…>
<使用权限android:name="android.permission.INTERNET“/&燃气轮机;
<应用
...
android:UseClearTextTraffic="“真的”;
;
...
&lt/应用>
&lt/舱单>

正如@david.s的回答指出的那样,android:targetSandboxVersion也可能是一个问题-

根据舱单文件-

android:targetSandboxVersion

此应用程序要使用的目标沙盒。沙箱版本越高
数量越多,安全级别就越高。其默认值为1;你
也可以将其设置为2。将此属性设置为2会将应用程序切换为
一个不同的SELinux沙箱。以下限制适用于
二级沙箱:

  • 网络安全配置中的usesCleartextTraffic的默认值为false
  • 不允许Uid共享

So选项4-

如果您在中有android:targetSandboxVersion<舱单&gt然后将其减少到1

AndroidManifest.xml-

<?xml版本="1.0“;编码="utf-8“&燃气轮机;
<清单android:targetSandboxVersion="1“&燃气轮机;
<使用权限android:name="android.permission.INTERNET“/&燃气轮机;
...
&lt/舱单>

发表评论